题意:L是加的数,D是减的数,N可加可减。给定ai和k问,是否能满足从ai中选一个集合,使得集合里的数的和为k。
给定的ai和字符串满足
ai≤∑j=1i−1aj[bj=N]+∑j=1i−1aj[bi=L∩bj=L]+∑j=1i−1aj[bi=D∩bj=D](2≤i≤n).
不想多说。。答案就是-D - N <= k <= L+N,被气哭 在赛场上。学到了一点,在赛场上不仅要关注ac的题,还要关注别人的时间复杂度~。
#include <iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#define siz 1005
const long long mod = 1e9+7;
typedef long long LL;
using namespace std;
//int dp[(siz)*(siz)][2];
char s[siz];
int gp[siz];
int n,k;
void solve(){
LL mx = 0,mi = 0;
for(int i=1;i<=n;i++){
if(s[i]=='L'||s[i] == 'N') mx += gp[i];
if(s[i]=='D'||s[i] == 'N') mi += -gp[i];
}
//cout<<mx<<" "<<mi<<endl;
if(k>=mi&&k<=mx) printf("yes\n");
else printf("no\n");
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%d",&gp[i]);
}
for(int i=1;i<=n;i++){
getchar();
scanf("%c",&s[i]);
}
solve();
}
return 0;
}