18118 勇者斗恶龙(c++ STL sort的运用)

知识共享许可协议 版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons

18118 勇者斗恶龙

Description

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

输入格式

多组数据,每组数据的第一行为正整数n和m(1<=n,m<=200000);以下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!

分析

本题中,因为骑士只能雇佣一次且一次只能雇佣一个,故只需将骑士和龙都排序后,加条件判断后相加即可。
注:源码中所用到sort格式为:sort((数组名),(数组名)+(数组大小)),排序规则是从小到大排。

源码

#include<iostream>
#include<algorithm>         //sort()
#include<cstdio>            //scanf、printf
using namespace std;        //cin、cout
int main()
{
    int n,m;
    while(cin>>n>>m&&m&&n)
    {
        int llong[n+5],knit[m+5];       //llong是龙,knit是骑士
        int sum=0;                      //初始一个总花费是0
        for(int i=0;i<n;i++)
            scanf("%d",&llong[i]);
        for(int i=0;i<m;i++)
            scanf("%d",&knit[i]);
        sort(llong,llong+n);            //用sort函数将llong和knit排序
        sort(knit,knit+m);
        int j=0;                        //第一个龙头开始
        for(int i=0;i<m;i++)
        {
            if(knit[i]>=llong[j])       //若该骑士能砍掉该龙头,则sum加上雇佣该骑士的花费,否则看下一个骑士
            {
                j++;
                sum=sum+knit[i];
            }
            if(j>=n) break;             //如果龙头已经被砍完
        }
        if(j>=n)
            cout<<sum<<endl;            //龙头被砍完了,输出总花费
        else
            cout<<"Loowater is doomed!"<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43692948/article/details/92086288