您的位置:首页 > 其它

nyoj 236 心急的C小加

2015-07-24 16:31 232 查看

心急的C小加

时间限制:1000 ms | 内存限制:65535 KB

难度:4

描述
C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的时间,如果第i+1个木棒的重量和长度都大于等于第i个处理的木棒,那么将不会耗费时间,否则需要消耗一个单位的时间。因为急着去约会,C小加想在最短的时间内把木棒处理完,你能告诉他应该怎样做吗?

输入第一行是一个整数T(1<T<1500),表示输入数据一共有T组。

每组测试数据的第一行是一个整数N(1<=N<=5000),表示有N个木棒。接下来的一行分别输入N个木棒的L,W(0 < L ,W <= 10000),用一个空格隔开,分别表示木棒的长度和质量。输出处理这些木棒的最短时间。样例输入
3
5
4 9 5 2 2 1 3 5 1 4
3
2 2 1 1 2 2
3
1 3 2 2 3 1

样例输出
2
1
3

来源
POJ改编

//核心:对于这么多木头来说,要想最省时间 ,那就需要把它们分为几坨,没一坨的木头开一次机器;

//先将木头们按照长的大小排序,如果长相等的话,那么就按照重量大小排序 ,然后再遍历,遍历的开始让时间自增一个,

//利用双重循环遍历,遇到符合要求的木棍就自动分为一坨,然后将此木棍进行0标记,下次遍历时,遇到0就跳过

#include<stdio.h>

#include<algorithm>

#include<string.h>

using namespace std;

struct mb{//定义一个结构体,定义长和宽

int l,w;

}s[10001];//s是结构体名称

int cmp(mb x,mb y)

{

if(x.l<y.l)

return y.l-x.l;

if(x.l==y.l && x.w<y.w)

return y.w-x.w;

return 0;//如果都不符合,就返回0

}

int main()

{

int m;

scanf("%d",&m);

while(m--)

{

int n,i,count=0,j,t;

memset(s,0,sizeof(s));//数组清零

scanf("%d",&n);

for(i=0;i<n;i++)

scanf("%d %d",&s[i].l,&s[i].w);

sort(s,s+n,cmp);//按照先按长排序,然后如果长度相等的话,就按照重量排序

for(i=0;i<n;i++)

{

if(s[i].w!=0) //如果不为零的话就继续判断

{

t=s[i].w;

count++;//凡是不为零的,一定是开始的最小的木头,所以开启一个时间

for(j=i+1;j<n;j++)

{

if(s[j].w>=t)

{

t=s[j].w;

s[j].w=0;//如果符合条件的话,就把这个东西的重量设为0,继续往后遍历的话,遇到零就跳过

}

}

}

}

printf("%d\n",count);

}

return 0;

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