传送门

Sol

  • 使用贪心算法。

因为我们要使操作后原数组单调不降

所以我们要让前面的数尽可能小:

  • 先遍历一遍数组,位置为 ii 时,如果 ai<ai1a_i<a_{i−1},就不符合条件,输出 NO
  • 接下来我们进行题目中的操作:选择 i1i−1,将 aia_iai1a_{i−1} 减去 minai,ai1\min{a_i,a_{i−1}},由于 aiai1a_i\le a_{i−1},所以操作相当于将 aia_i 减去 ai1a_{i−1},再将 ai1a_{i−1} 设为 00。若遍历完还没有输出 NO,就输出 YES
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int a[N];
int main(){
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=2;i<=n;i++){
if (a[i]<a[i-1]){
puts("NO");
goto endd;
}

a[i]-=a[i-1];
a[i-1]=0;
}
puts("YES");
endd:;
}
return 0;
}