1. 程式人生 > >poj 3258 【二分搜素】

poj 3258 【二分搜素】

題目

題意:牛要到河對岸,在與河岸垂直的一條線上,河中有N塊石頭,給定河岸寬度L,以及每一塊石頭離牛所在河岸的距離,現在去掉M塊石頭,要求去掉M塊石頭後,剩下的石頭之間以及石頭與河岸的最小距離的最大值。

二分搜素

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int Max = 5e4+5;
int L,N,M;
int dis[Max];
/*
要求去掉M塊石頭後,剩下的石頭之
間以及石頭與河岸的最小距離的最大值。
*/
int cmp(int a,int b)
{
    return a<b;
}
int Bsearch(int l,int r,int k)
{
    int mid,last,cnt;
    while(l<=r)
    {
        mid=(l+r)>>1;
        last = cnt = 0;
        for(int i=1;i<=N+1;i++)
            if(mid>=dis[i]-dis[last]) cnt++;
            else last  = i;
        if(cnt>k) r = mid-1;
        else l = mid+1;
    }
    return l;
}
int main()
{
    cin>>L>>N>>M;
    dis[0]=0;
    dis[N+1]=L;
    for(int i=1;i<=N;i++)
        cin>>dis[i];
    sort(dis+1,dis+N+1,cmp);
    int ans = Bsearch(0,L,M);
    cout<<ans<<endl;
   return 0;
}