CF1442A Solution

题目链接

题解

题意可以理解为:是否能将\(a\)序列中的每个数分为\(l_i+r_i\),并满足\(l\)序列单调不升,\(r\)序列单调不降。以\(l\)举例,如果想从左边减去\(a_i\),一定会减去\(a_i\)左侧的每一个数,因此\(l_i\)单调不升。为满足此,\(l_i\)一定\(\le l_{i-1}\),而为满足\(r_i\ge r_{i-1}\)\(l_i\)需要满足\(l_i\le a_i-r_{i-1}\)。在这两个限制条件下,贪心使\(l_i\)取最大值(最大值会给后续更大的选择空间),如果出现\(l_i<0\)则无法实现。

AC代码

#include<bits/stdc++.h>
using namespace std;
const int N=30010;
int a[N];
int main()
{
	int t,n;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		for(int i=1;i<=n;i++) scanf("%d",&a[i]);
		int l=a[1],r=0;
		for(int i=2;i<=n;i++)
		{
			l=min(l,a[i]-r); r=a[i]-l;
			if(l<0) {printf("NO\n"); break;}
			if(i==n) printf("YES\n");
		}
		if(n<=1) printf("YES\n");//特判
	}
	return 0;
}
posted @ 2021-01-17 20:47  violet_holmes  阅读(41)  评论(0编辑  收藏  举报