题意是处理一批木棍,如果当前处理的木棍长度和重量均大于前一根木棍的长度和重量,则处理当前木棍花费为 0,否则花费为 1。
用结构体存储木棍信息,将木棍按照长度从小到大排序,若长度相等则按照重量从小到大排序,在序列中找到比当前所处理的木棍长度和重量均大于且未处理的木棍再进行处理,若没有满足要求的木棍了,则再次从头开始处理未处理过的木棍,直到所有的木棍处理完毕。
代码如下:
1 #include <bits/stdc++.h> 2 using namespace std; 3 struct stick 4 { 5 int l,w,num; 6 }p[5050]; 7 bool cmp(stick a,stick b) 8 { 9 return a.l!=b.l?a.l<b.l:a.w<b.w; 10 } 11 int main() 12 { 13 int t,n,ans,sum,el,ew; 14 scanf("%d",&t); 15 while(t--) 16 { 17 scanf("%d",&n); 18 for(int i = 0; i < n; ++i) 19 { 20 scanf("%d%d",&p[i].l,&p[i].w); 21 p[i].num = 1; 22 } 23 sort(p,p+n,cmp); 24 ans = sum = 0; 25 while(sum<n) 26 { 27 el = ew = 0; 28 for(int i = 0; i < n; ++i) 29 if(p[i].num&&p[i].l>=el&&p[i].w>=ew) 30 { 31 p[i].num = 0; 32 el = p[i].l; 33 ew = p[i].w; 34 ++sum; 35 } 36 ++ans; 37 } 38 printf("%d ",ans); 39 } 40 return 0; 41 }