P3853 [TJOI2007] 路标设置【模板】——二分查找

news/2025/2/24 17:14:53/文章来源:https://www.cnblogs.com/xiins/p/18734499

题目背景

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

题目描述

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

输入格式

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

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

输出格式

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

输入输出样例 #1

输入 #1

101 2 1
0 101

输出 #1

51

说明/提示

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

\(50\%\) 的数据中,\(2 \leq N \leq 100\)\(0 \leq K \leq 100\)

\(100\%\) 的数据中,\(2 \leq N \leq 100000\), \(0 \leq K \leq100000\)

\(100\%\) 的数据中,\(0 < L \leq 10000000\)

题解

#include <bits/stdc++.h>
using namespace std;
int l,n,k;
vector<int> a;
bool check(int mid) {int last_location=0;int put_count=0;for (size_t i=1;i<a.size();i++) {if (a[i]-last_location>mid) {put_count+=(a[i]-last_location-1)/mid; // ★注意-1,见注释}last_location = a[i];  // 更新上一个路标的位置为当前路标位置if (put_count>k) return false;}return true;
}
int main() {cin>>l>>n>>k;for (int i=0;i<n;i++) {int b;cin>>b;a.push_back(b);}int left=1,right=l;int ans;while (left<=right) {int mid=left+(right-left)/2;if (check(mid)) {ans=mid;right=mid-1;} else {left=mid+1;}}cout<<ans;
}

下面的distance=a[i]-last_location

不减去 1 可能出现的问题

如果直接使用 distance / mid 来计算需要增设的路标数量,当 distance 恰好是 mid 的整数倍时,会多算一个路标。

例如,假设 distance = 6mid = 2。如果不减去 1,计算 distance / mid = 6 / 2 = 3,但实际上在这两个相邻原有路标之间,为了使相邻路标距离最大为 2,只需要增设 2 个路标就可以将这段距离分成 3 段,每段长度为 2。

减去 1 的原理

使用 (distance - 1) / mid 可以避免上述多算路标的问题。当 distancemid 的整数倍时,(distance - 1) 就不是 mid 的整数倍了,计算得到的结果就是正确的需要增设的路标数量。

还是以 distance = 6mid = 2 为例,计算 (distance - 1) / mid = (6 - 1) / 2 = 2,这就是正确的需要增设的路标数量。

distance 不是 mid 的整数倍时,减去 1 也不影响最终结果。比如 distance = 7mid = 2distance / mid = 3(distance - 1) / mid = (7 - 1) / 2 = 3,结果是一样的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/889091.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis低版本客户端Jedis2.9.0兼容高版本redis(比如redis6)不支持ACL的问题(亲测可用)

redis6版本及以上使用了acl认证 就是通过账号密码去认证,但是在之前版本都是只需要密码的,这种如果要适配,可能就要升级jedis客户端依赖的,但是一些老项目都不能随便升级的 之前的代码可能就不适配了 如果就要考虑使用现有的jedis版本 如:2.9.0 去支撑redis6的连接 以下有…

Linux 中sed命令的整行替换

Linux 中sed命令的整行替换.001、基本用法[root@PC1 test2]# ls a.txt [root@PC1 test2]# cat a.txt ## 测试文件 a UU i a UU i b q j c q y [root@PC1 test2]# sed /b/ s/.*/QQ/ a.txt ## 将匹配b的行全部替换为Q…

高科战神拨号精灵app下载设置方法

高科战神拨号助手、拨号健、全家软件下载,高科拨号精灵app使用设置方法说明:首先用安卓手机安装拨号助手app【联系图片上的V信 2081003456下载】。安装好后拨12345678进行蓝牙连接,蓝牙连接好后就可以进行操作。1拨号 2拨号 3拨号 4拨号 5拨号 关闭程序 12345678拨号设置。

Spherical Linear Interpolation and Text-Anchoring for Zero-shot Composed Image Retrieval

目录概Spherical Linear Interpolation (Slerp)Text-Anchored-Tuning (TAT)代码Jiang Y. K., Huynh D., Shah A., Chen W. and Lim S. Spherical linear interpolation and text-anchoring for zero-shot composed image retrieval. ECCV, 2024.概 本文提出了一种非常简单的 Ze…

uniapp + 微信小程序:新版canvas常用api及注意事项

关于新旧canvas的比较我以前写过一篇博客 :https://www.cnblogs.com/sunshine233/p/17014701.html ,这里就不重复了。 但在正文开始之前,我不得不再说一遍微信的文档写的真垃圾。很多问题的答案都是在微信开发者社区里找到的。一、新版canvas 基础用法:<template><…

Java 实现 Excel(XLS/ XLSX)和 HTML 格式之间的转换

Excel 是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,以便更好地利用和展示数据。本文将介绍如何通过 Java 实现 Excel 与 HTML 格式之间的相互转换。将Exce…

Python异步编程终极指南:用协程与事件循环重构你的高并发系统

title: Python异步编程终极指南:用协程与事件循环重构你的高并发系统 date: 2025/2/24 updated: 2025/2/24 author: cmdragon excerpt: 🚀 深入剖析Python异步编程的核心机制。你将掌握:\n 事件循环的底层实现原理与调度算法\n async/await协程的6种高级用法模式\n 异步H…

Uniapp开发安卓app之使用360加固加壳处理

Uniapp开发安卓app之使用360加固加壳处理 注:360加固只针对Android App免费。360加固助手官方下载 1.流程 安卓加固 》 签名APK 2.前提 先使用Hbuilder完成app打包,得到apk文件。 3.安卓加固1)安装、登录360加固软件并打开 2)在安卓加固》APK加固》添加任务,选择hbi…

用python画五角星

import turtle turtle.setup(500,500) turtle.bgcolor("white") turtle.pensize(3) turtle.color("red") turtle.begin_fill() for _ in range(5): turtle.forward(200) turtle.right(144) turtle.end_fill() turtle.hideturtle() turtle.done()

win10忘记开机密码怎么办?

下面我们来看看win10笔记本电脑开机密码忘记了怎么办_ 方法一、重置电脑,但是数据可能会丢失 1、开机,在看到Windows10Logo,下面有个圆圈在转的时候,数5秒。然后直接按下电源键关机。2.桌面,如果您的台式机有重新启动键,也可以直接按重新启动键。这样重复2~3次。 三、鼠标…