10270 : 青蛙的游戏

本文介绍了一种使用二分查找算法解决青蛙过河问题的方法,旨在找到青蛙完成特定跳跃任务所需的最小跳跃能力。通过分析河流宽度、石块分布及跳跃次数限制,实现了高效求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述
青蛙王国的年度游戏再次开始。 最著名的比赛是铁蛙铁人三项。 铁蛙铁人三项的一项跳跃比赛。 这个项目需要青蛙运动员跳过河。 河的宽度是L(1 <= L <= 1000000000)。 有n(0 <= n <= 100000)个石块排成一条直线。 青蛙过河只能借助于石头。 如果他们掉进河里,他们就出局。 现在要求青蛙最多跳m(1 <= m <= n + 1)次。 现在青蛙想知道要跳过河,他们至少有什么能力。 (即至少具有跳多远的能力)。
输入格式
第一行包含三个正整数L,n和m。
然后接下来n行。 每个代表从开始岸边到第n块石头的距离,两块石头出现在一个地方是不可能的。
输出格式
输出一个整数,代表青蛙至少应该有的能力。
样例输入
25 3 3
11
2
18
样例输出
11


本题用2分法

#include <bits/stdc++.h>     
using namespace std;  
int a[500001],L,n,m,ll,rr,mid,ans;   
int check(int k)
{    
    if(k*m<L) return 1;
	int cnt=0,i=1,j=0;
	
	while(i<=n+1)
	{
		cnt++;
		while(i<=n+1&&a[i]-a[j]<=k) i++;
		j=i-1;
	}
	return cnt > m;
}
int main()
{
	while(cin>>L>>n>>m)
	{
		for(int i=1;i<=n;i++) cin>>a[i];
		sort(a+1,a+1+n);
		a[0]=0;
		a[n+1]=L;
		ll=0;
		rr=L;
		while(ll<=rr)
		{
			mid=(ll+rr)>>1;
			if(check(mid)) ll=mid+1;
			else ans=mid,rr=mid-1;
		}
		cout<<ans<<endl;
	}
	::::::::::::::::::::::::
}

转载于:https://www.cnblogs.com/wuzetian/p/9900398.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值