Codeforces 1442A

题意
给你一个 n n n长的正整数数组 a a a,有两种操作,1.将前 k k k个元素的值减 1 1 1;2.将后 k k k个元素的值减 1 1 1,问是否能将数组变为全 0 0 0数组。

分析
考虑将数组拆分成一个非递减数组和一个非递增数组,可以贪心地来构造。假设原数组为 { c 1 , c 2 , … , c n } \left\{ {{c_1},{c_2}, \ldots ,{c_n}} \right\} {c1,c2,,cn},非递减数组为 { a 1 , a 2 , … , a n } \left\{ {{a_1},{a_2}, \ldots ,{a_n}} \right\} {a1,a2,,an},非递增数组为 { b 1 , b 2 , … , b n } \left\{ {{b_1},{b_2}, \ldots ,{b_n}} \right\} {b1,b2,,bn},自然希望 a 1 {a_1} a1越小, b 1 {b_1} b1越大,因此初始令 a 1 = 0 {a_1}=0 a1=0 b 1 = c [ 1 ] {b_1=c[1]} b1=c[1],对于 2 ≤ i ≤ n 2 \le i \le n 2in,满足 { a i ≥ a i − 1 c i − a i ≤ b i − 1 \left\{ \begin{array}{l}{a_i} \ge {a_{i - 1}}\\{c_i} - {a_i} \le {b_{i - 1}}\end{array} \right. {aiai1ciaibi1,得到 a i = max ⁡ { a i − 1 , c i − b i − 1 } {a_i} = \max \{ {a_{i - 1}},{c_i} - {b_{i - 1}}\} ai=max{ai1,cibi1},据此可以构造出 a a a b b b数组,若出现 b i < 0 {b_i}<0 bi<0的情况,说明构造不成功。

代码

#include<bits/stdc++.h>
#define ll long long
#define FULL(x,y) memset(x,y,sizeof(x))
#define pb push_back
using namespace std;
 
const int N=30005;
int t,n;
int a[N],b[N],c[N];
 
int main() {
	cin>>t;
	while(t--) {
		cin>>n;
		for(int i=1;i<=n;i++) cin>>c[i];
		a[1]=0,b[1]=c[1];
		int fl=0; 
		for(int i=2;i<=n;i++) {
			int x=max(a[i-1],c[i]-b[i-1]);
			a[i]=x;
			if (c[i]-a[i]<0) {
				fl=1;
				break;
			}
			b[i]=c[i]-a[i];
		}
		if (!fl) cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值