HDU 6140 Hybrid Crystals(思维)

Hybrid Crystals

  Problem Description

 Given  n  crystals' energy levels  ai  and types  bi  ( 1in ),  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  n1  crystals in a way that
aij=1i1aj[bj=N]+j=1i1aj[bi=Lbj=L]+j=1i1aj[bi=Dbj=D](2in).

[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  iS  such that

iSaisi=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  ( 1n103 ) and  k  ( |k|106 ). 

The next line contains  n  integer  a1,a2,...,an  ( 0ai103 ).

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


题解:

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

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

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

如果 xx 只能取负值, 如果有 x \le yxy, 那么就能构成 [-a-x, b][ax,b] 的所有整数.

如果 xx 可正可负, 如果有 x \le min(x, y)xmin(x,y), 那么就能构成 [-a-x, b+x][ax,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;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值