奶牛跳一跳

奶牛跳一跳

描述

每年奶牛们都会举行一个特别的跳房子的活动,其中包括在河中小心地从石头跳到另一块石头上。这次发生在一条长而直的河流上,在河的一端有一块石头,另一端有一块石头,两者相聚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;
}
新手路过,勿喷!!!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值