关闭

算法竞赛入门经典例题-勇者斗恶龙

421人阅读 评论(0) 收藏 举报
分类:
   最近学习算法竞赛入门经典-训练指南,于是在刷题的同时记录到博客上,以便加深印象,更好的记忆。

例题1.勇者斗恶龙
 你的王国里有一条n个头的恶龙,你希望雇佣一些骑士把它杀死(也就是砍掉所有的头)。村里有m个骑士可以雇佣,一个能力值为 x 的骑士可以砍掉恶龙一个直径不超过 x 的头,且需要支付 x 个金币。如何雇佣骑士才能砍掉恶龙所有的头,并且支付最小的金币?注意,一个骑士只能砍一个头并且仅能被雇佣1次

分析:要求是用最少的钱雇佣骑士杀掉所有恶龙,恶龙的数目肯定不得多于骑士的数目,因为每个骑士只能雇佣一次,就算一个骑士能杀掉所有的恶龙。先对每个骑士和龙的能力进行sort排序,然后遍历骑士,用cur表示斩杀掉的龙,每当一个骑士符合条件被雇佣,cur加1,当cur与龙的数目相等的时候就停止。

#include<cstdio>
#include<algorithm>
using namespace std;

const int maxn=20005;
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 j=0;j<m;j++){
       if(b[j]>=a[cur]){
         cost+=b[j];
         if(++cur==n)
           break;
       }     
    }
    if(cur<n)
      printf("Loowater is doomed!\n");
     else
      printf("%d\n",cost);
   }   
   return 0;
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:4086次
    • 积分:137
    • 等级:
    • 排名:千里之外
    • 原创:10篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条