题意
给定一个含有n
个正整数的数组a
。
可以对a
进行以下两种操作
- 将数组的前
k
位减1 - 将数组的后
k
位减1
问在经历了有限次操作之后能否使数组全部变为0
。
数据范围:1≤n≤30000,1≤ a i a_i ai≤ 1 0 6 10^6 106
思路
首先,如果可以使a
变为一个均为非负数的非递减数列
,就可以可以使数组全部变为0
。
那么问题就转变为了将a
变成均为非负数的非递减数列
。
记录数组中第一位的数字first
、当前位置的数cur
和当前位的前一位front
,如果front-cur > 0
,就将当前位之前的所有数字减去front-cur
个1(不包括当前位)。
遍历整个数组之后,如果first>=0
,就可以确保可以使数组全部变为0
。
AC的代码
#include <bits/stdc++.h>
using namespace std;
int first, front, cur;
int main() {
int t;
cin >> t;
while (t--) {
int n;
cin >> n >> front;
first = front;
for (int i = 2; i <= n; i++) {
cin >> cur;
// front为上一个cur
first -= max(front - cur, 0);
front = cur;
}
cout << (first >= 0 ? "YES\n" : "NO\n");
}
return 0;
}
演示步骤:
原数组
a[0] | a[1] | a[2] | a[3] | a[4] |
---|---|---|---|---|
11 | 7 | 9 | 6 | 8 |
前1位减去3个1
a[0] | a[1] | a[2] | a[3] | a[4] |
---|---|---|---|---|
3 | 7 | 9 | 6 | 8 |
前3位减去3个1
a[0] | a[1] | a[2] | a[3] | a[4] |
---|---|---|---|---|
0 | 4 | 6 | 6 | 8 |