疯牛
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
4
-
描述
-
农夫 John 建造了一座很长的畜栏,它包括N (2 <= N <= 100,000)个隔间,这些小隔间依次编号为x1,...,xN (0 <= xi <= 1,000,000,000).
但是,John的C (2 <= C <= N)头牛们并不喜欢这种布局,而且几头牛放在一个隔间里,他们就要发生争斗。为了不让牛互相伤害。John决定自己给牛分配隔间,使任意两头牛之间的最小距离尽可能的大,那么,这个最大的最小距离是什么呢?-
输入
-
有多组测试数据,以EOF结束。
第一行:空格分隔的两个整数N和C
第二行——第N+1行:分别指出了xi的位置
输出
- 每组测试数据输出一个整数,满足题意的最大的最小值,注意换行。 样例输入
-
5 3 1 2 8 4 9
样例输出
-
3
-
有多组测试数据,以EOF结束。
/* 例如 : 5 3 1 2 4 8 9
要找几头牛 之间的距离尽可能的大,显然第一个数 1 ,必须占第一个位置,然后再找两个位置。
利用二分搜索查找。
01.
#include <stdio.h>
02.
#include <stdlib.h>
03.
#define M 1000001
04.
int
a[M];
05.
int
n,m,i;
06.
int
fun2(
int
x)
07.
{
08.
int
j=a[0],k=0;
09.
for
(i=1;i<n;i++)
10.
{
11.
if
(a[i]-j>=x) //从里面找大于传过来的 二分 中间值
12.
{
13.
k++;
14.
j=a[i];
15.
}
16.
if
(k>=m-1) //因为 第一个数必须占 一个位置,所以再找 m-1 个位置就ok 了
17.
return
1;
18.
}
19.
return
0;
20.
}
21.
int
fun1() //利用二分法 查找
22.
{
23.
int
left=0;
24.
int
right=a[n-1]-a[0];
25.
while
(left<=right)
26.
{
27.
int
mid=(left+right)/2;
28.
if
(fun2(mid))
29.
{
30.
left=mid+1;
31.
}
32.
else
33.
right=mid-1;
34.
}
35.
return
left-1;
36.
37.
}
38.
int
cmp(
const
void
*a,
const
void
*b)
39.
{
40.
return
*(
int
*)a - *(
int
*)b;
41.
}
42.
int
main()
43.
{
44.
while
(
scanf
(
"%d %d"
,&n,&m)!=EOF)
45.
{
46.
for
(i=0;i<n;i++)
47.
{
48.
scanf
(
"%d"
,&a[i]);
49.
}
50.
qsort
(a,n,
sizeof
(
int
),cmp); //输入的数从小到大排序
51.
printf
(
"%d\n"
,fun1());
52.
}
53.
return
0;
54.
}