题目链接:uva 11292 - Dragon of Loowater
题目大意:王国里有n头恶龙,m个勇士,每个勇士有不同的能量值l[i], 以击杀恶龙头直径d[j]小于l[i]的恶龙。雇佣能量值为l[i]的勇士需要l[i]的金钱,每个勇士只能被租用一次,问说如何租用勇士击杀恶龙所用的金钱最小。
解题思路:虽然大白上讲的很清楚,但还是自己写下题解加深印象吧。
为了使得金钱的总额最小,那么就要雇佣能量值小得去击杀恶龙,但是又必须保证能将恶龙杀死,所以对于每个恶龙来说,需要租用能量值尽量小且大于恶龙头的直径的勇士,并且没有被租用过。
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 20005;
int n, m, d[N], l[N];
void init() {
for (int i = 0; i < n; i++)
scanf("%d", &d[i]);
sort(d, d + n);
for (int i = 0; i < m; i++)
scanf("%d", &l[i]);
sort(l, l + m);
}
bool judge() {
int i, j, ans = 0;
for (i = j = 0; i < n && j < m; j++) {
if (d[i] <= l[j]) {
i++, ans += l[j];
}
}
if (i < n) return true;
printf("%d\n", ans);
return false;
}
int main () {
while (scanf("%d%d", &n, &m), n + m) {
init();
if (judge()) printf("Loowater is doomed!\n");
}
return 0;
}