原题链接
题面
题目
题目描述
农夫 John 建造了一座很长的畜栏,它包括N(2≤N≤100,000)个隔间,这些小隔间依次编号为x1,…,xN(0≤xi≤1,000,000,000). 但是,John的C(2≤C≤N)头牛们并不喜欢这种布局,而且几头牛放在一个隔间里,他们就要发生争斗。为了不让牛互相伤害。John决定自己给牛分配隔间,使任意两头牛之间的最小距离尽可能的大,那么,这个最大的最小距离是什么呢
输入
第一行:空格分隔的两个整数N和C;
第二行—第N+1行:i+1行指出了xi的位置。
输出
一个整数,最大的最小值。
样例输入
5 3
1 2 8 4 9
样例输出
3
提示
把牛放在1,4,8这样最小距离是3。
思路
贪心的思路,第一头牛一定放在第一间牛舍里面,然后二分最短距离,看在当前最短下,最多能放几头牛,进行二分。
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 10;
int a[N], b[N];
int n, m;
bool check(int x)
{
int la = a[1];
int sum = 1;
for (int i = 2; i <= n; i ++ )
{
if (a[i] - la >= x)
{
sum ++;
la = a[i];
}
}
return sum >= m;
}
signed main()
{
cin >> n >> m;
for (int i = 1; i <= n; i ++ )
{
cin >> a[i];
}
sort(a + 1, a + 1 + n);
int l = 0, r = 1e9;
while (l < r)
{
int mid = l + r + 1>> 1; //+1防止陷入死循环
// cout << l << " " << r << endl;
if (check(mid))
{
l = mid;
}
else
{
r = mid - 1;
}
}
cout << l << endl;
return 0;
}
总结
二分,简单却又高深。