http://acm.hdu.edu.cn/showproblem.php?pid=4004
一条线段长度为L,线段上有n个点,最多选取 m-1 个点,使得包括线段端点在内的相邻点之间的最大距离值最小。
最大值最小化问题,显然二分
judge每次选最远点,选出点数不超过m即可
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string.h>
#include<queue>
using namespace std; int st[500010],len,n,m,i,j,maxx,fuck,x,flag,left,right,mid;
bool judge(int cao)
{
int dis = 0, count = 1, i;
if(st[0] - dis > cao)
return 0;
for(i = 1; i <= n; i++)
{
if(st[i] - dis > cao)
{
dis = st[i-1];
if(st[i]-dis > cao)
return 0;
count++;
}
}
if(count > m)
return 0;
return 1;
} int main()
{
while(~scanf("%d%d%d",&len,&n,&m))
{
memset(st,0,sizeof(st));
for(i = 1;i <= n;i++) scanf("%d",&st[i]);
sort(st,st+n+1);
n++;
fuck = n - m; st[n] = len;
int left = 0,right = len;
while(left < right)
{
mid = (left + right)/2;
if(judge(mid)) right = mid;
else left = mid+1;
}
printf("%d\n",right);
}
return 0;
}