骑士勇斗恶龙

这篇博客介绍了如何通过排序策略解决一个数学问题:如何在最小花费下雇佣骑士杀死所有头数的恶龙。博主首先对恶龙的头直径和骑士的能力值分别进行升序排序,然后通过比较和雇佣合适的骑士,确保所有恶龙头被砍掉。如果无法找到解决方案,则输出"Loowaterisdoomed!"。博客中给出了C++代码实现,展示了排序在解决问题中的应用。
摘要由CSDN通过智能技术生成

题目描述

你的王国里有一条n个头的恶龙,你希望雇一些骑士把它杀死(即砍掉所有的头)。村里有m个骑士可以雇佣,一个能力值为x的骑士可以砍掉恶龙一个直径不超过x的头,且需要支付x个金币。如何雇佣骑士才能砍掉恶龙的所有头,且需要支付的金币最少?注意,一个骑士只能砍一个头(且不能被雇佣两次)。

输入格式

有多组数据,每组数据的第一行为正整数n和m(1<=n,m<=20000);
以下n行每行为一个整数,即恶龙每个头的直径;
以下m行每行为一个整数,即每个骑士的能力。

输出格式

对于每组数据,输出金币最少花费多少。如果无解,输出“Loowater is doomed!”。

样例

输入样例1

2 3
5
4
7
8
4

输出样例1

11

输入样例2

2 1
5

10

输出样例2

Loowater is doomed!

题目解析(新手哦!)

  初看题:肯定是要比较的嘛!可是怎么有效的比较呢;我最后想到的是    先对龙的直径和勇士的能力值同时进行从小到大的排序,这样就可以很直观的简单了起来,只要比大小就可以了;当然那么这样雇佣一个骑士后,对于比他小的用不用重新遍历比较操心了.

注意:

龙被砍完:

设立一个记录砍龙的变量s,当s等于龙数量则输出金币总花费

龙不能被砍完的条件:

第一种情况:龙的数量大于勇士数量

第二种情况:龙的数组还未遍历完(龙还没砍完),骑士的数组就已经遍历完了(骑士就已经看完了,没有可以雇佣的人了!)

我是用c++实现的,对于排序,我是用了STL库中的sort函数(轻松方便,不用自己手打排序函数)

#include<iostream>
#include<algorithm>
using namespace std;//骑士斗恶龙
int l[2000],q[2000]; 
int main()
{
    int n,m;
    int sum=0,s=0;//sum:杀龙的花费总数,s:沙龙总数 
    cin>>n>>m;
    if(n>m)
    cout<<"Loowater is doomed!";
    else { 
    for(int i=0;i<n;i++) cin>>l[i];
    for(int i=0;i<m;i++) cin>>q[i];
    sort(l,l+n);//对数组进行从小到大排序 
    sort(q,q+m);
    for(int i=0,j=0;i<n;i++,j++)
      {
        for(;j<m;j++){//这里的j++,在使用break后不执行,所以在上一层for循环中看下一个骑士和龙的比较
            if(l[i]<=q[j]){
                sum+=q[j];s++;//因为对两个数组都已经从小到大排序 
                break;//所以当雇佣一个骑士时,直接跳出骑士数组遍历,且不需要从头遍历 
            } 
        }
        if(j==m)//当勇士被看完(遍历)了,就直接跳出对龙的循环,减少不必要的运行时间 
        break;
      }
      if(s==n)//对龙是否被砍完进行判断
      cout<<sum;
      else
      cout<<"Loowater is doomed!";
    } 
    return 0;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值