欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > 题解 洛谷 Luogu P3853 [TJOI2007] 路标设置 二分答案 C/C++

题解 洛谷 Luogu P3853 [TJOI2007] 路标设置 二分答案 C/C++

2025/6/9 21:56:03 来源:https://blog.csdn.net/qwq_ovo_pwp/article/details/144092707  浏览:    关键词:题解 洛谷 Luogu P3853 [TJOI2007] 路标设置 二分答案 C/C++

题目传送门:

P3853 [TJOI2007] 路标设置 - 洛谷 | 计算机科学教育新生态icon-default.png?t=O83Ahttps://www.luogu.com.cn/problem/P3853思路:

二分答案,每次询问区间 [l, r] 中点 m 是否为合法距离

是就记录答案并试图找更小的合法距离,将区间改为 [l, m - 1],否则改为 [m + 1, r]

如何判断 m 是否为合法距离?

(相邻路标距离 - 小于 1 的小数) / m 即为这两个路标之间应增设的路灯数

减去小于 1 的小数是考虑到了边界情况

如距离为 80,m 为 20,80 / 20 = 4,而我们只需要增设 3 个路标

全路段应增设的路标数不大于 k 就是合法的

代码:

#include <cstdio>
using namespace std;
const int N = 100010;
int x, n, k, arr[N], l = 1, r, m, ans, cnt;
bool mp(int d)//根据 d 计算 cnt,并返回是否可行,cnt <= k 就是可行的
{cnt = 0;for (int i = 1; i < n; i++){cnt += (arr[i] - arr[i - 1] - 0.5) / d;if (cnt > k) return false;}return true;
}
int main()
{scanf("%d%d%d", &x, &n, &k);r = x;for (int i = 0; i < n; i++) scanf("%d", &arr[i]);while (l <= r){m = l + r >> 1;if (mp(m)) ans = m, r = m - 1;else l = m + 1;}printf("%d", ans);return 0;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词