【多校训练】hdu 6140 Hybrid Crystals

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
 

题意:


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


思路:

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

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

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

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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值