Description
你要烤一块牛排,每面需要恰好 (n(nle 10^5)) 秒才能烤好。你可以在 (k(kle100)) 个时间区间翻动牛排。问最终烤好最少需要多少次翻动。
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) ,其中 (tin [0,r_i-l_i]) 。
这玩意儿可以单调队列搞。