题目大意:
国王招募勇士杀有N个头的恶龙。勇士有自己的身高X。恶龙的头也有高度。每个勇士可以砍掉恶龙的一个头当且仅当勇士的身高大于恶龙头的高度。身高为X的勇士需要X的金币数。现在在M个勇士中选出N个去屠龙,要求金币尽量少。
题目链接:https://vjudge.net/problem/UVA-11292
题目分析:
因为要保证金币最少,那我们砍掉一个恶龙头的那个勇士的身高应该是所有身高大于这个头的勇士中的最小值,这样才保证这个头的价值最小。比如一个5cm的头,现在有6cm和8m的勇士。我们肯定选择6CM的。对勇士和龙头从小到大排序。然后遍历勇士身高,再来一个变量K记录到目前为止已经杀了几个头了。如果当前这个人能消灭一个头,那么K++,下一个人就面对比这个头高一些的头。
代码如下:
/*by kzl*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
using namespace std;
const int maxx = 20000+500;
const int INF = 0x3f3f3f3f;
typedef long long LL;
int n,m;
LL dr[maxx],ki[maxx];
int main(){
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0)break;
for(int i=0;i<n;i++)scanf("%lld",&dr[i]);
for(int i=0;i<m;i++)scanf("%lld",&ki[i]);
sort(dr,dr+n);sort(ki,ki+m);
int ans = 0,k=0;LL sum = 0;
for(int i=0;i<m;i++){
if(ki[i]>=dr[k]){//注意等于号也可以。
ans++;k++;sum+=ki[i];
}
if(ans>=n)break;
}
if(ans<n){
printf("Loowater is doomed!\n");
}
else printf("%lld\n",sum);
}
return 0;
}