题目:点击打开链接
题意:要是能看懂题意早过了QAQ。比赛的时候压根没看这道题,一眼望去就懒得去看了。给定n,k。给n个数组成的序列a,给每个数可进行的操作(L,D,N),L:可加,D:可减,N:可加可减。当然也都可以选择不加不减。要求找一段连续子序列进行一系列操作后可以组成k。关键是题干中给出了序列a的很多性质,这些性质可证明只要k在整段序列a极限操作后的的最大值和最小值之间,则能够组成!TMD
思路:题意看明白了完全不需要思路这种东西。就是干。
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int T,n,k,a[1002],maxs,mins;
char b[1002];
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
maxs=mins=0;
for(int i=1;i<=n;i++)
{
cin>>b[i];
if(b[i]=='N')
{
maxs+=a[i];
mins-=a[i];
}
if(b[i]=='L')
maxs+=a[i];
if(b[i]=='D')
mins-=a[i];
}
if(k<=maxs&&k>=mins)
printf("yes\n");
else
printf("no\n");
}
return 0;
}