1 条题解

  • 0
    @ 2026-2-4 14:42:59
    #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
    上传者