您的位置:首页 > 其它

【多校训练】hdu 6140 Hybrid Crystals

2017-08-18 22:32 393 查看
First, the Council puts a special crystal of a1=1,b1=N.

Second, the Council has arranged the other n−1 crystals
in a way that

ai≤∑j=1i−1aj[bj=N]+∑j=1i−1aj[bi=L∩bj=L]+∑j=1i−1aj[bi=D∩bj=D](2≤i≤n).

[cond] evaluates
to 1 if cond holds,
otherwise it evaluates to 0.

For those who do not have the patience to read the problem statements, the problem asks you to find whether there exists a set S⊆{1,2,…,n} and
values si for
all i∈S such
that

∑i∈Sai∗si=k,

where si=1 if
the i-th
crystal is a Light one, si=−1 if
the i-th
crystal is a Dark one, and si∈{−1,1} if
the i-th
crystal is a neutral one.

 

Input

The first line of the input contains an integer T,
denoting the number of test cases.

For each test case, the first line contains two integers n (1≤n≤103)
and k (|k|≤106). 

The next line contains n integer a1,a2,...,an (0≤ai≤103).

The next line contains n character b1,b2,...,bn (bi∈{L,D,N}).

 

Output

If there exists such a subset, output "yes", otherwise output "no".

 

Sample Input

2

5 9
1 1 2 3 4
N N N N N

6 -10
1 0 1 2 3 1
N L L L L D

 

Sample Output

yes
no

 

题意:

一个集合里有n个数,N代表可正可负,L代表正,D代表负。求集合的数能不能组成k。

思路:

这道题中的数能组成的数构成了一个连续区间.

一开始只有 a1a​1​​ 的时候能够构成 [−1,1][−1,1] 中的所有整数.

如果一堆数能够构成 [−a,b][−a,b] 中的所有整数,
这时候来了一个数 xx.
如果 xx 只能取正值的话,
如果有 x≤bx≤b,
那么就能够构成 [−a,b+x][−a,b+x] 的所有整数.

如果 xx 只能取负值,
如果有 x≤yx≤y,
那么就能构成 [−a−x,b][−a−x,b] 的所有整数.

如果 xx 可正可负,
如果有 x≤min(x,y)x≤min(x,y),
那么就能构成 [−a−x,b+x][−a−x,b+x] 中的所有整数.

然后题目中那个奇怪的不等式就保证了上面的"如果有"的条件.

//
// main.cpp
// 1008
//
// Created by zc on 2017/8/18.
// Copyright © 2017年 zc. All rights reserved.
//

#include <iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=1100;
int a
;
char s
[2];

int main(int argc, const char * argv[]) {
int T,n,k;
cin>>T;
while(T--)
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++) scanf("%s",s[i]);
int mmax=1,mmin=-1;
for(int i=1;i<=n;i++)
{
if(s[i][0]=='N') mmin-=a[i],mmax+=a[i];
if(s[i][0]=='L') mmax+=a[i];
if(s[i][0]=='D') mmin-=a[i];
}
printf(k>=mmin&&k<=mmax?"yes\n":"no\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: