HDU 6140 Hybrid Crystals

来源:互联网 发布:知乎孔雀东南飞 编辑:程序博客网 时间:2024/06/11 12:55

题意:  给定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 longusing 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;}