1. 程式人生 > >UVA11292 The Dragon of Loowater

UVA11292 The Dragon of Loowater

題意: 國王要殺惡龍, 需要僱傭騎士。 每個騎士只能殺一條龍。 當騎士身高 不小於 龍頭時, 騎士可以砍下龍頭。 僱傭騎士需要錢, 錢就等於他的身高。 如果騎士能成功砍下所有的龍頭, 則輸出僱傭總費最少的數值, 否則輸出那句鳥語。

思路: 排序+貪心。 先把龍頭跟騎士身高各自從小到大排序, 然後從頭到尾比較。 若能砍下則僱傭, 否則用下一個騎士。 直到龍頭砍完, 或者騎士用完。

#include<cstdio>
#include<algorithm>
#include<cstring>
#define M(a) memset(a, 0, sizeof(a))
using namespace std; 
const int maxn = 20000 + 10;
int head[maxn], knight[maxn];
int main() {
	int n, m;
	while(scanf("%d%d", &n, &m) == 2 && n && m) {
		long long ans = 0;
		M(head); M(knight);
		int phead = 0, pknight = 0;
		for(int i = 0; i < n; i++) scanf("%d", &head[i]);
		for(int i = 0; i < m; i++) scanf("%d", &knight[i]);
		sort(head, head + n); sort(knight, knight + m);
		while(phead < n && pknight < m) {
			if(head[phead] <= knight[pknight]) {
				ans += knight[pknight++];
				phead++;
			}
			else pknight++;
		}
		if(phead < n) printf("Loowater is doomed!\n");
		else printf("%lld\n", ans);
	}
	return 0;
}