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_Aurora16 小时前
备战蓝桥杯国赛【Day 17】
算法·蓝桥杯
生物信息与育种16 小时前
PlantBiMoE开源:轻量高效的植物基因组基础模型
人工智能·深度学习·职场和发展·数据分析·r语言
秦明月1317 小时前
伺服撞机、丢脉冲?FX3U控制松下伺服调试避坑指南
经验分享·其他·职场和发展·创业创新·学习方法
运筹vivo@17 小时前
LeetCode 2540. 最小公共值
算法·leetcode·职场和发展
一只机电自动化菜鸟17 小时前
一建机电备考笔记(38) 焊接技术—焊接质量检验(含考频+题型)
笔记·学习·职场和发展·生活·学习方法
lalala_Zou19 小时前
计算机网络高频面试总结
计算机网络·面试·职场和发展
我爱cope19 小时前
【力扣hot100:239. 滑动窗口最大值】
算法·leetcode·职场和发展
z200509301 天前
今日算法(依旧二叉树)
算法·leetcode·职场和发展
绪风7502 天前
Airtest_Ide
职场和发展
один but you2 天前
Hash表
缓存·面试·职场和发展