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]\) 。
这玩意儿可以单调队列搞。