[貪心]二分法解決最小值最大化問題經典例題-POJ2456瘋牛
阿新 • • 發佈:2019-02-12
題意:有n個牛欄,選m個放進牛,相當於一條線段上有 n 個點,選取 m 個點,使得相鄰點之間的最小距離值最大。
首先給出n個牛棚的位置,那麼每個牛棚之間的最小距離是和相鄰兩個牛棚之間的距離。因此,先給牛棚的位置排個序。將第一頭牛放在0號位置,二分法不斷縮排距離d,如果前一頭牛放到了xi處,就要將下一頭放到滿足xi+d<=xj的最小的xj處。這樣保證最近的兩頭牛之間的距離都不會比當前的最小值小,如果每個都能滿足這樣放就可以作為最小值。
#include<iostream> #include<algorithm> using namespace std; int v[100005]; int n, c; int check(int d) { int tmp = v[0], cnt = 1; for (int i = 1; i < n; i++) { if (v[i] - tmp >= d) { cnt++; tmp = v[i]; } } if (cnt >= c) return 1; return 0; } int main() { while (cin >> n >> c) { for (int i = 0; i < n; i++) cin >> v[i]; sort(v, v + n); int l = 0, r = v[n - 1], mid; while (l <= r) { mid = (l + r) / 2; if (check(mid)) l = mid + 1; else r = mid - 1; } printf("%d\n", r); } return 0; }