POJ 1065 Wooden Sticks
题意: 有n 个木头,知道了每个木头的长和宽,现在要用机器加工这些木头,加工的时候,如果加工过一个木头,再加工另一个木头的时候,如果这个木头的长和宽都大于或等于这个木头就不需要加热的时间,否则需要 1 分钟的加热时间,问加工完这些木头最少需要多少加热时间。
分析: 贪心。 加工完一个木头后,尽量找长和宽都大于等于它的并且尽可能和它大小差不多的木头加工。
可以先对长排序,然后对宽排序。
#include<cstdio> #include<algorithm> using namespace std; struct node { int len,wi; bool flag; }q[5005]; bool cmp(node a,node b) { if(a.len<b.len) return true; if(a.len==b.len&&a.wi<b.wi) return true; return false; } int main() { int tot,t,n,i,j,w; scanf("%d",&t); while(t--) { scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d%d",&q[i].len,&q[i].wi); q[i].flag=false; } sort(q,q+n,cmp); tot=0; for(i=0;i<n;i++) { if(!q[i].flag) { tot++; w=q[i].wi; for(j=i+1;j<n;j++) if(q[j].wi>=w&&(!q[j].flag)) { q[j].flag=true; w=q[j].wi; } } } printf("%d\n",tot); } return 0; }