题目大意:
有头龙有n个头,你雇佣骑士去砍掉这些头,一共有m个骑士,一个骑士对应有一个能力值x,同时x也代表你雇佣他的费用,只有当能力值大于或等于龙头的大小时可以砍掉这个头,你现在需要计算的是杀死这头龙(砍掉所有龙头)最小的雇佣费用。
输入:
第一行两个整数,n,m当n,m都为零时结束
接下来n行为头的大小、在接下来m行是m个骑士的能力值x。
输出:
每组数据输出最小的雇佣费用。
分析:
这道题目属于贪心,我们应该尽量选择能力值与头大小相近(大于等于)的骑士去砍这个头,这样所需要的费用是最少的,所以可以按骑士的能力值排序(小到大),再将龙头大小排序,然后循环判断是否i骑士可以杀死j龙头,如果可以,则雇佣该骑士。
分类:简单贪心
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define maxlen 20010 using namespace std; int n,m; int head[maxlen],ability[maxlen]; int main () { while(scanf("%d%d",&n,&m)!=EOF) { if(n==0&&m==0) break; for(int i=0;i<n;++i) scanf("%d",&head[i]); for(int i=0;i<m;++i) scanf("%d",&ability[i]); sort(head,head+n); sort(ability,ability+m); int j=0,ans=0; for(int i=0;i<m;++i) { if(ability[i]>=head[j]) { ans+=ability[i]; j++; } if(j==n) break; } if(j<n) printf("Loowater is doomed! "); else printf("%d ",ans); } }