hdu 1051 Wooden Sticks

对木棍的长度和重量进行排序,以长度为首要考虑。排序完后的不一定都是下一根木棍重量和长度都大于前一根的。于是,我们对排序后的数组进行多次扫描,将可以在一次建立时间内完成的进行标记,设置一个外部变量number来计数已扫描的元素的数量。

例子:

5

4 9  5 2 2 1  3 5  1 4

排序完后:

1 4  2 1 3 5 4 9 5 2

然后进行第一次扫描:使用mark[]数组进行标记,mark[]初始化为0,红色为第一次描过的。

Stiks: (1 4)  (2 1)  (3 5)  (4 9)  (5 2)

Mark:   1       0      1       1      0

这时的setuptime为建立第一套木棍所要的时间,即1,此时已扫描元素数number为3

接着进行第二次扫描,蓝色为第二次扫描过的结果。

Stiks: (1 4)  (2 1)  (3 5)  (4 9)  (5 2)

Mark:   1       1       1       1       1

这时的setuptime为建立第二套木棍所要的时间,即2,此时已扫描元素数number为5


AC代码:

#include<iostream>
#include<stdlib.h>
#include<algorithm>
using namespace std;
#define NUM 5005
struct sticks
{
	int length;
	int weight;
}stick[NUM];

int cmp(const void *a, const void *b)
{
	struct sticks *x=(struct sticks*)a;
	struct sticks *y=(struct sticks*)b;
	if(x->length==y->length)
		return x->weight - y->weight;
	return x->length - y->length;
}

bool comp(sticks a, sticks b)
{
	if(a.length == b.length)
		return a.weight < b.weight;
	return a.length < b.length;
}
int main()
{
	int cases,n,i,res,number,mark[NUM];
	cin>>cases;
	while(cases--){
		cin>>n;
		for(i=0;i<n;++i)
			cin>>stick[i].length>>stick[i].weight;
		sort(stick,stick+n,comp);
		number=0;res=0;
		int index;//满足递增条件的上一个元素
		//qsort(stick,n,sizeof(stick[0]),cmp);
		memset(mark,0,sizeof(mark));
		while(number!=n){
			//qsort(stick+index-1,n-index+1,sizeof(stick[0]),cmp);
			for(i=0;i<n;i++){
				if(!mark[i])//找到未遍历的第一个,设为index
				{
					index=i;
					res++;
					break;
				}
			}
			for(i=0;i<n;i++){//此次遍历将找出满足递增条件的元素,进行mark
				if(!mark[i]&&stick[index].length<=stick[i].length&&stick[index].weight<=stick[i].weight){
					mark[i]=1;
					number++;
					index=i;
				}
					
			}

		}
		cout<<res<<endl;
	}
	return 0;
}



你可能感兴趣的:(hdu 1051 Wooden Sticks)