CodeForces - 939F Cutlet

Description

你要烤一块牛排,每面需要恰好 \(n(n\le 10^5)\) 秒才能烤好。你可以在 \(k(k\le100)\) 个时间区间翻动牛排。问最终烤好最少需要多少次翻动。

Solution

首先状态定义就比较神... \(f[i][j]\) 表示前 \(i\) 秒,当前不在烤的面烤了 \(j\) 秒的最小次数。

那么显然有 \(f[i][j] = f[i-1][j]\)\(f[i][j]=f[i-1][i-j]+1\)

注意到第二个转移只有在那些区间内才会发生。

所以考虑 \(f[i][j]\) 表示前 \(r_i\) 秒,当前不在烤的面烤了 \(j\) 秒的最小次数。

同时一个显然的结论是一个区间内至多翻动 \(2\) 次。

所以转移 \(f[i][j]=min\{f[i-1][j-t]\}+2\)\(f[i][j]=min\{f[i-1][r_i-j-k]\}+1\) ,其中 \(t\in [0,r_i-l_i]\)

这玩意儿可以单调队列搞。

posted @ 2018-06-17 22:57  aziint  阅读(156)  评论(0编辑  收藏  举报
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.