勇者斗恶龙(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 } 

 

posted on 2020-03-10 22:31  恒晨  阅读(376)  评论(0编辑  收藏  举报

导航