Hybrid Crystals
Problem Description
Given n crystals' energy levels ai and types bi ( 1≤i≤n ), bi=N means the i -th crystal is a neutral one, bi=L means a Light one, and bi=D means a Dark one. The Jedi Council asked you to choose some crystals to form a larger hybrid crystal. To make sure it is stable, the final energy level (the sum of the energy emission of all chosen crystals) of the hybrid crystal must be exactly k .
Considering the NP-Hardness of this problem, the Jedi Council puts some additional constraints to the array such that the problem is greatly simplified.
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} ).
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
Source
题解:
这道题中的数能组成的数构成了一个连续区间.
一开始只有 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] 中的所有整数.
然后题目中那个奇怪的不等式就保证了上面的"如果有"的条件.
#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,k;
int a[1005];
scanf("%d%d",&n,&k);
int l=-1,h=1;
for(int i=0;i<n;i++)
scanf("%d ",&a[i]);
char s[2];
for(int i=0;i<n;i++)
{
scanf("%s",s);
if(i==0) continue;
if(s[0]=='N')
{
l-=a[i];
h+=a[i];
}
else if(s[0]=='D')
{
l-=a[i];
}
else h+=a[i];
}
if(l<=k&&h>=k)
cout<<"yes\n";
else cout<<"no\n";
}
return 0;
}