Dragon of Loowater UVA - 11292(机智)

题目大意:

国王招募勇士杀有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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值