这题就是给出N个点,然后让你把C头牛分别放进去,它们之间距离(平均)越大越好,因为让你输出的是它们之间距离最小的长度。
#include<math.h>
#include<algorithm>
#include<time.h>
#include<stdlib.h>
#include<iostream>
#include<string.h>
#include<map>
#include<list>
#include<string>
#include<queue>
#include<set>
#include<vector>
#include<stack>
#include<limits>
#define re register
#define iosgo() std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define run(i,n) for (int i = 1; i <= n; i++)
#define cin std::cin
#define cout std::cout
#define ll long long
#define endl "\n"
using namespace std;
typedef pair<int, int>pll;
const int N = 2e5 + 10;
pll cc[N];
int h[150][150];
ll x[N], y[N], s[N];
ll gcd(ll a, ll b)
{
return b ? gcd(b, a % b) : a;
}
int a[N];
int n, c;
bool find(int x)
{
int ans = 1, t = a[0];
for (int i = 1; i < n; i++)
{
if (a[i] - t >= x)
{
ans++;
t = a[i];
if (ans >= c)
{
return true;
}
}
}
return false;
}
int solve()
{
int l = 0, r = a[n-1] - a[0], mid;
while (l <= r)
{
mid = (l + r) / 2;
if (find(mid))
{
l = mid + 1;
}
else
{
r = mid - 1;
}
}
return l - 1;
}
int main()
{
iosgo();
cin >> n >> c;
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
sort(a , a + n );
cout << solve();
}