POJ 3258 River Hopscotch

题目大意:

给出河的宽度,也就是开始的石头和结束石头之间的距离,再给出n个石头到开始石头的距离,求当移除n个石头中的m块时。两块石头之间的最短距离。


解题思路:

对最短距离进行二分查找。


下面是代码:

#include <stdio.h>
#include <algorithm>
using namespace std;
int l,n,m,a[50005],L;
int main()
{
    int i,j,low=0,high,mid,cnt,sum;
    scanf("%d%d%d",&l,&n,&m);
    for(i=1;i<n+1;i++)
    {
        scanf("%d",&a[i]);
    }
    a[0]=0;
    a[n+1]=l;
    high=l;
    sort(a,a+n+2);
    while(low<=high)
    {
        mid=(low+high)>>1;
        cnt=0;
        sum=0;
        for(i=0;i<n+1;i++)
        {
            if(sum+a[i+1]-a[i]<=mid)
            {
                sum+=a[i+1]-a[i];
                cnt++;
            }
            else
            {
                sum=0;
            }
        }
        if(cnt<=m)
        {
            low=mid+1;
        }
        else
        {
            high=mid-1;
        }
    }
    printf("%d\n",low);
    return 0;
}


posted @ 2013-12-31 21:20  、小呆  阅读(104)  评论(0编辑  收藏  举报