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