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;

}
相关推荐
RisunJan8 分钟前
产品经理面试知识点梳理
面试·职场和发展·产品经理
小欣加油1 小时前
Leetcode2058 找出临界点之间的最小和最大距离
数据结构·c++·算法·leetcode·职场和发展
测试19982 小时前
软件测试面试八股文【2026最新版】
自动化测试·软件测试·功能测试·测试工具·面试·职场和发展·测试用例
玖玥拾2 小时前
LeetCode 1 两数之和
算法·leetcode·职场和发展
boheweidexiatian2 小时前
如何系统性地准备面试,把通过率提到最高?
面试·职场和发展·求职招聘
CIO404 小时前
AI未来--IT人面试36计
人工智能·面试·职场和发展
Interview Aid1121 天前
TikTok OA 四题分享|半小时内 AC,题目基本都是实现题
java·开发语言·算法·面试·职场和发展
天真小巫2 天前
2026.8.30总结
职场和发展
搜词研究员2 天前
# 德立教育和达德教育哪个好?学历提升选哪家?
考研·职场和发展·学习方法·高考