问题描述:
有n个摊位,坐标分别为x1,x2...xn
从中选择c个摊位,使这c个摊位任意两个之间的最小距离最大
可以换一个角度思考:选择一个距离x 代表这c个选择的摊位中的最小距离
我们要使用二分法搜索的就是满足条件的最大x
令C(x):满足条件的最大x 这里需要满足的条件是:由于我们选择的摊位最小距离为x 那么我们必须保证这n个摊位中可以找到c个摊位,使相邻的2个摊位的距离大于等于x
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int stall[100000 + 5];
const int INF = 1000000000;
int n ,c;
bool C(int x)
{
int num = 0;
num = 1;
int now = stall[0];
for(int i= 1 ;i<n ;i++)
{
if(stall[i] >= now + x)
{
now = stall[i];
num++;
if(num >=c)
return true;
}
}
return false;
}
int main()
{
scanf("%d %d",&n,&c);
for(int i = 0;i<n;i++)
{
scanf("%d",&stall[i]);
}
sort(stall,stall +n);
int l = 0;int r = INF;
for(int i = 0;i<100;i++)
{
int mid = (l+r)/2;
if(C(mid)) l = mid;
else
r = mid;
}
printf("%d\n",l);
}
由于我们要解决的是满足条件的最大值
也就是用二分搜索法解决最大化问题
因此当满足条件时,应把区间由(l,r)改为(mid,r),