hdu 1051/zoj 1025 贪心问题
杭电:http://acm.hdu.edu.cn/showproblem.php?pid=1051
浙大:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1025
题意梗概:给n个长l重w的木棒,要用机器加工,只不过在安木棒的时候第一个要用一秒,之后的只有在长度不长于之前的并且重量不重于之前的木棒才不消耗时间,否则要再花一秒,求加工完这些木棒用的最短时间。例子:给5个木棒,长重分别是:(4,9), (5,2), (2,1), (3,5), (1,4),所以有用时最少是2秒:[(4,9), (3,5), (1,4)],[(5,2) ,(2,1)].
解决方法就是贪心算法,先按照长度从小到大排序,然后开始分群,从第一个开始看后面的是不是重量都小于等于它,如果是,就把它从这个队列里剔除,然后用这个元素与下一个元素比较,直到所有合格的都被剔除,然后让剩下的长度最小的再筛选分群,直到最后队列没有元素,这时分成了多少个群就要用多少秒(实际上就是用两个for循环,在选定这个群的开始元素的时候就计数就行,最后输出)。
现在贴上AC代码:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn = 5005; int mark[maxn]; struct node { int l,w; }p[maxn]; bool cmp(node a,node b) { if(a.l!=b.l)return a.l<b.l; return a.w<b.w; } int main() { int t; scanf("%d",&t); while(t--) { int n; scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d%d",&p[i].l,&p[i].w); sort(p,p+n,cmp); memset(mark,0,sizeof(mark)); int g; int sum=0; for(int i=0;i<n;i++) { if(mark[i])continue; sum++; g=i; for(int j=0;j<n;j++) { if(mark[j])continue; if(p[g].l<=p[j].l&&p[g].w<=p[j].w) { mark[j]=1; g=j; } } } printf("%d\n",sum); } return 0; }

浙公网安备 33010602011771号