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;

}
相关推荐
酉鬼女又兒5 小时前
零基础快速入门前端DOM 节点操作核心知识点及蓝桥杯 Web 应用开发考点解析(可用于备赛蓝桥杯Web应用开发)
开发语言·前端·javascript·职场和发展·蓝桥杯
一轮弯弯的明月6 小时前
博弈论-Nim游戏
笔记·蓝桥杯·学习心得
程序员三藏6 小时前
接口自动化测试思路和实战:编写线性测试脚本实战
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试
热水过敏6 小时前
前路迷茫,再次起航
笔记·程序人生·职场和发展
wanderist.6 小时前
高维矩阵的压维存储和高维差分
c++·算法·蓝桥杯
迈巴赫车主6 小时前
蓝桥杯192.等差数列java
java·数据结构·算法·职场和发展·蓝桥杯
Roselind_Yi6 小时前
【吴恩达2026 Agentic AI】面试向+项目实战(含面试题+项目案例)-4
人工智能·面试·职场和发展·实时互动·跳槽·社交电子·学习方法
程序员杰哥7 小时前
软件测试之黑盒测试详解
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例
会编程的土豆7 小时前
【leetcode hot 100】依旧二叉树
算法·leetcode·职场和发展