勇者斗恶龙(Dragon of Loowater ,UVa 11292)

题目链接

https://vjudge.net/problem/UVA-11292

题意

将题目抽象化得:
给定一个含有n个数的数组a和一个含有m个数的数组b。
问对于a数组的每一个元素是否在b数组中都唯一存在一个比其大的元素?
如果存在,输出所有对应元素的和(要求最小);
如果不存在,输出“Loowater is doomed!”。

题解

显然,当n大于m时,输出“Loowater is doomed!”。
对于a数组中的元素x,从b数组中找一个刚好大于等于x的值是最优的。STL中lower_bound()函数能很好的实现这一点(自己用二分实现也可以)。问题的关键变成了如何确定唯一性,定义一个vis数组来表示该元素有无被占用过即可。

代码

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
const int maxn=2e4+100;
int l[maxn],a[maxn],vis[maxn];

int main()
{
    int n,m,ok;
    while(~scanf("%d%d",&n,&m))
    {
        memset(l,0,sizeof(l));
        memset(a,0x7f,sizeof(a));
        memset(vis,0,sizeof(vis));
        ok=1;
        if(n==0 && m==0) break;
        for(int i=0; i<n; i++)
            scanf("%d",&l[i]);
        for(int i=0; i<m; i++)
            scanf("%d",&a[i]);
        if(n>m)
        {
            printf("Loowater is doomed!\n");
            continue;
        }

        sort(l,l+n);
        sort(a,a+m);
        int t=n,ans=0;
        while(t--)
        {
            int pos=lower_bound(a,a+m,l[t])-a;
            while(vis[pos] && a[pos]!=a[maxn-1]) pos++;

            if(a[pos]==a[maxn-1])
            {
                printf("Loowater is doomed!\n");
                ok=0;
                break;
            }
            else
            {
                vis[pos]=1;
                ans+=a[pos];
            }

        }
        if(ok)
            printf("%d\n",ans);

    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值