题意:
木棍有长和宽,若一个木棍的长宽都大于另一个木棍长宽,就不需要耗费加工的时间。
输出 木棍的长和宽,问最小的加工时间。
分析:
毫无疑问,加工的顺序应从大到小。先对长排序(从小到大),相等的按宽度排序。这样就固定了长度,对于宽度,我们就要筛选了。为了避免重复,定义一个数组来标记,就可以了,实际是:每次筛选最出最多且符合条件的木棍。
只要符合要求每次都标记,这样每次能够筛选符合条件的木棍了。一个小小的贪心。
代码如下:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct node{
int l,w;
}edge[5005];
bool cmp(node a,node b)
{
if(a.l==b.l) return a.w<b.w;
return a.l<b.l;
}
int main()
{
int t,n,max,sum;
int used[5005];
cin>>t;
while(t--)
{
cin>>n;
sum=0;
for(int i=0;i<n;i++)
cin>>edge[i].l>>edge[i].w;
sort(edge,edge+n,cmp);
memset(used,0,sizeof(used));
for(int i=0;i<n;i++)
{
if(!used[i])
{
max=edge[i].w;
sum++;
used[i]=1;
for(int j=i+1;j<n;j++)
if(!used[j]&&edge[j].w>=max)
{
used[j]=1;
max=edge[j].w;
}
}
}
cout<<sum<<endl;
}
return 0;
}