B. Napoleon Cake

题意:制作拿破仑蛋糕,最开始是个空盘子,每一次放上一层蛋糕,输入的数代表第几层倒几层奶油(能够覆盖几层,如果层数不够,允许浪费),输出每层被覆盖的情况。(覆盖为1,否为0)

题解:如果直接用for循环遍历会超时(样例数据太大了),我们要优化循环。

ACcode:

int n, a[200100],vis[200100];//数组太大,建议放main函数外面
int main()
{
int t;
cin >> t;
while (t--)
{
memset(a, 0, sizeof(a));
cin >> n;
for (int i = 1; i <=n; i++)
{
cin >> a[i];
vis[i] = 0;
}//输入的同时,把vis数组清0
int m = n;
for (int i = n; i >=1; i--)//核心部分
{
m = min(i, m);//标记的最小值用于排除中间过程中不必进入循环的值
while(m>0&&m>i-a[i])//当m不是当前最小值时,进入循环,这样能剩下很多时间
{
vis[m--] = 1;//m在这里会标记到cream能涂到的最后一层,m此时是最小值
}
}
for (int i = 1; i <= n; i++)
cout << vis[i] << " ";//挨着输出就好
cout << endl;
}
return 0;
}

posted @ 2021-03-21 15:47  Uiney  阅读(29)  评论(0编辑  收藏  举报