您的位置:首页 > 其它

hdu 1051 Wooden Sticks

2013-02-06 10:33 281 查看
对木棍的长度和重量进行排序,以长度为首要考虑。排序完后的不一定都是下一根木棍重量和长度都大于前一根的。于是,我们对排序后的数组进行多次扫描,将可以在一次建立时间内完成的进行标记,设置一个外部变量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