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;
}
相关推荐
jiayong2327 分钟前
Vue2 与 Vue3 生态系统及工程化对比 - 面试宝典
vue.js·面试·职场和发展
学历真的很重要36 分钟前
【系统架构师】第一章 计算机系统基础知识(详解版)
学习·职场和发展·系统架构·系统架构师
仰泳的熊猫1 小时前
题目1433:蓝桥杯2013年第四届真题-危险系数
数据结构·c++·算法·蓝桥杯·深度优先·图论
Warren981 小时前
Pytest Fixture 到底该用 return 还是 yield?
数据库·oracle·面试·职场和发展·单元测试·pytest·pyqt
雁于飞1 小时前
【无标题】
笔记·面试·职场和发展·跳槽·产品经理·创业创新·学习方法
说给风听.1 小时前
拆解蓝桥杯红黑树:无限深度树的奇偶性规律与 Python 实战解法
python·职场和发展·蓝桥杯
iAkuya1 小时前
(leetcode)力扣100 59括号生成(回溯||按括号序列的长度递归)
算法·leetcode·职场和发展
渐暖°2 小时前
【leetcode算法从入门到精通】9. 回文数
算法·leetcode·职场和发展
努力学算法的蒟蒻2 小时前
day74(2.2)——leetcode面试经典150
面试·职场和发展
代码雕刻家15 小时前
2.4.蓝桥杯-分巧克力
算法·蓝桥杯