【贪心专题】POJ 3258 River Hopscotch (最大化最小值 贪心+二分搜索)

链接:click here~~

【题意】

一条河长度为 L,河的起点(Start)和终点(End)分别有2块石头,S到E的距离就是L,河中有n块石头,每块石头到S都有唯一的距离,,现在要你移除其中的m块,使得具有最小间距的相邻两块石头之间的距离最大。

【解题思路】

又是一道经典的二分搜索,跟前一道一样的思路,不过要注意的是:此题是移除其中的元素,从而达到最大化的最小值。

代码:

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 50100
int L, N, M;
int dist[maxn];
bool C(int d)
{
    int last = 0;
    for (int i = 1; i < N - M; ++i)
    {
        int cur = last + 1;
        while (cur<N&&dist[cur]-dist[last]<d)  // 搜寻满足条件的最小位置
        {
            cur++;
        }
        if (cur==N)    // 都不满足条件
        {
            return false;
        }
        last = cur;       // 继续搜寻下一个满足条件的最小位置,放置下一个空位
    }
    return true;
}
int main( )
{
    while(scanf("%d%d%d",&L,&N,&M)!=EOF)
    {
        for(int i=1; i<=N; ++i)  cin >>dist[i];
        N++,dist[N] = L,N++;
        sort(dist, dist+N);
        int lb=0, ub=L+1;
        while(ub-lb>1)
        {
            int mid=(lb + ub)/2;
            if (C(mid))
            {
                lb = mid;
            }
            else  ub = mid;
        }
        printf("%d\n",lb);
    }
    return 0;
}


你可能感兴趣的:(二分搜索,贪心)