题意:有n个头的恶龙,需要杀掉它。现在有m个骑士可以雇佣,每个能力值为x的骑士可以砍掉一个直径不超过x的龙头,且需要支付x金币。现在让你求出将恶龙杀掉所需要的最少支付金币的数量,如果不能杀掉输出“Loowater is doomed!”。
思路:排序之后直接贪心。每次用能力值最少去杀直径最小的龙头(前提可以杀掉),直到杀完或者杀不掉为止。
#include<stdio.h> #include<algorithm> bool cmp(int x,int y) { return x<y;//降序排列 } //直接排序后贪心每次用值最小的骑士去砍龙的头直到全部砍完或者没有可以砍得为止 using namespace std; int main() { int n,m,i,j; int dragon[20000+10],people[100000+10];//龙头直径和骑士的能力值 while(scanf("%d%d",&n,&m)) { if(n==0&&m==0) break; int ans=0,count=0;//count统计已经砍掉了几个头 for(i=0;i<n;i++) scanf("%d",&dragon[i]); for(i=0;i<m;i++) scanf("%d",&people[i]); if(n>m) printf("Loowater is doomed!\n"); else { j=0; sort(dragon,dragon+n,cmp); sort(people,people+m,cmp); j=0; for(i=0;i<m;i++)//枚举每个骑士 { if(dragon[j]<=people[i]) { count++; ans+=people[i]; j++; } if(count==n) break; } if(count!=n) printf("Loowater is doomed!\n"); else printf("%d\n",ans); } } return 0; }