题目大意:每次加工一部分木头需要准备时间1min,当下一块木头长和重都大于当前这块是不需要准备,对于一堆木头,求最短加工时间。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct
{
int l;
int w;
int k;//标记是否已经使用
}wood;
wood f[5010];
int cmp(const void*a,const void*b)//按长和重先排序
{
if((*(wood*)a).l==(*(wood*)b).l)
return (*(wood*)a).w-(*(wood*)b).w;
else
return (*(wood*)a).l-(*(wood*)b).l;
}
int main()
{
int t,n,i,num,total,temp_l,temp_w;
scanf("%d",&t);
while(t--)
{
memset(f,0,sizeof(f));
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d %d",&f[i].l,&f[i].w);
}
qsort(f,n,sizeof(f[0]),cmp);
num=total=0;
while(total!=n)//所有木头加工完毕作为退出条件
{
num++;
for(i=0;i<n;i++)//寻找需要准备的第一块木头
{
if(f[i].k==0)
{
temp_l=f[i].l;
temp_w=f[i].w;
total++;
f[i].k=1;
break;
}
}
for(;i<n;i++)//寻找未加工且满足条件的木头
{
if(f[i].k==1)
continue;
else
{
if(f[i].l>=temp_l&&f[i].w>=temp_w)
{
temp_l=f[i].l;
temp_w=f[i].w;
total++;
f[i].k=1;
}
}
}
}
printf("%d\n",num);
}
return 0;
}