题目链接:https://ac.nowcoder.com/acm/contest/918/I
思路:题目让求最大的最小值很容易想到二分答案,二分奶牛等待的时间,先一下,如果当前奶牛之前没有坐车,就坐一辆车,如果当前奶牛的时间与第一头上车的奶牛时间差在以内,且容量够,则上车,否则另开一辆车,最后得到所需车的数量,如果车的数量小于则合法。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 7;
#define ll long long
int n, m, c, t[N];
int check(int k)
{
int sum = 0, cnt = 0, tmp = 0;
for(int i = 0; i < n; i++)
{
if(t[i] - tmp <= k && sum < c && i != 0)
sum++;
else sum = 1, cnt++, tmp = t[i];
}
return cnt <= m;
}
int main()
{
scanf("%d%d%d",&n,&m,&c);
for(int i = 0; i < n; i++)
scanf("%d",&t[i]);
sort(t, t + n);
int l = 0, r = t[n-1] - t[0];
while(l < r)
{
int m = (l + r) >> 1;
if(check(m)) r = m;
else l = m + 1;
}
cout << l << endl;
}