1 条题解
-
0
#include<bits/stdc++.h> using namespace std; int main(){ // [1] 输入公路长度L,原有路标数量N,最多可增设路标数量K long long L; int N, K; cin >> L >> N >> K; // [2] 存储原有路标位置的数组,用long long避免溢出 vector<long long> pos(N); for(int i = 0; i < N; i++){ cin >> pos[i]; } // [3] 对路标位置进行升序排序,以便计算相邻路标间距 sort(pos.begin(), pos.end()); // [4] 初始化二分查找的边界:left为最小可能间距1,right为公路总长度L long long left = 1, right = L; // [5] 初始化答案为公路总长度,即最坏情况(仅起点终点)的空旷指数 long long ans = L; // [6] 二分查找主循环:寻找满足条件的最小空旷指数 while(left <= right){ // [7] 计算当前二分的中间值mid,作为假设的最大允许间距 long long mid = left + (right - left) / 2; // [8] 记录当前mid下需要新增的路标总数 long long need = 0; // [9] 遍历所有相邻路标,计算每段需要的新增路标数 for(int i = 1; i < N; i++){ // [10] 计算当前相邻路标之间的距离 long long d = pos[i] - pos[i-1]; // [11] 如果当前间距超过mid,需要增设路标来缩小间距 if(d > mid){ // [12] 计算该段需要的新增路标数:(d-1)/mid 等价于向上取整(d/mid) - 1 need += (d - 1) / mid; // [13] 剪枝:若已需要的路标数超过K,提前终止计算 if(need > K) break; } } // [14] 判断当前mid是否可行:所需新增数不超过K if(need <= K){ // [15] 记录当前可行的最小最大间距 ans = mid; // [16] 尝试更小的最大间距,调整右边界 right = mid - 1; } else { // [17] 当前mid太小,无法满足需求,调整左边界 left = mid + 1; } } // [18] 输出满足条件的最小空旷指数 cout << ans << endl; return 0; }
- 1
信息
- ID
- 1225
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者