• 河中跳房子


    描述

    每年奶牛们都要举办各种特殊版本的跳房子比赛,包括在河里从一个岩石跳到另一个岩石。这项激动人心的活动在一条长长的笔直河道中进行,在起点和离起点L远 (1 ≤ L≤ 1,000,000,000) 的终点处均有一个岩石。在起点和终点之间,有N (0 ≤ N ≤ 50,000) 个岩石,每个岩石与起点的距离分别为Di (0 < Di < L)。

    在比赛过程中,奶牛轮流从起点出发,尝试到达终点,每一步只能从一个岩石跳到另一个岩石。当然,实力不济的奶牛是没有办法完成目标的。

    农夫约翰为他的奶牛们感到自豪并且年年都观看了这项比赛。但随着时间的推移,看着其他农夫的胆小奶牛们在相距很近的岩石之间缓慢前行,他感到非常厌烦。他计划移走一些岩石,使得从起点到终点的过程中,最短的跳跃距离最长。他可以移走除起点和终点外的至多(0 ≤ M ≤ N) 个岩石。

    请帮助约翰确定移走这些岩石后,最长可能的最短跳跃距离是多少?

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

    25 5 2
    2
    11
    14
    17
    21

    样例输出

    4

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

    二分的题目关键是确定条件函数,这个函数需要根据题意

    AC:

    #include<cstdio>
    #include<cmath>
    #include<iostream>
    #include<algorithm>
    #include<vector>
    #include<string>
    #include<map>
    #include<cstring>
    #define DEBUG(x) cout << #x << " = " << x << endl
    using namespace std;
    int L,N,M;
    const int MAXN=5e4+10;
    int rock[MAXN];
    bool feasible(int d)
    {
        int cnt=0;
        int curPos=0;
        for(int i=0;i<N;){
            if(rock[i]-curPos<d){
                cnt++;
                i+=1;
                if(cnt>M){
                    return false;
                }
            }
            else {
                curPos=rock[i];
                i++;
            }
        }
        return true;
    }
    int main()
    {
    //    freopen("in.txt","r",stdin);
        scanf("%d %d %d",&L,&N,&M);
        for(int i=0;i<N;i++){
            scanf("%d",&rock[i]);
        }
        rock[N++]=L;
        int lb=0,rb=L;
        int lastPos=-1;
        while(lb<=rb){///区间不为空
    //        DEBUG(lb);
    //        DEBUG(rb);
            int mid=lb+(rb-lb)/2;
            if(feasible(mid)){
                lastPos=mid;
                lb=mid+1;
            }
            else {
                rb=mid-1;
            }
        }
        cout<<lastPos;
        return 0;
    }
  • 相关阅读:
    面向对象设计模式之Facade外观模式(结构型)
    Android 多线程:使用Thread和Handler
    Android源码分析之Handler
    Android View的几个位置坐标关系
    LinearLayout布局问题
    Android app被系统kill的场景
    改变Activity启动时的默认动画
    ViewStub源码分析
    Android measure过程分析
    点击ViewGroup时其子控件也变成pressed状态的原因分析及解决办法
  • 原文地址:https://www.cnblogs.com/MalcolmMeng/p/9128599.html
Copyright © 2020-2023  润新知