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;
}

浙公网安备 33010602011771号