hdu-6140Hybrid Crystals

本文解析了一道关于选择集合元素求和的比赛题目,并给出了简洁高效的解答思路。通过分析给定序列和条件,确定了目标和k的有效范围。

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

题意:L是加的数,D是减的数,N可加可减。给定ai和k问,是否能满足从ai中选一个集合,使得集合里的数的和为k。

给定的ai和字符串满足

      aij=1i1aj[bj=N]+j=1i1aj[bi=Lbj=L]+j=1i1aj[bi=Dbj=D](2in).

不想多说。。答案就是-D - N <= k <= L+N,被气哭 在赛场上。学到了一点,在赛场上不仅要关注ac的题,还要关注别人的时间复杂度~。

#include <iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#define siz 1005
const long long  mod = 1e9+7;
typedef long long LL;

using namespace std;
//int dp[(siz)*(siz)][2];
char s[siz];
int gp[siz];
int n,k;
void solve(){
    LL mx = 0,mi = 0;
    for(int i=1;i<=n;i++){
        if(s[i]=='L'||s[i] == 'N') mx += gp[i];
        if(s[i]=='D'||s[i] == 'N') mi += -gp[i];
    }
    //cout<<mx<<" "<<mi<<endl;
    if(k>=mi&&k<=mx) printf("yes\n");
    else printf("no\n");
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&n,&k);
        for(int i=1;i<=n;i++){
            scanf("%d",&gp[i]);
        }

        for(int i=1;i<=n;i++){
            getchar();
            scanf("%c",&s[i]);
        }
        solve();
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值