POJ 3258

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

题意:

河宽L(左岸 右岸各有一块石头)河中有N 个石头,每个石头距离河岸有一定的距离,   移走M个石头(只移河中的石头)                              求两块石头的距离  中最短的

 

关键是开始不知道用二分解 

代码写起来还算简单  就是二分的思路。。。

代码:

#include<iostream>
#include<algorithm>
using namespace std;
int a[50002];
int L,N,M;
bool can_cross(int mid)
{
int i,start=0,sum=0;
for(i=1;i<=N;i++)
{
if(a[i]-start<mid)sum++;
else start=a[i];
}
if(a[i]-start<mid) sum++;

if(sum>M)return false;//距离太大
else return true;

}

int main()
{
int i,left,right,mid,ans;
while(scanf("%d%d%d",&L,&N,&M)!=EOF)
{
for(i=1;i<=N;i++)
scanf("%d",&a[i]);

a[N+1]=L;
sort(a+1,a+N+1);

left=0;
right=L;
while(left<=right)
{
mid=(left+right)/2;

if(can_cross(mid))
{
left=mid+1;
ans=mid;
}
else right=mid-1;
}
printf("%d\n",ans);

}
return 0;

}

 

posted @ 2011-11-18 20:09  快乐.  阅读(226)  评论(0编辑  收藏  举报