POJ 3258 River Hopscotch 二分

题意:奶牛们喜欢在河里的石头上玩跳房子游戏,每次从一个石头跳到另一个石头上。现在知道起点的石头,终点的石头,以及终点石头到起点石头的距离L。又知道起点-终点之间还有N个石头,每个石头到起点的距离记为rock[i]。Farmer John想去掉N个石头中的M个,问如何去掉使得任意两块石头之间的距离的最小值最大。

#include<cstdio>
#include<algorithm>
using namespace std;

int L, N, M;
int rock[200000];

bool check ( int len )
{
    int i, j, cnt = 0;
    for ( i = 1; i <= N + 1; i++ )
    {
        j = i - 1;
        while ( i <= N + 1 && rock[i] - rock[j] < len )
        {
            i++; cnt++;
        }
        if ( cnt > M ) return false;
    }
    return true;
}

int bfind ( int left, int right )
{
    while ( left + 1 < right ) //放防止出现left = mid的死循环
    {
        int mid = (left+right)/2;
        if ( check(mid) ) left = mid; //始终保持一边的合法性。
        else right = mid - 1;
    }
    if ( check(right) ) return right; //选择最优值,因为right>=left,若right合法,则它更优
    else return left;
}

int main()
{
    scanf("%d%d%d",&L,&N,&M);
    for ( int i = 1; i <= N; i++ )
        scanf("%d",&rock[i]);
    rock[0] = 0; rock[N+1] = L;
    sort(rock,rock+N+2);
    int ret = bfind ( 0, L );
    printf("%d\n",ret);
    return 0;
}


 

你可能感兴趣的:(POJ 3258 River Hopscotch 二分)