当前位置: 代码迷 >> 综合 >> 算法题-勇者斗恶龙
  详细解决方案

算法题-勇者斗恶龙

热度:39   发布时间:2023-12-23 19:51:57.0

【题目描述】你的网络里有一条 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;
}