luogu P3853 [TJOI2007]路标设置 |二分

题目背景

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

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

输入格式

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

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

输出格式

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

说明/提示

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

50%的数据中,2 ≤ N ≤100,0 ≤K ≤100

100%的数据中,2 ≤N ≤100000, 0 ≤K ≤100000

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


#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int L,n,k,a[N];
inline bool check(int mid){
    int ans=0;
    for(int i=2;i<=n;i++){
        if(a[i]-a[i-1]>mid){
            ans+=(a[i]-a[i-1])/mid;
            if((a[i]-a[i-1])%mid==0)ans--;
            if(ans>k)return 0;
        }
    }
    return 1;
}
signed main(){
    cin>>L>>n>>k;
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    int l=0,r=L,ans=-1;
    while(l<=r){
        int mid=(l+r)>>1;
        if(check(mid)){
            r=mid-1;
            ans=mid;
        }else l=mid+1;
    }
    cout<<ans<<endl;
}

原文地址:https://www.cnblogs.com/naruto-mzx/p/12031999.html

时间: 2024-08-30 13:30:53

luogu P3853 [TJOI2007]路标设置 |二分的相关文章

P3853 [TJOI2007]路标设置

传送门 思路: 类似于数列分段的二分查找答案.设目前的 mid 是一个最小的“空旷指数”,那么在 sum 数组(路标数组)里每两个相邻间的路标距离一定要小于等于目前的 mid , 如果大于,那就必须使用一些路标去填补这个距离. 两个路标之间距离大于 mid 又要分为两种情况:①两路标之间距离不能整除 mid ,则要放置 ( sum [ i+1 ] -sum [ i ] )/mid 个路标.②如果两路标之间距离能够整除 mid 则所放置的路标数要 -1 . 每一次二分判断 mid 距离是否满足 c

二分答案 [TJOI2007]路标设置

本人水平有限,题解不到为处,请多多谅解 本蒟蒻谢谢大家观看 题目:https://www.luogu.org/problem/P3853 因为数据n<=10000000;通过样例分析即可得出这是一到二分题. 样例解析:将一段区间分成(k+n)段,找出(k+n)的一段最大值.因为k不确定,所以如何分也不确定,我们就是要找出这段最大值在整个若干次情况中与其余一段最大值比较,取这些里面最小的. 本题是一道二分答案的模板题,只需注意一下细节即可 code: #include<bits/stdc++.h

题解 P3853 【[TJOI2007]路标设置】

#include<bits/stdc++.h> using namespace std; int l,r,len,n,k,maxx,a[100005]; //通过计算可以发现 对一个给定的距离len而言 中间分成若干个长度不大于x的段的个数为 len/x 如果len为x的倍数 则为len/x-1 bool check(int x){ int tmp=0; for (int i=2;i<=n;i++){ tmp+=(a[i]-a[i-1])/x; if ((a[i]-a[i-1])%x==

[Luogu P1462] 通往奥格瑞玛的道路 (二分答案+最短路径)

题面 传送门:https://www.luogu.org/problemnew/show/P1462 Solution 这道题如果去除掉经过城市的收费.那么就是裸的最短路 但是题目要求经过城市中最多的一次性收费的最小值,也就是说让经过的最大值尽可能小 那我们可以考虑二分这个最大值 一切收费大于我们二分的值的城市统统不走 在最短路那里改一下就好了 然后就OjbK了 时间复杂度 O(n*logn*log b) Code //Luogu P1462 通往奥格瑞玛的道路 //May,27th,2018

luogu P2759 奇怪的函数 二分答案+数论

题目描述 使得 x^x 达到或超过 n 位数字的最小正整数 x 是多少? 输入输出格式 输入格式: 一个正整数 n 输出格式: 使得 x^x 达到 n 位数字的最小正整数 x 输入输出样例 输入样例#1: 11 输出样例#1: 10 说明 n<=2000000000 判断位数important #include<iostream> #include<cmath> using namespace std; int n; bool can(int x) { if(x*(log(x

Luogu P1083 借教室【二分答案/差分】By cellur925

题目描述 Description 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要 向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然希望编程解决这个问题. 我们需要处理接下来n天的借教室信息,其中第i天学校有ri个教室可供租借.共有m份 订单,每份订单用三个正整数描述,分别为dj, sj, tj,表示某租借者需要从第sj天到第tj天租 借教室(包括第sj天和第tj天),每天需要租借dj个教室. 我们假定

Luogu P1396 营救【最小生成树/二分答案/最短路】 By celur925

题目描述 "咚咚咚--""查水表!"原来是查水表来了,现在哪里找这么热心上门的查表员啊!小明感动的热泪盈眶,开起了门-- 妈妈下班回家,街坊邻居说小明被一群陌生人强行押上了警车!妈妈丰富的经验告诉她小明被带到了t区,而自己在s区. 该市有m条大道连接n个区,一条大道将两个区相连接,每个大道有一个拥挤度.小明的妈妈虽然很着急,但是不愿意拥挤的人潮冲乱了她优雅的步伐.所以请你帮她规划一条从s至t的路线,使得经过道路的拥挤度最大值最小. 输入输出格式 输入格式: 第一行四

Luogu P3305 [SDOI2013]费用流 二分 网络流

题目链接 \(Click\) \(Here\) 非常有趣的一个题目. 关键结论:所有的单位费用应该被分配在流量最大的边上. 即:在保证最大流的前提下,使最大流量最小.这里我们采用二分的方法,每次判断让所有边的流量\(<=mid\)时是否依然有最大流,求得最小的最大流量\(*p\)即可. 为什么会有实数流量呢?其实我也不懂,不过这也造成这个题目需要把流量改成\(double\),有很多细节需要小心谨慎... #include <bits/stdc++.h> using namespace

Luogu P3527 [POI2011]MET-Meteors 整体二分

思路:整体二分 提交:4次 错因:树状数组开的$int$ 题解: 二分操作序列,将仅用$[l,md]$即可满足要求的国家递归到左半边,将仅用$[l,md]$不能满足要求的国家,把他们的要求去掉左半边的贡献,递归到右半边. 具体来说,开一个以空间站为下标的树状数组(把环展成链),区间加单点求和转化为差分和前缀和,依次加入$[l,md]$中的所有操作区间: 然后每个国家枚举自己的所有空间站,计算贡献,判断前$[l,md]$是否满足,来决定向左右递归的方向. #include<iostream> #