CF1815A 题解
题意
给出一串数,请问,通过将 \(a_i\) 和 \(a_{i+1}\) 同时加 \(1\) 或减 \(1\)若干次,能否使它单调不减?
思路
我们发现,如果要让 \(a_i\) 和 \(a_{i - 1}\) 满足单调不减,可以通过修改 \(a_i\) 和 \(a_{i+1}\) 让 \(a_i\) 和 \(a_{i-1}\),那么我们修改的目标是什么呢?其实,我们可以干脆把 \(a_i\) 和 \(a_{i-1}\) 修改相等,这样,\(a_1\) 到 \(a_{n-1}\) 就都能满足要求,并且这样后面的元素可以调到的范围也会更大。
接下来,我们需要考虑最后一个数 \(a_n\) 是否可以符合要求,我们发现,如果 \(n\) 为奇数,只需让前 \(n-1\) 的元素全部奇偶对应整体减小即可。如果 \(n\) 为偶数就只能判断 \(a_{n-1}\leq a_{n}\) 了。
AC CODE
#include<bits/stdc++.h>
using namespace std;
int t , n , a[300005] ;
signed main(){
cin >> t ;
while( t -- ){
cin >> n ;
for( int i = 1 ; i <= n ; i ++ ){
cin >> a[i] ;
}
if( n % 2 ){
cout << "Yes\n" ;
continue ;
}
for( int i = 2 ; i < n ; i ++ ){
if( a[i] != a[i - 1] ){
int k = a[i] - a[i - 1] ;
a[i] -= k ;
a[i + 1] -= k ;
}
}
if( a[n - 1] <= a[n] ) cout << "Yes\n" ;
else cout << "No\n" ;
}
return 0 ;
}

浙公网安备 33010602011771号