CF1491

B

注意讨论情况

C

可以这样考虑,每次都从第一个蹦蹦床起跳,当高度为1时顺延到下一个蹦蹦床,我们从前向后线性扫描一个一个把高度清成1即可。

for(int i=1; i<=n; i++)
{
    int p = g[i] - c[i] - 1;
    ans += max(p, 0);
    //如果抵达的次数不够,需要从这里开始重新起跳
    for(int j = i + 2; j <= min(i + g[i], n); j++) c[j] ++;
    //j不需要等于1是因为,跳到g[i+1]等价于从g[i+1]起跳,顺延即可。
    c[i+1] += max(-p, 0);
    //显然,当g[i]处跳的次数过剩时,多出来的次数可以传递到g[i+1]
}
posted @ 2021-03-02 08:51  2wx  阅读(48)  评论(0)    收藏  举报