原题链接
有一个神奇的盒子,它有N (2 <= N <= 1e5)个空间,这些空间依次编号为a1,…,aN (0 <= ai <= 1e9). 有x (2 <= x <= N)巧克力,如果多个巧克力放在一个空间就会爆炸。为了不让巧克力爆炸。我们需要使任意两个巧克力之间的最小距离尽可能的大,那么,这个最大的最小距离是什么呢?
Input
有多组测试数据,以EOF结束。 第一行:空格分隔的两个整数N和X 第二行——第N+1行:分别指出了ai的位置
Output
每组测试数据输出一个整数,满足题意的最大的最小值,注意换行。
Sample Input
5 3
1
2
8
4
9
Sample Output
3
Hint
1位置放一个巧克力,4位置放一个巧克力,它们的差值为3;最后一个巧克力放在8或9位置都可以,和4位置的差值分别为4、5,和1位置的差值分别为7和8,不比3小,所以最大的最小值为3。
题目描述
有n个盒子(每个盒子都有编号),m个巧克力,那么你需要将m个巧克力放在n个盒子中,并得到盒子之间最大差值的最小值
思路:我们可以将最大盒子编号与最小盒子编号作为一个区间,使用二分法,不断去查找满足要求的最大差值,只要某个差值 d 满足 x[i+1] - x[i] >= d
代码如下
#include <algorithm>
#include <stdio.h>
#define N 100005
using namespace std;
int x[N],n,m;
int check(int mid)
{
int i,c = 1,last = 0;
for(i = 1;i < n;i++)
{
if(x[i] - x[last] >= mid)
{
last = i;
c++;
}
}
if(c >= m)
return 1;
return 0;
}
int main()
{
int i;
scanf("%d %d",&n,&m);
for(i = 0;i < n;i++)
scanf("%d",&x[i]);
sort(x, x+n);
int l = 0, r = x[n-1], mid, ans;
while(l <= r)
{
mid = (l+r) / 2;
if(check(mid))
{
ans = mid;
l = mid + 1;
}
else
r = mid - 1;
}
printf("%d\n",ans);
return 0;
}