【洛谷题解/TJOI2007】P3853路标设置

题目概况

题目链接: https://www.luogu.com.cn/problem/P3853
难度: 普及+/提高

题目分析

这题和NOIP2015提高组跳石头非常像,可以练一下这个
涉及知识点: 二分答案
解题思路:
首先提炼几句重点:
1. 相邻路标的最大距离定义为该公路的“空旷指数”。
2. 使得公路的“空旷指数”最小
3. 计算能达到的最小值是多少
4. 起点和终点保证已设有路标
二分答案需要满足有界性单调性,由题意可知是一段有始有终的公路,满足前者;而题目又明确指出路标递增排列,满足后者。
重点3说明,需要找的值在区间内靠左,若一个解x是符合题意的可行解,那么x'(x' < x)都是可行解,只需要在里面继续寻找最优解;若一个解y是非法解,那么y'(y' > y)都是非法解。
我们每计算出一个值,都将其看成一个“可行解”,如果在这个“可行解”下,我们增设的路标大于题目中的k,则“可行解”是非法解。我们可以定义一个check函数,这个函数对于不同的题有不同的写法,在这个题中,考虑枚举2~n,如果a[i] - a[i - 1]的距离大于mid,那么就与当前“可行解”相矛盾,需要增设。值得注意的是,如果此子区间长度正好是mid的倍数,则会与a[i]的路标重合,需要减1.(小学奥数)
倡导读题面时把关键句段写到程序注释中。

代码拆解及要点分析

无。

完整代码

#include <iostream>
#include <cstdio>
using namespace std;

/*
相邻路标的最大距离定义为该公路的“空旷指数”。
使得公路的“空旷指数”最小
计算能达到的最小值是多少
起点和终点保证已设有路标 

起点是0,终点是l 
*/

const int MAXN = 1e5 + 5;
int l, n, k, ans; //公路的长度;原有路标的数量;最多可增设的路标数量
int a[MAXN];
 
bool check(int x) {
	int tot = 0; //最多设置的路标数 
	for (int i = 2; i <= n; i++)  {
		if (a[i] - a[i - 1] >= x) {
			tot += (a[i] - a[i - 1])/x;
			if ((a[i] - a[i - 1]) % x == 0) {
				tot--;
			}
		}
	}
	if (tot > k) {
		return false;
	}
	return true;
}

int main() {
	cin >> l >> n >> k;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	int left = 1, right = l;
	while (left <= right) {
		int mid = (left + right) / 2;
		if (check(mid)) {
			ans = mid;
			right = mid - 1;
		} else {
			left = mid + 1;
		}
	}
	cout << left << endl;
	return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

oier_Asad.Chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值