题目背景
一年一度的“跳石头”比赛又要开始了!
题目描述
这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石。组委会已经选择好了两块岩石作为比赛起点和终点。在起点和终点之间,有 N 块岩石(不含起点和终点的岩石)。在比赛过程中,选手们将从起点出发,每一步跳向相邻的岩石,直至到达终点。
为了提高比赛难度,组委会计划移走一些岩石,使得选手们在比赛过程中的最短跳跃距离尽可能长。由于预算限制,组委会至多从起点和终点之间移走 M 块岩石(不能移走起点和终点的岩石)。
输入格式
第一行包含三个整数 L,N,M,分别表示起点到终点的距离,起点和终点之间的岩石数,以及组委会至多移走的岩石数。保证 L≥1 且 N≥M≥0。
接下来 N 行,每行一个整数,第 i 行的整数 Di(0<Di<L), 表示第 i 块岩石与起点的距离。这些岩石按与起点距离从小到大的顺序给出,且不会有两个岩石出现在同一个位置。
输出格式
一个整数,即最短跳跃距离的最大值。
样例 #1
样例输入 #1
25 5 2
2
11
14
17
21
Copy
样例输出 #1
4
Copy
提示
输入输出样例 1 说明
将与起点距离为 22和 1414 的两个岩石移走后,最短的跳跃距离为 44(从与起点距离 1717 的岩石跳到距离 2121 的岩石,或者从距离 2121 的岩石跳到终点)。
数据规模与约定
对于 20%20%的数据,0≤M≤N≤10。 对于50% 的数据,0≤M≤N≤100。 对于 100%的数据,0≤M≤N≤50000,1≤L≤109。
数据已修复,采用官方数据
做题过程
本人偷懒,不讲了,勿喷❤️
代码展示
#include<bits/stdc++.h>
using namespace std;
long long a,b,c,e[1000000+250],zd=0;
bool ok(long long x)
{
long long cnt=1;
for(int i=1,j=2;j<=a;j++)
{
if(e[j]-e[i]>=x)
{
cnt++;
i=j;
}
}
if(cnt<b)
return 0;
else
return 1;
}
int main()
{
cin>>a>>b;
for(int i=1;i<=a;i++)
{
cin>>e[i];
}
sort(e+1,e+a+1);
long long l=1,r=e[a]-e[1],ans=0;
while(l<=r)
{
long long mid=l+(r-l)/2;
if(ok(mid))
{
ans=mid;
l=mid+1;
}
else
{
r=mid-1;
}
}
cout<<ans;
return 0;
}