HDU 6140 Hybrid Crystals

题意:  给定n个数Ai, 每个数都带有一个type,  (L, R,  N)   , 

          给定一个k, 求Ai是否存在一个子集满足  SUM( Ai*si) = k , 

          Ai的ty等于L => si = -1

          Ai的ty等于D => si = 1

          Ai的ty等于N => si = -1或者1

         题目很长的那个式子保证了给定数可以形成一个连续的区间  (现场没有看出这个点....)

解:     然后就暴力求解,可形成的区间最大范围[L, R], 若k属于[L, R]则输出'yes', 否则输出'no'

/*
题目中的很长的式子保证了区间连续性,
即给定的数能构成一个连续的区间.....
故只需要维持这个数列能形成的最大区间范围【L, R】 
k在这个区间内即为yes
*/ 
#include<bits/stdc++.h>
#define rep(i, a, b) for(int i=(a); i<=(b); ++i)
#define ll long long
using namespace std;
const int maxn = 1007;
struct node{
	int v;
	char ty;
}p[maxn];
int main(){
	int t, n, k;
	scanf("%d", &t);
	while(t--){
		scanf("%d %d", &n, &k);
		rep(i, 1, n) scanf("%d", &p[i].v);
		rep(i, 1, n) scanf("%*c%c", &p[i].ty);
		int l=-1, r=1;
		int sum = 1;
		rep(i, 1, n){
			if(p[i].ty == 'N'){ //可以正可负 
				r += p[i].v;
				l -= p[i].v;
			} else if(p[i].ty =='D'){//只能负 
					l -= p[i].v;
			} else{//只能正 
					r+=p[i].v;
			}
		}
		if(k<=r && k>=l) cout <<"yes\n";
		else cout <<"no\n";
		
	}
	
	
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值