版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (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;
}