1 条题解
-
0
#include <bits/stdc++.h> using namespace std; int L, n, m; int d[51234]; //检查如果要求最短距离为 mid 是否可行 //即是否可以只挪走不超过 m 块石头,实现任意两块石头的最短距离为 mid bool check(int mid) { int cnt = 0;//当前挪走了几块石头 int last = 0;//上一步位于哪个位置 for (int i = 1; i <= n; i++) { //如果这块石头到上一个位置的距离不足mid //那么这块石头就要挪走 if (d[i] - last < mid) cnt++; else last = d[i]; } //考虑最后的位置,到终点的距离是否超过了mid if (L - last < mid) cnt++; return cnt <= m; } int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> L >> n >> m; for (int i = 1; i <= n; i++) cin >> d[i]; int l = 1; int r = L; int ans; while (l <= r) { int mid = (l + r) / 2; if (check(mid)) { ans = mid; l = mid + 1; } else r = mid - 1; } cout << ans << "\n"; return 0; }
- 1
信息
- ID
- 146
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 60
- 已通过
- 29
- 上传者