关闭

poj3258 River Hopscotch(二分)

93人阅读 评论(0) 收藏 举报

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;
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:18299次
    • 积分:1636
    • 等级:
    • 排名:千里之外
    • 原创:155篇
    • 转载:0篇
    • 译文:0篇
    • 评论:5条