6011. 完成比赛的最少时间
2022-02-27 13:57:00
# leecode
Link
https://leetcode-cn.com/contest/weekly-contest-282/problems/minimum-time-to-finish-the-race/
Meaning
- tires[i] = {fi, ri} 表示第 i 种轮胎连续使用 x 圈,跑完该圈耗时 fi * ri^(x-1) 秒
- changeTime 表示换一次轮胎的耗时
- numLaps 表示需要完成的圈数
- 每一种轮胎有无数条,每一圈后可以耗费 changeTime 的时间换一种轮胎(可以是当前种类新轮胎)
- 求最小耗时
- 1 <= tires.length <= 105
- tires[i].length == 2
- 1 <= fi, changeTime <= 105
- 2 <= ri <= 105
- 1 <= numLaps <= 1000
Solution
- 如果每一圈都换一个新轮胎,总时间不超过 (numLaps) * (fi + changeTime) = 2e8 秒
- 因为 ri >= 2,时间为指数增长,也就是用同一个轮胎不会超过 log(2e8) < 28 圈
- 预处理出连跑 j 圈所需的最短时间 minSec[j]
- 定义 f[i] 表示第 i 圈所需的最小耗时
- 转移方程 f[i] = changeTime + min{f[i-j] + minSec[j]} ( 1 <= j <= min(i,27) ),表示第 i 圈的最短时间是连续使用同一个轮胎跑 j 圈而来的
- 为了方便设 f[0] = -changeTime
Code
1 | import java.util.Arrays; |