LeetCode 5775. 准时抵达会议现场的最小跳过休息次数
原题链接
困难
作者:
ITNXD
,
2021-06-01 13:22:16
,
所有人可见
,
阅读 308
详细请查看注释内容
参考代码:
const int N = 1010;
const double eps = 1e-8;
double f[N][N];
class Solution {
/*
状态表示:f[i][j]表示到达第i条路且总操作次数为j的选法集合!属性:最小时间!
状态计算:考虑第i条路是否休息!
不休息:ceil(f[i - 1][j] + dist[i] / speed)
休 息:f[i - 1][j - 1] + dist[i] / speed
因此:f[i][j] = min(ceil(f[i - 1][j] + dist[i] / speed), f[i - 1][j - 1] + dist[i] / speed);
最终答案:min(f[n][j])(j可取0,1,2,..n)
浮点数精度处理:1.0000001 -> 上取整为2就不对了!因此可以将上取整减去一个1e-8即可!
*/
public:
int minSkips(vector<int>& dist, int speed, int m) {
int n = dist.size();
for(int i = 1; i <= n; i ++){
// dist[]下标从0开始
double t = (double) dist[i - 1] / speed;
for(int j = 0; j <= i; j ++){
f[i][j] = 1e9;
// 不休息则是前i - 1条路,最多操作i - 1次
if(j <= i - 1) f[i][j] = ceil(f[i - 1][j] + t - eps);
// j > 0 防止越界
if(j) f[i][j] = min(f[i][j], f[i - 1][j - 1] + t);
}
}
for(int j = 0; j <= n; j ++)
if(f[n][j] <= m) return j;
return -1;
}
};