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

poj 3258 River Hopscotch (二分)

2013-02-21 11:02 274 查看
题目:http://poj.org/problem?id=3258

题意:

一条河长度为 L,河的起点(Start)和终点(End)分别有2块石头,S到E的距离就是L。

河中有n块石头,每块石头到S都有唯一的距离

问现在要移除m块石头(S和E除外),每次移除的是与当前最短距离相关联的石头,要求移除m块石头后,使得那时的最短距离尽可能大,输出那个最短距离。

代码:

View Code

#include <iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
__int64 a[50010];
int n,m;
bool cmp(__int64 a,__int64 b)
{
return a<b;
}
int juge(__int64 mid)
{
int i;
__int64 sum=0;
int num=0;
for(i=1;i<=n-1;i++)
{
if(sum+(a[i]-a[i-1])<=mid)
{
sum+=a[i]-a[i-1];
num++;
}
else
{
sum=0;
}
}
if(num<=m)
return 1;
else
return 0;
}
int main()
{
__int64 l;

while(scanf("%I64d%d%d",&l,&n,&m)!=EOF)
{
int i;
a[0]=0;
for(i=1;i<=n;i++)
{
scanf("%I64d",&a[i]);
}
a[i]=l;
n=i+1;
sort(a,a+n,cmp);
/*for(i=0;i<n;i++)
{
printf("%I64d ",a[i]);
}
cout<<endl;*/
__int64 low=l;
__int64 high=l;
__int64 d;
for(i=0;i<n-1;i++)
{
d=a[i+1]-a[i];
if(d<low)
low=d;
}
//cout<<low<<" "<<high<<endl;
__int64 mid;
while(low<=high)
{
mid=(low+high)/2;
if(juge(mid))
low=mid+1;
else
high=mid-1;
}
cout<<low<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: