Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

第一次贪心 解题报告

Posted by 19871026 at 2009-08-05 15:11:24 on Problem 1065
首先对棍子按长度从小到大排序,在长度相等的情况下再按重量由小到

大对棍子排序 

然后从第一跟棍子(长度最小,重量在同长度中最小)开始,

如果该棍子没被使用过 

依次考察后面的没被使用的棍子,如果重量大于等于它的重量,长度大于等于它的长度,则将两跟棍子安排在一个序列中,并将加入序列的棍子置已使用标志。

直到所有棍子都使用完,则序列数即为所需的最小准备时间

#include <iostream>
using namespace std;
int total,n;
int w[5001],l[5001];
int mark[5001];// 标记数组

void sort(int *l,int *w)
{
	int i,j,temp;
	for(i=0;i<n-1;i++)//冒泡排序
	{
		for(j=0;j<n-i-1;j++)
		{
			if(l[j]>l[j+1])
			{
				temp=l[j];
				l[j]=l[j+1];
				l[j+1]=temp;

				temp=w[j];
				w[j]=w[j+1];
				w[j+1]=temp;
			}
			if(l[j]==l[j+1]&&w[j]>w[j+1])//如果长度相等,按质量从小到大排序
			{
				temp=w[j];
				w[j]=w[j+1];
				w[j+1]=temp;
			}
		}
	}
}

void tanxin()
{
	int i,j,temp;
	sort(l,w);
	memset(mark,0,sizeof(mark));
	total=0;
	for(i=0;i<n;i++)
		if(mark[i]==0)
		{
			temp=w[i];
			for(j=i+1;j<n;j++)
			{
				if(w[j]>=temp&&mark[j]==0)
				{
					temp=w[j];
					mark[j]=1;
				}
			}
			total++;
		}
	cout<<total<<endl;
}

int main()
{
	int i,test;
	cin>>test;
	while (test--)
	{
		cin>>n;
		for(i=0;i<n;i++)
			cin>>l[i]>>w[i];
		tanxin();
	}
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator