目录

Codeforces-Round-1045-Div.-2-C

Codeforces Round 1045 (Div. 2) C

前序:很久没有打CF了,更准确的说是很久没有碰OI了,今天偶然碰到赛时,就随手做了一道C。

C. Even Larger

题意:给你一个序列,让你使每一个长度大于等于2的子序列的偶数项之和大于等于奇数项之和,你可以操作使某个数字每次减少1,问最少需要操作多少次。
题解:看到最小我一开始考虑dp或者二分,看到数据范围可排除dp,二分虽然数据具有单调性,但也不可做。再手模一下数据,很容易发现,前一个数字一定要小于等于当前数字,并且,每个偶数位置必须要满足a_{i - 1} + a_{i + 1} <= a_i
代码:

#include<bits/stdc++.h>
using namespace std ;
typedef long long ll ;
const int maxn = 1e6 + 7 ;
int t , n , a[maxn] ;
ll sum[maxn] , Sum[maxn] ;
void solve(){
	cin >> n ;
//	ll res = 0 ;
	for(int i = 1 ; i <= n ; i ++){
		cin >> a[i] ;
	}
	ll res = 0 ;
	for(int i = 2 ; i <= n ; i += 2){
		if(i == n){
			if(a[i - 1] > a[i]){
				res += (a[i - 1] - min(a[i] , a[i - 1])) ;
			}
			cout << res << endl ;
			return ;
		}
		if(a[i - 1] + a[i + 1] > a[i]){
			res += (a[i - 1] - min(a[i] , a[i - 1])) ;
			a[i - 1] = min(a[i] , a[i - 1]) ;
			if(a[i - 1] + a[i + 1] > a[i]){
				ll ans = a[i] - a[i - 1] ;
				res += (a[i + 1] - ans) ;
				a[i + 1] -= (a[i + 1] - ans) ; 
			}
		}
	}
	cout << res << endl ;
}
int main(){
	ios :: sync_with_stdio(0) ;
	cin.tie(0) ;
	cin >> t ;
	while(t --){
		solve() ;
	}
	return 0 ;
}

喜欢的记得点赞,收藏加关注!