POJ 3258:River Hopscotch (最大化最小值)

【题意】

牛要到河对岸,在与河岸垂直的一条线上,河中有N块石头,给定河岸宽度L,以及每一块石头离牛所在河岸的距离,

现在去掉M块石头,要求去掉M块石头后,剩下的石头之间以及石头与河岸的最小距离的最大值。

Sample Input

25 5 2
2
14
11
21
17

Sample Output

4
分析:其实这个和Agressive Cows这道题差不多,只要把起点与终点加入到数组中,然后留下找(N-M+2)个位置之间的最大值,类比与Agressive cows的M;
具体题解可看Agressive cows

AC代码:
#include<stdio.h>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std;
int n,m,l;
int a[51000];
bool cmp (int x,int y)
{
    return x<y;
}
bool C(int d)
{
    int last=0;
    for(int i=1 ; i<(n-m+2) ; i++)
    {
        int crt=last+1;
        while(crt<n+2&&a[crt]-a[last]<d)
            crt++;
        if(crt==n+2)
            return false;
            last = crt;
    }
    return true;

}
int main()
{
    scanf("%d%d%d",&l,&n,&m);
    for(int i = 1 ; i <= n ; i++)
        scanf("%d",&a[i]);
      a[n+1]=l;
     sort(a,a+n+1,cmp);
     int en=INF;
     int st=0;

     while(en-st>1)
     {
         int mid=(st+en)/2;
         if(C(mid))
            st=mid;
         else
            en=mid;
     }
     printf("%d\n",(st+en)/2);
     return 0;
}
View Code

 


posted @ 2018-04-24 13:01  shuai_hui  阅读(149)  评论(0编辑  收藏  举报