题面
题目
题目描述 农夫 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;
if (check(mid))
{
l = mid;
}
else
{
r = mid - 1;
}
}
cout << l << endl;
return 0;
}
总结
二分,简单却又高深。
|