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
[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
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.
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} ).
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。
思路:
这道题中的数能组成的数构成了一个连续区间.
一开始只有 a1 的时候能够构成 [−1,1] 中的所有整数.
如果一堆数能够构成 [−a,b] 中的所有整数, 这时候来了一个数 x. 如果 x 只能取正值的话, 如果有 x≤b, 那么就能够构成 [−a,b+x] 的所有整数.
如果 x 只能取负值, 如果有 x≤y, 那么就能构成 [−a−x,b] 的所有整数.
如果 x 可正可负, 如果有 x≤min(x,y), 那么就能构成 [−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[N];
char s[N][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");
}
}