算法题-勇者斗恶龙

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38603541/article/details/86690692

【题目描述】你的网络里有一条 n 个头的恶龙,你希望雇一些骑士把它杀死(即砍掉所有头)。村里有 m 个骑士可以雇佣,一个能力值为 x 的骑士可以砍掉恶龙一个直径不超过 x 的头,且需要支付 x 个金币。如何雇佣骑士才能砍掉恶龙所有头,且需要支付的金币最少?注意,一个骑士只能砍一个头(且不能被雇佣两次)。
【输入格式】输入包含多组数据。每组数据的第一行为正整数 n 和 m (1 <= n,m <= 20000);以下 n 行每行为一个整数,即恶龙每个头的直径;以下 m 行每行为一个整数,即每个骑士的能力。输入结束标志为n = m = 0。
【输出格式】对于每组数据,输出最少花费。如果无解,输出“Loowater is doomed!”。
【样例输入】
2 3
5
4
7
8
4
2 1
5
5
10
0 0
【样例输入】
11
Loowater is doomed!
【分析】
能力强的骑士开价高是合理的,但如果被你派去砍一个很弱的头,就是浪费人才了。因此可以把雇佣来的骑士按照能力大小从小到大排序,所有头按照直径从小到大排序,一个一个砍就可以了。当然,不能砍掉“当前需要砍的头”的骑士就不要雇佣了。

【源代码】

#include<cstdio>
#include<algorithm>//因为用到了sort 
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);
		
		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!");
		else printf("%d\n",cost);
	}
	
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/qq_38603541/article/details/86690692