洛谷P3853路标设置

洛谷P3853:增设路标求最小空旷指数

直接找时间复杂度太高

看标签就知道写二分

以下是题目

题目背景

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

题目描述

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

输入格式

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

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

输出格式

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

输入输出样例

输入 #1

101 2 1
0 101

输出 #1

51

说明/提示

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

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

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

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

以下是代码

#include <bits/stdc++.h>
//万能头函数

using namespace std;

//定义变量,数组
int l,n,k;
int a[100000] = {0},daan;

//计算达成想要的空旷指数的最小路标数
int suan(int shu){
	//算路标数变量定义
	int s = 0;
	
	for(int i = 2;i <= n;i++){
		//判断是否要用路标
		if(a[i] - a[i - 1] > shu){
			//至于-1,如果相差正好是60,而指数是30,如果不加要2次,实际1次
			s = s + (a[i] - a[i - 1] - 1) / shu;
		}
	}   
    //返回数
    return s;
}

//主函数main
int main(){
	//输入
	cin>>l>>n>>k;
	for(int i = 1;i <= n;i++){
		cin>>a[i];
	}
	
	//排序,方便判断
	sort(a + 1,a + n + 1);
	
	//二分需要的变量定义
	int l1 = 1;
	int r2 = l;
	int mid;
	
	//二分,求答案
	while(l1 < r2){
		//计算当前mid值
		mid = (l1 + r2) / 2;
		
		//判断往前还是往后
		if(suan(mid) > k){
			l1 = mid + 1;
		}else{
			r2 = mid;
		}
	}
	
	//输出
	cout<<l1;
	
	//返回,结束
	return 0;
}

点个赞吧!!!求求了!!!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值