1. 程式人生 > >[貪心]二分法解決最小值最大化問題經典例題-POJ2456瘋牛

[貪心]二分法解決最小值最大化問題經典例題-POJ2456瘋牛

題意:有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;
}