P10909 [蓝桥杯 2024 国 B] 立定跳远

算法:二分答案

思路

1.二分什么? 最远跳跃距离

2.二分边界:l = 1, r = 1e8

3.判断依据:自行添加的检测点数 cnt

  • if cnt <= m + 1 ,比给定的监测点数少,说明最远跳跃距离太大了,需要缩小 r = mid;
  • if cnt > m + 1 ,比给定的检测点数多,说明最远跳跃距离太小了,需要增大 l = mid + 1;

4.注意点

当前需要跳跃的距离是最远跳跃距离的整数倍时检查点数需要减一

mid = 3 -->当最远跳跃距离为 3 时

10 19 -->需要跳跃的距离为 9

9 / 3 = 3 -->由于是整数倍,因此检测点个数比实际情况多一个

10 13 16 19 --> 实际添加的检测点只有两个

C++代码

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N = 1e5 + 10;

int len,n,m;
int a[N];

bool check(int mid) {   //当前的最远距离

	int cnt = 0;        //检查点数

	for(int i = 1; i <= n; i++) {

		int len = a[i] - a[i - 1];    //从当前点跳到下一个点的距离

		if(len > mid) {
			cnt += (len / mid - (len % mid == 0));   //当整数倍的时候 添加的检测点个数 - 1
		}
	}
	if(cnt <= m + 1) return true;
	else return false;

}
signed main() {

	scanf("%lld%lld",&n,&m);

	for(int i = 1; i <= n; i++) {
		scanf("%lld",&a[i]);
	}

	//二分边界

	int l = 1, r = 1e9;

	//二分对象 :最远跳跃距离

	while(l < r) {
		int mid = l + r >> 1;
		if(check(mid)) r = mid;    //最大的最小
		else l = mid + 1;
	}

	printf("%lld",l);

	return 0;

}
相关推荐
Purple Coder2 小时前
面试-第二篇方法篇
面试·职场和发展
洛水水2 小时前
【力扣100题】29. 对称二叉树
算法·leetcode·职场和发展
Purple Coder3 小时前
面试-第一篇心态篇
面试·职场和发展
Tutankaaa3 小时前
从单场到多场并发:知识竞赛平台的弹性扩展能力
服务器·笔记·学习·职场和发展
我爱cope3 小时前
【滑动窗口:力扣438找到字符串中所有字母异位词】
算法·leetcode·职场和发展
WL_Aurora4 小时前
备战蓝桥杯国赛【Day 10】
蓝桥杯
Kang.lee4 小时前
2026.5.12【芯片设计面试经验分享】上海车载芯片设计公司
经验分享·面试·职场和发展
Hesionberger5 小时前
LeetCode98:验证二叉搜索树(多解)
java·开发语言·python·算法·leetcode·职场和发展
千寻girling5 小时前
周日那天参加的力扣周赛... —— 10号
java·javascript·c++·python·算法·leetcode·职场和发展
逻辑驱动的ken6 小时前
Java高频面试考点场景题28
java·开发语言·面试·职场和发展·求职招聘