Description
有一些木材和一台机器。机器每次加工一根木材需要的时间是1,但是当加工木材的长度和宽度都小于等于前一根木材的时候,不需要时间。求最少需要多少时间加工完所有的木材
Input
第一行为数据组数t,每组用例第一行为木材数量n,然后是每根木材的长度和宽度
Output
对于每组用例,输出最短加工时间
Sample Input
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
Sample Output
2
1
3
Solution
由于切一根最长最宽的就可以不切比它短和窄的,反过来就是切一根最短最细的就不用切比它长和宽的,所以将木材升序排之后,从最短的开始切,用标记数组表示是否切此根木材,每切一根就把比它长和宽的标记,最后记录没被标记的木材即为需要切的木材数量
Code
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 5050
struct node
{
int len,wid;
}wood[maxn];
int cmp(node a,node b)
{
if(a.len==b.len)
return a.wid<b.wid;
return a.len<b.len;
}
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d%d",&wood[i].len,&wood[i].wid);
sort(wood,wood+n,cmp);//对木材排序
bool flag[maxn];//标记数组,0为切,1为不切
memset(flag,false,sizeof(flag));//初始化所有木材都切
for(int i=0;i<n;i++)
{
if(flag[i])//已经不用切了
continue;
int temp=i;//切这个木材
for(int j=i+1;j<n;j++)//比被切的长和宽就不切了
if(!flag[j]&&wood[j].len>=wood[temp].len&&wood[j].wid>=wood[temp].wid)
{
flag[j]=1;
temp=j;
}
}
int ans=0;
for(int i=0;i<n;i++)
if(!flag[i])
ans++;
printf("%d\n",ans);
}
return 0;
}