标签:unsigned 自己 第一个 str algo 操作 while 情况 with
给定一个长度为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;
}
标签:unsigned 自己 第一个 str algo 操作 while 情况 with
原文地址:https://www.cnblogs.com/ullio/p/13939217.html