POJ 3258 River Hopscotch 二分
题意:移石头,两个岩石之间的距离为D,从一个岩石出发跳到另一个岩石,
找最大化的最短距离。
从一个石头i开始,跳到岩石j,i到j之间距离如果大于mid,则把i与j之间的(j-i-1)个石头全部移走
否则,j继续++
如果移走的石头小于等于m,证明mid太小了,需要大一点的mid
如果移走的石头大于m,证明mid太大了,需要小一点的mid
注意:首先要对数组进行排序
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std;
int l,n,m;
int a[50010];
int main()
{
scanf("%d%d%d",&l,&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
sort(a+1,a+1+n);
a[0]=0;
a[n+1]=l;
int L=0,R=l+1;
while(R-L>1)
{
int mid=L+(R-L)/2;
int p=0;
int i=0;
while(i<=n)
{
int j=i+1;
while(j<=n+1 && a[j]-a[i]<mid)
{
j++;
}
p+=j-i-1;
i=j;
}
if(p<=m)
{
L=mid;
// cout<<"L="<<L<<endl;
}
else
{
R=mid;
// cout<<"R="<<R<<endl;
}
}
printf("%d\n",L);
return 0;
}