疯牛
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
4
-
描述
-
农夫 John 建造了一座很长的畜栏,它包括N (2 <= N <= 100,000)个隔间,这些小隔间依次编号为x1,...,xN (0 <= xi <= 1,000,000,000).
但是,John的C (2 <= C <= N)头牛们并不喜欢这种布局,而且几头牛放在一个隔间里,他们就要发生争斗。为了不让牛互相伤害。John决定自己给牛分配隔间,使任意两头牛之间的最小距离尽可能的大,那么,这个最大的最小距离是什么呢?-
输入
-
有多组测试数据,以EOF结束。
第一行:空格分隔的两个整数N和C
第二行——第N+1行:分别指出了xi的位置
输出
- 每组测试数据输出一个整数,满足题意的最大的最小值,注意换行。 样例输入
-
5 3 1 2 8 4 9
样例输出
-
3
#include <iostream> #include <cstdlib> #include <string> #include <string.h> #include <cmath> #include <algorithm> using namespace std; #define MAXN 100000 + 10 int n, m; int temp[MAXN]; int ans[MAXN]; bool check(int flag) { int num = 0, t = temp[0]; for (int i = 1; i < n; i++) { if (temp[i] - t >= flag) { num++; t = temp[i]; } if (num >= m - 1) { break; } } if (num >= m - 1) { return true; } else { return false; } } void solve() { sort(temp, temp + n); int low = 0, high = temp[n - 1] - temp[0]; while (low <= high) { int mid = (low + high) >> 1; if (check(mid)) { low = mid + 1; } else { high = mid - 1; } } cout << low - 1 << endl; } void input() { while (cin >> n >> m) { int a = 0; for (int i = 0; i < n; i++) { cin >> temp[i]; } solve(); } } int main() { std::ios::sync_with_stdio(false); input(); return 0; }
-
有多组测试数据,以EOF结束。