#3415. 愤怒的奶牛 / 最大最小距离
愤怒的奶牛 / 最大最小距离
M9A???. 愤怒的奶牛 / 最大最小距离
题目背景
原题来自 USACO 2005 Feb. Gold。
农夫约翰建造了一排牛舍,共有 n 个牛舍,位置分别为 x_i。现在要把 m 头牛放进这些牛舍中,每个牛舍最多放一头牛。
由于奶牛之间容易互相攻击,约翰希望把它们安排得尽可能分散。也就是说,希望 任意两头牛之间的最小距离尽可能大。
请你求出这个“最小距离”的最大值。
题目描述
给定 n 个牛舍的位置 x_i,以及 m 头牛。
请把这 m 头牛放入这些牛舍中,使得:
- 每个牛舍最多放一头牛;
- 设所有已放入奶牛的两两距离中的最小值为
d; - 需要让这个
d尽可能大。
输出这个最大的最小距离。
输入格式
第一行两个整数 n, m。
第二行 n 个整数 x_i,表示每个牛舍的位置。
输出格式
输出一个整数,表示最大的最小距离值。
样例 #1
输入
5 3
1 2 8 4 9
输出
3
样例说明
先将牛舍位置排序后得到:
1 2 4 8 9
如果把 3 头牛放在位置 1、4、8 的牛舍中,那么最近两头牛之间的距离为:
4 - 1 = 38 - 4 = 4
最小值为 3。
可以证明,不存在一种放法使这个最小值大于 3,所以答案是 3。
数据范围
对于 100% 的数据,保证:
2 ≤ n ≤ 10^52 ≤ m ≤ n0 ≤ x_i ≤ 10^9
提示
这是一个经典的 二分答案 问题。
思路概述
- 先将牛舍位置从小到大排序;
- 二分枚举答案
d,表示“最近两头牛之间的最小距离至少为d是否可行”; - 贪心检查:
- 第一头牛放在最左边的牛舍;
- 之后每头牛都尽量放在当前能放的最左边牛舍;
- 如果最终能放下至少
m头牛,说明这个d可行;
- 二分求出最大的可行值。
参考复杂度
- 排序:
O(n log n) - 每次检查:
O(n) - 总复杂度:
O(n log V),其中V为坐标范围
输入输出约定
- 输入数据中牛舍位置不一定有序;
- 输出仅一个整数,不要输出多余空格或文字。