Codeforces Round #681 (Div. 1, based on VK Cup 2019-2020 - Final)题解

A.Extreme Subtraction

题解:我们可以看做是求一个不减序列和不增序列,使它们之和为序列v

考虑最大化不增序列,这样我们也可以最小化不减序列

令不增序列为a,不减序列为b

因为$a[i] \leq a[i-1]$,$b[i]=v[i]-a[i] \geq b[i-1]$,

所以$a[i] \leq a[i-1],a[i] \leq v[i]-b[i-1]$

由于最大化$a[i]$,所以令$a[i]=\min(v[i]-b[i-1],a[i-1])$即可

#include <cstdio>
#include <cstring>
#include <iostream>

using namespace std;

int t, n, v[30011], a[30011], b[30011];

void solve() {
	scanf("%d", &n); 
	for(int i = 1; i <= n; i++) scanf("%d", &v[i]);
	a[1] = v[1]; b[1] = 0;
	for(int i = 2; i <= n; i++) {
		a[i] = min(v[i] - b[i-1], a[i-1]);
		b[i] = v[i] - a[i];
		if(a[i] < 0 || b[i] < 0) {
			cout << "NO" << endl;
			return;
		}
	}
	cout << "YES" << endl;
}

int main() {
	scanf("%d", &t);
	while(t--) solve();
	return 0;
}

 

posted @ 2020-11-19 21:09  huangxuanao  阅读(200)  评论(0)    收藏  举报