题意:
木棍有长和宽,若一个木棍的长宽都大于另一个木棍长宽,就不需要耗费加工的时间。
输出 木棍的长和宽,问最小的加工时间。
分析:
毫无疑问,加工的顺序应从大到小。先对长排序(从小到大),相等的按宽度排序。这样就固定了长度,对于宽度,我们就要筛选了。为了避免重复,定义一个数组来标记,就可以了,实际是:每次筛选最出最多且符合条件的木棍。
只要符合要求每次都标记,这样每次能够筛选符合条件的木棍了。一个小小的贪心。
代码如下:
#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; }