zoukankan      html  css  js  c++  java
  • 河中跳房子

    描述

    每年奶牛们都要举办各种特殊版本的跳房子比赛,包括在河里从一个岩石跳到另一个岩石。这项激动人心的活动在一条长长的笔直河道中进行,在起点和离起点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;
    }
  • 相关阅读:
    cf1100 F. Ivan and Burgers
    cf 1033 D. Divisors
    LeetCode 17. 电话号码的字母组合
    LeetCode 491. 递增的子序列
    LeetCode 459.重复的子字符串
    LeetCode 504. 七进制数
    LeetCode 3.无重复字符的最长子串
    LeetCode 16.06. 最小差
    LeetCode 77. 组合
    LeetCode 611. 有效三角形个数
  • 原文地址:https://www.cnblogs.com/MalcolmMeng/p/9128599.html
Copyright © 2011-2022 走看看