题意
给你一个
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
2≤i≤n,满足
{
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.
{ai≥ai−1ci−ai≤bi−1,得到
a
i
=
max
{
a
i
−
1
,
c
i
−
b
i
−
1
}
{a_i} = \max \{ {a_{i - 1}},{c_i} - {b_{i - 1}}\}
ai=max{ai−1,ci−bi−1},据此可以构造出
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;
}