题目大意:
你有n堆积木。第i个堆栈包含hi个块,其高度是其中的块数。在一次移动中,您可以从第i个堆栈中取出一个块(如果至少有一个块),并将其放入第i+1个堆栈。你能让高度的顺序严格增加吗?请注意,堆栈的数量始终保持为n:当堆栈有0个块时,它们不会消失。
输入格式
第一行包含单个整数t(1≤t≤104)-测试用例的数量。每个测试用例的第一行包含单个整数n(1≤n≤100)。每个测试用例的第二行包含n个整数hi(0≤hi≤109)-堆栈的起始高度。
可以保证所有n的和不超过104。
输出格式
对于每个测试用例,如果您可以使高度序列严格增加,则输出yes,否则输出no。您可以在任何情况下打印每个答案(例如,YES、YES都将被识别为肯定答案)。
Example
input
6
2
1 2
2
1 0
3
4 4 4
2
0 0
3
0 1 0
4
1000000000 1000000000 1000000000 1000000000
output
YES
YES
YES
NO
NO
YES
第一堆从0开始,后面依次加一,把每堆多余的统计起来,为后面的补,如果不够补的就是NO,多出的全部堆在最后一堆
AC代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+3;
int main(){
int T;
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
int flag=1;
ll p,x;
ll sum=0;
for(int i=1;i<=n;++i){
scanf("%lld",&x);
if(i==1){
p=0;
sum+=x;
continue;
}
if(p>x)sum-=p-x+1;
else sum+=x-p-1;
p++;
if(sum<0)flag=0;
}
if(flag)printf("YES\n");
else printf("NO\n");
}
return 0;
}