二分距离
判断条件就是从一开始每发现一个>=d时放一头牛,如果能全部放完l=mid,否r=mid-1,mid=(l+r+1)/2。
#include<iostream>
#include<cmath>
#include<iomanip>
#include<algorithm>
using namespace std;
typedef long long ll;
const int Max = 1e6 + 5;
double lst[Max];
int n, m, x;
int check(int d)
{
int last = 1, g = 2;
for (int i = 2;i <= m;i++)
{
while (lst[g] - lst[last] < d&&g<=n)g++;
if (g > n)return 0;
last = g++;
}
return 1;
}
int main()
{
cin >> n >> m;
for (int i = 1;i <= n;i++)cin >> lst[i];
int l = 0, r = 1e9;
sort(lst + 1, lst + 1 + n);
while (l < r)
{
int mid = (l + r + 1) / 2;
if (check(mid)) l = mid;
else r = mid - 1;
}
cout << l << endl;
}