• P3853 [TJOI2007]路标设置——二分答案


    [TJOI2007]路标设置

    题目背景

    B 市和 T 市之间有一条长长的高速公路,这条公路的某些地方设有路标,但是大家都感觉路标设得太少了,相邻两个路标之间往往隔着相当长的一段距离。为了便于研究这个问题,我们把公路上相邻路标的最大距离定义为该公路的“空旷指数”。

    题目描述

    现在政府决定在公路上增设一些路标,使得公路的“空旷指数”最小。他们请求你设计一个程序计算能达到的最小值是多少。请注意,公路的起点和终点保证已设有路标,公路的长度为整数,并且原有路标和新设路标都必须距起点整数个单位距离。

    输入格式

    1 1 1 行包括三个数 L , N , K L,N,K L,N,K,分别表示公路的长度,原有路标的数量,以及最多可增设的路标数量。

    2 2 2 行包括递增排列的 N N N 个整数,分别表示原有的 N N N 个路标的位置。路标的位置用距起点的距离表示,且一定位于区间 [ 0 , L ] [0,L] [0,L] 内。

    输出格式

    输出 1 1 1 行,包含一个整数,表示增设路标后能达到的最小“空旷指数”值。

    样例 #1

    样例输入 #1

    101 2 1
    0 101
    
    • 1
    • 2

    样例输出 #1

    51
    
    • 1

    提示

    公路原来只在起点和终点处有两个路标,现在允许新增一个路标,应该把新路标设在距起点 50 50 50 51 51 51 个单位距离处,这样能达到最小的空旷指数 51 51 51

    50 % 50\% 50% 的数据中, 2 ≤ N ≤ 100 2 \leq N \leq 100 2N100 0 ≤ K ≤ 100 0 \leq K \leq 100 0K100

    100 % 100\% 100% 的数据中, 2 ≤ N ≤ 100000 2 \leq N \leq 100000 2N100000, 0 ≤ K ≤ 100000 0 \leq K \leq100000 0K100000

    100 % 100\% 100% 的数据中, 0 < L ≤ 10000000 0 < L \leq 10000000 0<L10000000

    分析

    1. 二分空旷指数,通过一个check函数去判断是否满足当空旷指数为x,不超过k个路标;对于一个mid判断后,分别做出相应处理即可;
    2. check函数这里,需要注意,当a[i] - last > x说明当前这个路标a[i]和上一个路标last不满足指定的空旷指数,需要在这中间新增路标(新增的可能不止一个,新增未知个,至到满足当前路标a[i]和新增的路标满足空旷指数),通过i–拉回来,继续让a[i]进行比;
    #include
    
    using namespace std;
    
    int l, n, k, ans;
    int a[100010];
    
    //判断是否满足当空旷指数为x,不超过k个路标
    bool check(int x) {
        int last = 0;
        int cnt = 0;//当前空旷指数,所需路标数
        for (int i = 1; i <= n; ++i) {
            if (a[i] - last > x) {
                //需要新加路标
                cnt++;
                //让这个路标(i--完成再回来)和新添加的路标再进行比较,如果还不够,继续再加路标,还让当前这个比,通过i--还让他回来(循环加,至到满足)
                i--;//for循环++了,--拉回来
                last += x;//新增的路标距离起点的距离
            } else {
                last = a[i];
            }
        }
        return cnt <= k;
    }
    
    int main() {
        cin >> l >> n >> k;
        for (int i = 1; i <= n; ++i) {
            cin >> a[i];
        }
        int left = 1, right = l, mid;
        while (left <= right) {
            mid = left + (right - left) / 2;
            if (check(mid)) {
                //空旷指数可以更小
                ans = mid;
                right = mid - 1;
            } else {
                //k个路标不够用,增大空旷指数
                left = mid + 1;
            }
        }
        cout << ans;
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
  • 相关阅读:
    协议数据单元 帧 包 段 报文之间的区别
    es 生产用操作
    虚函数可不可以重载为内联 —— 在开启最大优化时gcc、clang和msvc的表现
    [Azure - VM] 重新部署VM
    【微服务】服务发现和管理技术框架选型调研
    数据库搭建与使用
    哈希冲突和一致性哈希
    部署zookeeper集群
    快速解决mfc140u.dll丢失问题,找不到mfc140u.dll修复方法分享
    java:Http协议和Tomcat
  • 原文地址:https://blog.csdn.net/weixin_51995229/article/details/128184833