您的位置:首页 > 运维架构

poj 3258 River Hopscotch 二分搜索

2014-08-17 00:03 351 查看
题目链接:poj 3258

在长度为l的河中,有n块石头,问在移除m块石头的基础上,每一步跳跃的最小值的最大值为多少

二分答案,然后判断是否满足条件即可

/******************************************************
* File Name:   3258.cpp
* Author:      kojimai
* Creater Time:2014年08月16日 星期六 23时37分26秒
******************************************************/

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
#define FFF 50005
int a[FFF];
int n,m;
bool judge(int x)
{
int now=0,cnt=0;
for(int i=1;i<=n+1;i++)
{
if(now+a[i]-a[i-1]<x)
{
cnt++;
now+=a[i]-a[i-1];
}
else
{
now=0;
}
}
if(cnt>m)
return false;
else
return true;
}
int solve(int ll,int rr)
{
int mid;
while(ll<=rr)
{
mid=(ll+rr)/2;
if(judge(mid))
ll=mid+1;
else
rr=mid-1;
}
return rr;
}
int main()
{
int l;
scanf("%d%d%d",&l,&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
a[n+1]=l;
a[0]=0;
sort(a,a+n+1);
int rr=l,ll=a[1];
for(int i=2;i<=n+1;i++)
{
if(ll>a[i]-a[i-1])
{
ll=a[i]-a[i-1];
}
}
cout<<solve(ll,rr)<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: