题目链接:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=456&page=show_problem&problem=2267
//分析:首先可以肯定一定选用能力值最小且能干掉最小的恶龙的骑士(为什么?)
//然后从小到大一个一个来。。
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 20000 + 5;
int A[maxn], B[maxn];
int main()
{
int n, m;
while (scanf("%d%d", &n, &m)==2 && n && m) {
for (int i = 0; i < n; i++) scanf("%d", &A[i]);
for (int i = 0; i < m; i++) scanf("%d", &B[i]);
sort(A, A + n);
sort(B, B + m);
//for (int i = 0; i<n; printf("%d", A[i]), i++);
//for (int i = 0; i<m; printf("%d", B[i]), i++);
int cur = 0; //当前需要砍掉的头的编号
int cost = 0; //当前总费用
for (int i = 0; i < m; i++)
if (B[i] >= A[cur]) {
cost += B[i]; //雇佣该骑士
if (++cur == n) break; //如果头已经砍完,及时退出循环
}
if (cur < n) printf("Loowater is doomed!\n");
else printf("%d\n", cost);
}
return 0;
}