题目描述
你的王国里有一条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
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;
}