码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #681 D

时间:2020-11-07 16:50:50      阅读:24      评论:0      收藏:0      [点我收藏+]

标签:unsigned   自己   第一个   str   algo   操作   while   情况   with   

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

标签:unsigned   自己   第一个   str   algo   操作   while   情况   with   

原文地址:https://www.cnblogs.com/ullio/p/13939217.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!