算法竞赛入门经典(刘佳汝)例题(一)

第一章(1)

  • The Dragon of Loo-water

王国里有一条n个头的恶龙,共有m个骑士可以雇佣,一个能力值为x的骑士可以砍掉恶龙一个直径不超过x的头,并且需要支付x个金币。问,如何雇佣骑士才能花最少的钱砍掉恶龙所有的头?
【输入格式】
第一行为正整数n和m(1<=n,m<=2000);以下n行每行一个整数,即恶龙的头的直径;以下m行每行一个整数,即每个骑士的能力。
【输出格式】
输出最小花费,如果无解,输出“Loo-water is doomed”

博主浅薄的思路:粗一看是一个需要排序的问题,能力值小于直径最小的头的骑士可以首先排除,再来进行对应判断。思路比较容易,代码也就很清晰了。这里给出书上的示例代码。

#include<cstdio>
#include<algorithm>
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+n);
      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\n");
           else printf("%d\n",cost);
          }
         }
         retuen 0;
   }

代码风格十分简洁,本题也没有什么明显的坑点,稍微需要注意一点的应该是数组的长度和一位骑士只能砍掉一个头。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值