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;

}
相关推荐
Dr.kangder2 小时前
嵌入式面试总结(一)——嵌入式系统实时性
面试·职场和发展·架构·嵌入式·虚拟化
退休倒计时2 小时前
【每日一题】LeetCode 88. 合并两个有序数组 TypeScript
算法·leetcode·职场和发展·typescript
Hi李耶4 小时前
【LeetCode】17.电话号码的字母组合
算法·leetcode·职场和发展
测试19981 天前
2026全新软件测试面试八股文(含答案+文档)
自动化测试·软件测试·python·测试工具·面试·职场和发展·测试用例
退休倒计时1 天前
【每日一题】LeetCode 20. 有效的括号 TypeScript
算法·leetcode·职场和发展·typescript
.道阻且长.1 天前
3.LeetCode算法习题讲解--双指针--快乐数
算法·leetcode·职场和发展
城管不管1 天前
第八次面试2026.8.10
面试·职场和发展
.道阻且长.2 天前
2.LeetCode算法习题讲解--双指针--复写零
算法·leetcode·职场和发展
一只齐刘海的猫2 天前
【Leetcode】乘积最大子数组
算法·leetcode·职场和发展