Napoleon Cake Codeforces-1501B
2021.05.02 训练题A
**题目大意:**有n层蛋糕,每层蛋糕铺有奶油,奶油可以向下浸透arr[i]层蛋糕,问最终有多少层蛋糕被浸透
**做题思路:**从后往前遍历arr数组,用一个变量temp记录当前状态下还能浸透多少层,用一个标记数组存下该层蛋糕是否浸透,若该层蛋糕的奶油能浸透的层数>temp,更新temp,temp=arr[i],每过一层 temp-- (temp>0),若temp>0则标记数组该位置true,最终将标记数组输出
题目:
This week Arkady wanted to cook some pancakes (to follow ancient traditions) and make a problem about that. But then he remembered that one can't make a problem about stacking pancakes without working at a specific IT company, so he decided to bake the Napoleon cake instead.
To bake a Napoleon cake, one has to bake n dry layers first, and then put them on each other in one stack, adding some cream. Arkady started with an empty plate, and performed the following steps n times:
place a new cake layer on the top of the stack;
after the i-th layer is placed, pour ai units of cream on top of the stack.
When x units of cream are poured on the top of the stack, top x layers of the cake get drenched in the cream. If there are less than x layers, all layers get drenched and the rest of the cream is wasted. If x=0, no layer gets drenched.
Help Arkady determine which layers of the cake eventually get drenched when the process is over, and which don't.
Input
Each test contains multiple test cases. The first line contains the number of test cases t (1≤t≤20000). Description of the test cases follows.
The first line of each test case contains a single integer n (1≤n≤2⋅105) — the number of layers in the cake.
The second line of each test case contains n integers a1,a2,…,an (0≤ai≤n) — the amount of cream poured on the cake after adding each layer.
It is guaranteed that the sum of n over all test cases does not exceed 2⋅105.
Output
For each test case, print a single line with n integers. The i-th of the integers should be equal to 1 if the i-th layer from the bottom gets drenched, and 0 otherwise.
Example
Input
3
6
0 3 0 0 1 3
10
0 0 0 1 0 5 0 0 0 2
3
0 0 0
Output
1 1 0 1 1 1
0 1 1 1 1 1 0 0 1 1
0 0 0
代码实现:
#include <stdio.h>
int main(){
int t;
scanf("%d",&t);
while(t--){
int len,temp=0,i;
scanf("%d",&len);
int a[len],key[len];
for(i=0;i<len;i++) scanf("%d",&a[i]);
for(i=len-1;i>=0;i--){
if(a[i] != 0) if(a[i]>temp) temp=a[i];
if(temp > 0){
key[i] = 1;
temp--;
}else key[i]=0;
}
for(i=0;i<len;i++){
if(i==len-1) printf("%d\n",key[i]);
else printf("%d ",key[i]);
}
}
return 0;
}