HDU 6140 Hybrid Crystals (2017 Multi-Univ Training Contest 8)

本文介绍了一道算法题目背后的解题思路,通过合理的利用题目中的特定条件将其转化为一个贪心算法问题,并给出了实现代码。文章展示了如何通过线性扫描来维护可能的数值区间,最终判断目标值是否位于该区间内。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Problem

Problem Link

不想翻译,估计尝试但没过的都只读了最后一段。(友好的) 出题人挖了好大一个坑,重点限制条件不在最后一段。

Idea

只看最后一段,此题为 NP 问题,但是,之前的额外条件可以将此题视作贪心。由于给出的数是有限制的,故 [1, i] 线性扫描,必然能够取得 [l, r] 区间的所有数(l , r 表示分别表示前 i 个数任取得到的最小数和最大数,不要问为什么,读完全部题面可以想到)。

所以线性扫描,贪心维护可以取得数的左区间和右区间,判断 k 是否在区间内。

… 偷懒的锅,不得不背着 …

Code

#include<bits/stdc++.h>
using namespace std;
const int N = 1000 + 10;
int T, n, k, a[N];
char b[N];
int main()
{
    scanf("%d", &T);
    while(T-- && scanf("%d %d", &n, &k)!=EOF)
    {
        for(int i=1;i<=n;i++)
            scanf("%d", &a[i]);
        for(int i=1;i<=n;i++)
            scanf(" %c", &b[i]);
        int l = 0, r = 0;
        for(int i=1;i<=n;i++)
        {
            if(b[i] != 'L')
                l = min(l, l - a[i]);
            if(b[i] != 'D')
                r = max(r, r + a[i]);
        }
        if(l <= k && k <= r)
            printf("yes\n");
        else
            printf("no\n");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值