• 【POJ


    River Hopscotch

    直接中文 

    Descriptions

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

    在比赛过程中,奶牛轮流从起点出发,尝试到达终点,每一步只能从一块岩石跳到另一块岩石。当然,实力不济的奶牛无法抵达终点,在河中间就退出比赛了。

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

    请帮助农夫约翰确定:移走这些岩石后,最短跳跃距离的最大值是多少?

    输入

    第 1 行包含以单个空格分隔的三个整数 L, N, M。

    第 2 到 N + 1 行,每行一个整数,表示每个岩石与起点的距离。不会有两个岩石出现在同一个位置。

    输出

    输出一个整数,即最短跳跃距离的最大值。

    示例输入

    25 5 2
    2
    14
    11
    21
    17

    示例输出

    4

    提示

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

    题目链接

    https://vjudge.net/problem/POJ-3258

    二分法枚举石头之间的答案距离,若亮石头之间的实际距离小于等于答案距离,则这块石头需要搬走,计数器cnt+1,若cnt>M,则失败,要减小答案间距的距离,参考着代码看

    AC代码

    #include <iostream>
    #include <cstdio>
    #include <fstream>
    #include <algorithm>
    #include <cmath>
    #include <deque>
    #include <vector>
    #include <queue>
    #include <string>
    #include <cstring>
    #include <map>
    #include <stack>
    #include <set>
    #include <sstream>
    #define IOS ios_base::sync_with_stdio(0); cin.tie(0);
    #define Mod 1000000007
    #define eps 1e-6
    #define ll long long
    #define INF 0x3f3f3f3f
    #define MEM(x,y) memset(x,y,sizeof(x))
    #define Maxn 100000+5
    using namespace std;
    int L,N,M;
    int a[Maxn];//a[i]第i块石头到起点的距离
    int main()
    {
        cin>>L>>N>>M;
        a[0]=0;//起点
        a[N+1]=L;//终点
        for(int i=1;i<=N;i++)
            cin>>a[i];
        sort(a+1,a+N+1);
        int cnt,pos;//要搬的石头,当前是第pos个石头
        int low=0;
        int high=L;
        while(low<=high)
        {
            int mid=(low+high)/2;//答案间距
            pos=cnt=0;
            for(int i=1;i<=N+1;i++)
            {
                if(mid>=a[i]-a[pos])//两块石头的间距小于等于答案间距
                    cnt++;
                else
                    pos=i;
            }
            if(cnt>M)//要搬的石头个数大于题目要求的个数
                high=mid-1;
            else
                low=mid+1;
        }
        cout<<low<<endl;
    }
  • 相关阅读:
    Spring的历史和哲学
    CORS简介
    LDAP概念了解
    Restful levels&HATEOAS
    python/mysql connector
    Session&Cookie 简介及使用
    XML简介
    Json简介
    《魅族官网》
    期末设计部分代码截图
  • 原文地址:https://www.cnblogs.com/sky-stars/p/11296365.html
Copyright © 2020-2023  润新知