poj3258 River Hopscotch(二分)

poj3258

题目

http://poj.org/problem?id=3258

思路

题意就是给一排的石头,头尾不能去掉,去掉m个石头,求最小间距的最大值。
思路就是二分最小距离,判断的时候注意最后一个不能去掉。

代码

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

int a[50100];
int l,n,m;

int judge(int x)
{
    int k=0;
    int now=0;
    int temp=1;
    while(temp!=n+1)
    {
        if(a[temp]-a[now]<x)
        {
            k++;
            temp++;
        }
        else
        {
            now=temp;
            temp=temp+1;
        }
    }
    if(a[temp]-a[now]<x) k++;
    if(k<=m) return 1;
    else return 0;
}

int main()
{

    scanf("%d %d %d",&l,&n,&m);
    a[0]=0,a[1]=l;
    for(int i=2; i<n+2; i++)
        scanf("%d",&a[i]);
    sort(a,a+n+2);
    int low=0;
    int high=0;
    for(int i=1; i<n+2; i++)
    {
        high=max(high,a[i]-a[i-1]);
    }
    while(low<=high)
    {
        int mid=(low+high)/2;
        if(judge(mid))
        {
            low=mid+1;
        }
        else
        {
            high=mid-1;
        }
    }
    printf("%d\n",high);
    return 0;
}
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/pibaixinghei/article/details/51564524
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭