Problem
不想翻译,估计尝试但没过的都只读了最后一段。(友好的) 出题人挖了好大一个坑,重点限制条件不在最后一段。
Idea
只看最后一段,此题为 NP 问题,但是,之前的额外条件可以将此题视作贪心。由于给出的数是有限制的,故 [1, i] 线性扫描,必然能够取得 [l, r] 区间的所有数(l , r 表示分别表示前 i 个数任取得到的最小数和最大数,不要问为什么,读完全部题面可以想到)。
所以线性扫描,贪心维护可以取得数的左区间和右区间,判断 k 是否在区间内。
… 偷懒的锅,不得不背着 …
Code
#include<bits/stdc++.h>
using namespace std;
const int N = 1000 + 10;
int T, n, k, a[N];
char b[N];
int main()
{
scanf("%d", &T);
while(T-- && scanf("%d %d", &n, &k)!=EOF)
{
for(int i=1;i<=n;i++)
scanf("%d", &a[i]);
for(int i=1;i<=n;i++)
scanf(" %c", &b[i]);
int l = 0, r = 0;
for(int i=1;i<=n;i++)
{
if(b[i] != 'L')
l = min(l, l - a[i]);
if(b[i] != 'D')
r = max(r, r + a[i]);
}
if(l <= k && k <= r)
printf("yes\n");
else
printf("no\n");
}
}