标签:
Output
题目要求的首先是杀人最多,其次是消耗耐久度最少。
解题思路:
贪心;
如果能杀有剑的:
先杀一个有剑的,有剑都能被杀死了;
拿到所有剑后,剑的数量是固定的,那么用剑杀死的人数也是固定的,杀谁都一样;
既然用剑杀谁都一样,那么不用剑就杀耗耐久最小的;
所以按耗耐久由小到大排序,一个个杀过去到杀不动为止。
如果这里面有有剑的怎么办呢? 没什么关系,他自己被耗耐久杀死了,那原本杀他的剑可以杀别人,用剑杀的人数都固定了;
如果这么面没有有剑的怎么办呢?先杀有剑的耗耐久最小的咯;
如果不能杀有剑的:
还是按耐久由小到大排序,一个个杀过去到杀不动为止。
综上:
如果能杀有剑,那把有剑的耗耐久最小的杀掉,答案要加上剑的数量
如果有剑的都不能杀,就不杀咯:
剩余耐久肯定是依次杀耗耐久最小的,注意第一个杀的有剑的可能里面,那就要跳过;
1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 #define N 100010 5 struct enemy{int a,b;}t[N]; 6 bool cmp(enemy x,enemy y){ return x.a<y.a;} 7 int main(){ 8 int T,n,m,cas=1; 9 scanf("%d",&T); 10 while(T--){ 11 int i,cost=0,num=0,k=-1; 12 scanf("%d%d",&n,&m); 13 for(i=0;i<n;i++) scanf("%d%d",&t[i].a,&t[i].b); 14 sort(t,t+n,cmp); 15 for(i=0;i<n;i++)if(t[i].b) break;//找cost_min,b!=0的人 16 if(t[i].a<=m){ 17 cost+=t[k=i].a; 18 for(num++,i=0;i<n;i++) num+=t[i].b;//死一个有剑,有剑的全死 ,剑全拿上,剑杀人数固定了 19 } if(num>=n){printf("Case %d: %d %d\n",cas++,n,cost); continue;} 20 for(i=0;i<n&&t[i].a+cost<=m&&num!=n;i++)if(i!=k)cost+=t[i].a,num++; 21 printf("Case %d: %d %d\n",cas++,num,cost); 22 }return 0; 23 }
标签:
原文地址:http://www.cnblogs.com/nicetomeetu/p/5159157.html