这一题,也是简单的二分搜索,求解放置的牛之间的距离尽可能远,也就是最大化最小值。
主要的一步就是将第i头牛放在了x[j]的位置中,第i + 1 头牛就要放在满足x[j] + d < x [k],k的最小值。
下面是AC的代码:
#include <iostream> #include <algorithm> using namespace std; int N, M; int X[100005]; bool C(int x) { int last = 0; for(int i = 1; i < M; i++) { int cur = last + 1; while(cur < N && X[cur] - X[last] < x) //满足X[last] + x > X[cur]的最小的cur。 { cur++; } if(cur == N) return false; last = cur; } return true; } void solve() { sort(X, X + N); int left = 0, right = 10000000; //距离在0到10000000之间搜索 while(left + 1 < right) //二分搜索 { int mid = (left + right) / 2; if(C(mid)) left = mid; else right = mid; } cout << left << endl; } int main() { while(cin >> N >> M) { for(int i = 0; i < N; i++) cin >> X[i]; solve(); } return 0; }
北大ACM2456——Aggressive cows~~二分搜索
原文:http://blog.csdn.net/qq_25425023/article/details/45399675