奶牛跳一跳
描述
每年奶牛们都会举行一个特别的跳房子的活动,其中包括在河中小心地从石头跳到另一块石头上。这次发生在一条长而直的河流上,在河的一端有一块石头,另一端有一块石头,两者相聚L(1<=L<=1000000000)。在开始和结束的岩石之间的河流中,N(0<=N<=50000)出现更多的岩石,每一个距离开始的岩石di(0<DI<L)。
为了玩游戏,每头奶牛依次从起始岩石开始,试图到达终点岩石,只能从岩石跳到岩石。当然,不那么敏捷的奶牛永远不会到达最后的岩石,结束后反而在河里。农夫John对他的奶牛非常自豪,他每年都会观赏这一盛事。但是随着时间的推移,农夫看着这些胆怯的奶牛不厌其烦了起来。他知道他不能移除开始和结束的那块岩石,但是他有足够的资源去移除中间的M块(0<=M<=N)岩石, 求去掉M个石子后相邻的最小距离的最大值.
输入
第一行输入三个整数L,N和M
接下来第N+1行每行都包含一个整数,不存在两块岩石在同一个位置。
输出
输出一个整数它是去掉M个石子后相邻的最小距离的最大值。
输入样例 1
25 5 2
2
14
11
21
17
输出样例 1
4
提示
Before removing any rocks, the shortest jump was a jump of 2 from 0 (the start) to 2. After removing the rocks at 2 and 14, the shortest required jump is a jump of 4 (from 17 to 21 or from 21 to 25). 二分
解题思路
暴力枚举肯定是不行的,只能过样例还行。我们可以利用二分查找答案。
题目的意思很简单,就是去掉这些m个石头可以得到最小距离的最大值,看提示和输出样例可知!
直接看代码吧,题目是个简单的二分答案,有个小坑,就是排序,WQW
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <iostream>
using namespace std;
int a[50006];
int main()
{
int s,n,m,right,left,mid,i,ans;
while(cin>>s>>n>>m)
{
memset(a,0,sizeof(a));
for(i=1; i<=n; i++)
cin>>a[i];
sort(a,a+n+1);//排序只有a[0]--a[n-1]进行排序的,所以要加一,报告在下入坑3次了
left=0;
right=s;
while(left<=right)
{
int cnt=0,now=0;
mid=(right+left)/2;
for(i=1; i<=n; i++)
{
if(a[i]-a[now]<mid) cnt++;
else now=i;
}
if(cnt<=m)
{
ans=mid;
left=mid+1;
}
else right=mid-1;
}
cout<<ans<<endl;
}
return 0;
}