Codeforces Round #681 D
Posted ullio
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #681 D相关的知识,希望对你有一定的参考价值。
Codeforces Round #681 D
大意
给定一个长度为n的序列,每次可以将(A_1,...,A_k)或者(A_m,...,A_n)中的数减一,其中(k,m)是自己选择的数。
问,是否能通过任意次操作,让数列每一项都为0。
思路
可以证明,如果一种情况为可行解,当且仅当可以通过任意操作将序列变为非严格单调序列,所以考虑判定能否成为单调序列。
不失一般性,考虑让序列非严格单调递增。
记(c=A_i),其中(i)为第一个满足(A_{i-1} > A_{i})且(A_{i+1} > A_{i})的数。
不难发现,前面的数都可以通过从头开始操作变为(A_i),所以此即为后续最多的操作数。
考虑(k),有(A_k < A_{k-1}),显然,要进行(A_{k-1}-A_k)次操作才能满足单调性。
如此,当序列单调后检查操作数和(c)的大小关系即可。
代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
#define ll long long
#define ull unsigned long long
#define cint const int&
#define Pi acos(-1)
int t, n;
int a[30030];
int main() {
ios::sync_with_stdio(false);
cin >> t;
while(t--) {
cin >> n;
for(int i=1; i<=n; i++) cin >> a[i];
int mn = a[1];
bool flag = 0;
for(int i=2; i<=n; i++)
if(a[i] > a[i-1]) {
flag = 1;
} else if(a[i] < a[i-1]){
if(!flag) mn = min(mn, a[i]);
else {
mn -= a[i-1] - a[i];
}
}
if(mn >= 0) cout << "YES" << endl;
else cout << "NO" << endl;
}
return 0;
}
以上是关于Codeforces Round #681 D的主要内容,如果未能解决你的问题,请参考以下文章
D - Round Subset codeforces837d