题目链接
题意:可以选择包含a[0]的连续前任意个数字-k,或者选择包含a[n-1]在内的连续后任意个数字-k,要求最后能把a数组全减为0。输出YES或NO
思路:可以选择前一段或者后一段-k,我就把数组a拆成两部分处理,分别为包含a[0]和a[n-1]的两段,可以有交集。第一段要满足不递增才能使a数组变为0,为了让第一段不递增,我就应该能通过第二段的减k来使第一段的开始递增的那个点a[i]减为至少a[i-1]。
Example
input
4
3
1 2 1
5
11 7 9 6 8
5
1 3 1 3 1
4
5 2 1 10
output
YES
YES
NO
YES
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int a[300010];
int main()
{
int t,n;
cin>>t;
while(t--)
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
int f=0;
for(int i=1;i<n;i++)
{
if(a[i]>a[i-1])
{
int pre=a[i-1];
int c=a[i]-pre;
for(int j=n-1;j>=i;j--)
{
a[j]-=c;
if(a[j]<0)
{
f=1;
break;
}
}
}
}
if(f)
printf("NO\n");
else
printf("YES\n");
}
}
本来以为会T,居然A了