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

    河中跳房子

    链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1247
    时间限制: 1000 ms         内存限制: 65536 KB

    【题目描述】

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

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

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

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

    【输入】

    第一行包含三个整数L, N, M,相邻两个整数之间用单个空格隔开。

    接下来N行,每行一个整数,表示每个岩石与起点的距离。岩石按与起点距离从近到远给出,且不会有两个岩石出现在同一个位置。

     

    【输出】

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

    【输入样例】

    25 5 2
    2
    11
    14
    17
    21

    【输出样例】

    4

    【提示】

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

    题解:先二分找到最长距离,然后贪心最短的最长距离

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int a[50005],b[50005],p[50005];
    const int MAXN=1000000005;
    int main()
    {
        int L,n,m,l=MAXN;
        cin>>L>>n>>m;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
            b[i]=a[i]-a[i-1];
            l=min(l,b[i]);
        }    
        b[n+1]=L-a[n];b[0]=MAXN;
        int r=2*L;
        while(l+1<r)
        {
            for(int i=1;i<=n+1;i++)p[i]=b[i];
            int mid=(l+r)/2,cnt=0;
            for(int i=1;i<=n+1;i++)
                  if(p[i]>=mid);
                else {p[i+1]+=p[i];cnt++;}
            if(cnt>m)r=mid;
            else l=mid;
        }
        int cnt=0,ans,t=0;
        for(int i=1;i<=n+1;i++)p[i]=b[i];
        for(int i=1;i<=n+1;i++)
            if(p[i]>=r);
            else
             {p[i+1]+=p[i];cnt++;}
        if(cnt==m)ans=r;
        else ans=l;
        
    
        for(int i=1;i<=n+1;i++)
        if(b[i]>=ans);
        else {
            if(b[i-1]>b[i+1])b[i+1]+=b[i];
             else b[i-1]+=b[i];
             b[i]=MAXN;
            }    
        int minn=MAXN;
        for(int j=1;j<=n+1;j++)
            minn=min(minn,b[j]);    
        cout<<minn<<endl;
    }
              
  • 相关阅读:
    模块系统
    控制结构
    基本语法
    Go-技篇第一 技巧杂烩
    微服务的4个设计原则和19个解决方案
    kcp-go源码解析
    windows.go
    服务端跨域处理 Cors
    Snowflake 全局唯一Id 生成
    面试?或许你应该这样
  • 原文地址:https://www.cnblogs.com/EdSheeran/p/7858252.html
Copyright © 2011-2022 走看看