勇者斗恶龙(The Dragon of Loowater,UVa 11292 )
题目: 你的王国里有一条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 }