标签:
http://acm.hdu.edu.cn/showproblem.php?pid=4415
2 3 5 4 1 5 1 7 7 2 1 2 2 4 0
Case 1: 3 4 Case 2: 0 0
/** hdu4415 贪心 我考虑少了,就不说什么了…… http://m.blog.csdn.net/blog/HELLO_THERE/8016365 */ #include <stdio.h> #include <string.h> #include <algorithm> #include <iostream> using namespace std; const int maxn=100005; int a[maxn],b[maxn],temp[maxn]; int n,m; int main() { int T,tt=0; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); int k1=0,k2=0,sword=0; for(int i=0;i<n;i++) { int x,y; scanf("%d%d",&x,&y); y==0?(b[k2++]=x):(a[k1++]=x); sword+=y; } sort(a,a+k1); sort(b,b+k2); int cost1=0,num1=0; for(int i=0;i<k2;i++) { if(m-cost1>=b[i]) { cost1+=b[i]; num1++; } else break; } int num2=0,cost2=0; if(m>=a[0]) { if(sword>=n-1) { if(num1<n) { num1=n; cost1=a[0]; } else if(num1==n&&cost1>a[0]) { cost1=a[0]; } printf("Case %d: %d %d\n",++tt,num1,cost1); continue; } int k=n-1-sword; int x=1,y=0,i=0; a[k1]=b[k2]=1000000000; while(i<k) { if(a[x]<b[y]) temp[i]=a[x++]; else temp[i]=b[y++]; i++; } i=0; num2=1+sword; cost2=a[0]; while(i<k&&cost2<=m) { if(num2==n) break; if(m-cost2>=temp[i]) { cost2+=temp[i++]; num2++; } else break; } } if(num2>num1) { num1=num2; cost1=cost2; } else if(num2==num1&&cost2<cost1) { cost1=cost2; } printf("Case %d: %d %d\n",++tt,num1,cost1); } return 0; }
标签:
原文地址:http://blog.csdn.net/lvshubao1314/article/details/44875585