3258 River Hopscotch acm.pku.edu.cn/JudgeOnline/problem
/*
用二分法查找,求得最适合的key值。
0--l之间有N个石头,删除M个,使得任意两个石头之间的距离增大,并且求出增大后的最小距离的最大值。不考虑起点和终点。
起点为0 ,终点为l.
如果M==0就输出距离的最大值!
Sample Input
25 5 2
2
14
11
21
17
Sample Output
4
*/
#include <cstdio>
#include <algorithm>
using namespace std;
long int l,n,m,d[50005];
bool judgement(int mid)
{
int pf,num,i;/*pf==0表示是起点*/
pf=0;
num=0;
for(i=0;i<n;i++)
{
if(d[i] - pf < mid) num++; /*可以想象成距离为mid,小于mid的边不加入,大于或者等于的加入其中,并且以加入的点作为下一条边的起点*/
else pf = d[i];
}
if(l - pf < mid) num++; /*终点将不再作为起点*/
if(num <= m) return true; /*返回true,如果num<m表示mid还可以更大一些,=m表示也许就是这个mid,但是也有扩展的空间*/
else return false;/*表示mid应该更小一些才能满足条件*/
}
int sloveproblems()
{
long int min,max,keyword,i,mid;
for(i=0;i<n;i++)
scanf("%ld",&d[i]);
sort(d,d+n);
if(n==0){ printf("%d/n",l); return 0;}
min=0;
max=l;
keyword=0;
while(min<=max)/*二分法求key值*/
{
mid = ( min + max )/2;
if(judgement(mid))
{
keyword = mid;
min = mid + 1;
}
else max = mid - 1;
}
printf("%ld/n",keyword);
}
int main()
{
while(scanf("%ld%ld%ld",&l,&n,&m)!=EOF)
{
sloveproblems();
}
return 0;
}
wrong了我好几次,最后还是看了别人的二分法过的!哎~要努力啊!