P3853. [TJOI2007] 路标设置

题目背景

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

题目描述

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

输入格式

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

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

输出格式

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

输入数据 1

101 2 1
0 101

输出数据 1

51

这道题是一道普通到不能再普通的二分答案题,如果做过跳石头就很好做了(明天发跳石头)

那么我们开始做题:

1.分析题目:①一条公路上可以插入一些路标,并且要让空旷指数最小

                     ②使用二分答案,目的是求“最大值最小化”

首先来了解二分答案,一般的标准二分答案题分为两部分,分别为check函数和二分实现两部分,在check函数中,一般为判断条件,二分实现即为做的优化,及时间复杂度缩小并快速得出答案的一种方法。二分答案题中的check函数一般插入在二分的判断语句中,利用二分的性质奖和法治存储在右指针或左指针中,再将值不断取最优,一旦不能再优,就退出。

2.二分答案过程:①要满足什么性质?要使每次放置之后的最大距离尽量小

                            ②要二分什么?为什么?需要二分最大距离,因为这个能够保持的最大距离就是要求的空旷指数,如果想得到最小的空旷指数,就要到到每次可能出现的空旷指数

                            ③如何知道这个空旷指数合理呢?需要看所需设置的路标个数是否在范围内

                            ④如何判断需设置的路标个数呢?模拟路标设置过程,如果有两个路标距离大于二分出的最大距离,就要在中间设置路标,用贪心的思想确定,新设置的路标要与原路标相隔一个空旷指数为最优路标位置,所以就可以突出一个公式:两个相邻路标之间的新路标个数=距离/空旷指数,容后遍历每一处路标,在套用递推式,即可得出需设置的路标个数。

                             ⑤如何处理结果呢?因为想让空旷指数尽量小,所以如果空旷指数合法的话,就将r指针左移,让二分结果更小;如果不合法,就将l指针右移,尝试更大的数是否合法。这里考虑到贪心的想法,空旷指数越大越不容易被超过,所需设置的路标就越少,越容易符合要求。

AC code:

#include <bits/stdc++.h>

using namespace std;
long long l,n,m;
int a[100005];
bool check(int mid)
{
    int cnt=0;
    for(int i=0;i<=n;i++) cnt+=(a[i+1]-a[i]-1)/mid;
        return cnt<=m;
}
int main()
{
    cin>>l>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    a[0]=0;
    a[n+1]=l;
    long long left=1,right=l;
    while(left<right){
        int mid=(left+right)>>1;
        if(check(mid)){
            right=mid;
        }
        else left=mid+1;
    }
    cout<<right;
    return 0;
}

  • 11
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值