您的位置:首页 > 其它

HDOJ贪心训练1006Wooden Sticksd

2018-02-11 10:41 239 查看
题目大意:
  给出n根木棍包括长度和重量,然后求出制作这些木棍的最短时间,可在前一个木棍的基础上制作下一个木棍。建立一个木棍的时间是一分钟,如果接下来木棍的长度和重量都大于上一个木棍,可以不用建立,直接使用,即不花费的时间,如果不符合要求,则需要重新建立木棍,直到所有木棍建立完毕。输出建立木棍的最小时间。
题目思路:
     向别的贪心一样肯定是需要排序的,对长度排序,长度相同的按质量从小到大进行排序
    从排序后的第一根木棒开始,之后可以把所有重量比它小的木棒给加工了(因为长度已经排过序了)
     用一个数组b
来标记是否使用处理过这根小木棍了
   这题目跟上一题 最小拦截系统只有一点区别 就是最少拦截系统每次保存各个系统可以处理的最高高度
  而这一题 只有一个x 用来保存 当前的可以处理的木棍的重量,后面要处理的必须比前面要重
下面给出源码#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define N 5005
int b
={0};
struct node
{
int len;
int wei;
}a
;
int cmp(node node1,node node2)
{
if(node1.len!=node2.len) return node1.len<node2.len;
return node1.wei<=node2.wei;
}
int main()
{
int T;
cin>>T;
int n;
while(T--)
{
memset(b,0,sizeof(b));
int sum=0;//用来计数
cin>>n;
int x;//用来表示当前机器正在处理的木头重量
for(int i=1;i<=n;i++)
scanf("%d %d",&a[i].len,&a[i].wei);
sort(a+1,a+n,cmp);
for(int i=1;i<=n;i++)
{
if(b[i]==0)//第i根木头是否处理过
{
x=a[i].wei;
for(int j=i+1;j<=n;j++)
{
if(a[j].wei>=x&&b[j]==0)
{
x=a[j].wei;
b[j]=1;
}
}

sum++;
}

}
cout<<sum<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  贪心