题目链接: POJ 2456 Aggressive cows
题目大意:
有N间牛舍,C头牛。
N间牛舍在一条直线上, 位置分别为 x1,x2,...xn ,把C头牛放进其中的C间牛舍,要最大化最近的两头牛之间的距离。条件限制:
2≤N≤100000
2≤M≤N
0≤xi≤109
Input
Line 1: Two space-separated integers: N and C
Lines 2..N+1: Line i+1 contains an integer stall location, xi
Output
- Line 1: One integer: the largest minimum distance
Sample Input
5 3
1
2
8
4
9
Sample Output
3
Hint
OUTPUT DETAILS:
FJ can put his 3 cows in the stalls at positions 1, 4 and 8, resulting in a minimum distance of 3.
Huge input data,scanf is recommended.
题解:
用二分法来最大化最小值。
用函数 is_ok(int m) := 可以安排牛的位置使得最近的两头牛之间的距离大于等于m
然后用二分查找m的最大值。
代码:
#include <iostream>
#include <algorithm>
#define MAXN 100010
using namespace std;
typedef long long ll;
int N, C;
ll x[MAXN];
bool is_ok(int m) {
int i = 0, cnt = 1;
ll current = x[i];
while (i < N && cnt < C) {
for (; i < N; i++) {
if (x[i] - current >= m) {
current = x[i];
cnt++;
break;
}
}
}
if (cnt >= C) return true;
else return false;
}
int solve() {
ll l = 1, r = x[N-1] - x[0];
while (l < r) {
ll mid = (l+r+1)/2;
if (is_ok(mid)) l = mid;
else r = mid-1;
}
return l;
}
int main() {
std::ios::sync_with_stdio(false);
cin >> N >> C;
for (int i = 0; i < N; i++)
cin >> x[i];
sort(x, x+N);
cout << solve() << endl;
return 0;
}