hh的蓝桥杯每日一题(二分)--立定跳远

蓝桥杯2024年第十五届决赛真题-立定跳远 - C语言网

这本质上是一个在路径上插入点,使相邻点距离不超过跳跃能力的问题。

我们可以把问题想象成:

  • 在数轴[0, aₙ]上有一条路径

  • 必须经过所有原始检查点

  • 可以在任意位置添加额外点

  • 相邻点距离 ≤ L(普通跳跃)或 ≤ 2L(使用技能的那次)

check函数:

对于给定的L,我们需要判断:

在最多添加m个额外点,且最多使用一次技能的情况下,能否从0跳到aₙ,并经过所有原始检查点?

cpp 复制代码
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=100010;
int n,m;
ll a[N];

bool check(ll l)
{
	ll cur=0;
	ll need=0;
	//计算不使用技能需要的额外点 
	for(int i=0;i<n;i++)
	{
		ll dist=a[i]-cur;
		if(dist>l)
		{
			need+=(dist+l-1)/l-1; 
		} 
		cur=a[i];
	}
	
	if(need<=m)return true;
	//计算使用技能最多能省多少点 
	ll max_save=0;
	cur=0;
	for(int i=0;i<n;i++)
	{
		ll dist=a[i]-cur;
		ll normal_need=max(0LL,(dist+l-1)/l-1);
		ll skill_need=max(0LL,(dist+2*l-1)/(2*l)-1);
		
		ll save=normal_need-skill_need;
		max_save=max(max_save,save);
		cur=a[i];
	}
	return (need-max_save)<=m;
}

int main()
{
	cin>>n>>m;
	for(int i=0;i<n;i++)cin>>a[i];
	int left=1,right=a[n-1];
	while(left<right)
	{
		int mid=(left+right)>>1; 
		if(check(mid))right=mid;
		else left=mid+1;
		
	}
	cout<<left<<endl;
	return 0;
}
相关推荐
WL_Aurora8 小时前
备战蓝桥杯国赛【day3】
python·蓝桥杯
程序员小远11 小时前
如何编写测试用例?
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例
Android_xiong_st11 小时前
(原创)2026安卓面试复盘
android·面试·职场和发展
wljy111 小时前
每日一题(2026.4.29) 猫猫与数学
c语言·c++·算法·蓝桥杯·stl·牛客
一只幸运猫.20 小时前
2026Java 后端面试完整版|八股简答 + AI 大模型集成技术(最新趋势)
人工智能·面试·职场和发展
嘻嘻哈哈樱桃1 天前
牛客经典101题题解集--动态规划
java·数据结构·python·算法·职场和发展·动态规划
生信研究猿1 天前
leetcode 416. 分割等和子集
算法·leetcode·职场和发展
待bong1 天前
蓝桥杯EDA客观题(自己收集的)
职场和发展·蓝桥杯
沉默-_-1 天前
备战蓝桥杯-哈希
c++·学习·算法·蓝桥杯·哈希算法
Reese_Cool1 天前
【STL】蓝桥杯/天梯赛终极杀器!10个C++字符串核心技巧,暴力破解高频考点
开发语言·c++·蓝桥杯·stl