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;
}
相关推荐
c2385612 小时前
互斥锁高频面试题全解:从基础概念到底层实现,一文通关
java·c++·面试·职场和发展
雨辰AI17 小时前
【零基础实战】大模型入门面试 100 问:基础概念 + 环境实操(一问一答版,直接背诵)
人工智能·ai·面试·职场和发展·ai编程
qzhqbb18 小时前
字节面试复盘2026/07/03
面试·职场和发展
Purple Coder1 天前
基于DGN的电工基础-8
职场和发展
Waay1 天前
面试口述版:个人对 Prometheus 完整理解
运维·学习·云原生·面试·职场和发展·kubernetes·prometheus
凯瑟琳.奥古斯特1 天前
K次取反最大化数组和解法(力扣1005)
开发语言·c++·算法·leetcode·职场和发展
码云数智-大飞2 天前
从 OC 平滑迁移 Swift 完整方案
职场和发展·蓝桥杯
水木流年追梦2 天前
agent面试必备31- AI Agent 核心进阶:工具路由(Tool Routing)
数据库·人工智能·oracle·面试·职场和发展·embedding
子建莫敌2 天前
ROS2 面试总结
面试·职场和发展
程序员杰哥2 天前
接口自动化测试项目框架详解
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试