weixin_42054580 2023-07-20 18:15 采纳率: 80%
浏览 33

[二分算法] c++ 跳石头比赛

跳石头比赛
时间限制:C/C++ 1000MS
内存限制:C/C++ 64MB
描述

每年奶牛们都要举办各种特殊版本的跳石头比赛,包括在河里从一个岩石跳到另一个岩石。这项激动人心的活动在一条长长的笔直河道中进行,在起点和离起点L远 (1 ≤ L≤ 1,000,000,000) 的终点处均有一个岩石。在起点和终点之间,有N (0 ≤ N ≤ 50,000) 个岩石,每个岩石与起点的距离分别为Di (0 < Di < L)。
在比赛过程中,奶牛轮流从起点出发,尝试到达终点,每一步只能从一个岩石跳到另一个岩石。当然,实力不济的奶牛是没有办法完成目标的。
农夫约翰为他的奶牛们感到自豪并且年年都观看了这项比赛。但随着时间的推移,看着其他农夫的胆小奶牛们在相距很近的岩石之间缓慢前行,他感到非常厌烦。他计划移走一些岩石,使得从起点到终点的过程中,最短的跳跃距离最长。他可以移走除起点和终点外的至多M (0 ≤ M ≤ N) 个岩石。
请帮助约翰确定移走这些岩石后,最长可能的最短跳跃距离是多少?

输入描述

第一行包含三个整数L, N, M,相邻两个整数之间用单个空格隔开。
接下来N行,每行一个整数,表示每个岩石与起点的距离。岩石按与起点距离从近到远给出,且不会有两个岩石出现在同一个位置。

输出描述

一个整数,最长可能的最短跳跃距离。

用例输入 1 

25 5 2
2
11
14
17
21
用例输出 1 

4

提示

在移除位于2和14的两个岩石之后,最短跳跃距离为4(从17到21或从21到25)。

要求:使用二分算法

  • 写回答

2条回答 默认 最新

  • 爱编程的小芒果 2023-07-20 18:20
    关注

    这题我会,但我找不到代码了,只好先参考一下博客园和洛谷了,代码如下:

    #include<bits/stdc++.h> 
    using namespace std;
    int n,a[2000000],m,l,s,num,mid,ans;
    int half(int x)
    {
        s=0,num=0;
        for(int i=1;i<=n;i++)
            {
            
            if(a[i]-s<x) num++; 
            else s=a[i];
            }
            if(num>m) return 0;
            return 1;
    }
    int main()
    {
        cin>>l>>n>>m;
        for(int i=1;i<=n;i++) cin>>a[i];
        a[n+1]=l;
        int r=l,l=0;
        while(l<=r)
        {
             mid=(l+r)/2;
             if(half(mid))
                {
                  l=mid+1; 
                  ans=mid; 
                }
            else r=mid-1; 
        }
        cout<<ans<<endl;
        return 0;
    }
    
    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 7月20日

悬赏问题

  • ¥20 wpf datagrid单元闪烁效果失灵
  • ¥15 券商软件上市公司信息获取问题
  • ¥100 ensp启动设备蓝屏,代码clock_watchdog_timeout
  • ¥15 Android studio AVD启动不了
  • ¥15 陆空双模式无人机怎么做
  • ¥15 想咨询点问题,与算法转换,负荷预测,数字孪生有关
  • ¥15 C#中的编译平台的区别影响
  • ¥15 软件供应链安全是跟可靠性有关还是跟安全性有关?
  • ¥15 电脑蓝屏logfilessrtsrttrail问题
  • ¥20 关于wordpress建站遇到的问题!(语言-php)(相关搜索:云服务器)