题目:
你的王国里有一条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!
把骑士按照能力从小到大排序,头按照直径从小到大排序
1 #include <bits/stdc++.h>
2 using namespace std;
3 const int MAXN=20000+20;
4 int a[MAXN],b[MAXN];
5 int main(){
6 int n,m;
7 while(scanf("%d %d",&n,&m)==2&&n&&m){
8 for(int i=0;i<n;i++) scanf("%d",&a[i]);
9 for(int j=0;j<m;j++) scanf("%d",&b[j]);
10 sort(a,a+n);
11 sort(b,b+m);
12 int cur=0; //当前需要砍头的编号
13 int cost=0; //当前总费用
14 for(int i=0;i<m;i++)
15 if(b[i]>=a[cur]){ //雇佣该骑士
16 cost+=b[i];
17 if(cur++==n) break; //如果头以及砍完,及时退出
18 }
19 if(cur<n) printf("Loowater is doomed!\n");
20 else printf("%d\n",cost);
21 }
22 return 0;
23 }