1. 程式人生 > >H - Aggressive cows (POJ - 2456)

H - Aggressive cows (POJ - 2456)

names out 因此 之間 rt+ 枚舉 i++ 問題 滿足

- 題目大意

農夫約翰搭了一間有n間牛舍的小屋。牛舍排在一條線上第i號牛舍在xi的位置。但是他的m頭牛對小屋很不滿意,因此經常互相攻擊。約翰為了防止牛之間互相傷害,因此決定把每頭牛都放在離其他牛盡可能遠的牛舍。

- 解題思路

很明顯是一個最大值最小化的問題,因此我們可以假設C(d)為滿足所有牛之間的距離都不小於d。先對牛舍的位置排序,然後二分枚舉d,尋找滿足條件的d。

- 代碼

#include<iostream>
#include<algorithm>
using namespace std;
const int MAX = 100001;
int n, m;
int num[MAX];

bool find(int d)
{
	int last = 0;
	for (int i = 1; i < m; i++)
	{
		int crt = last + 1;
	while (crt < n&&num[crt] - num[last] < d)
	{
		crt++;
	}
	if (crt == n)
		return false;
	last = crt;
}
	return true;
}
int main()
{
	cin >> n >> m;;
		for (int i = 0; i < n; i++)
			cin >> num[i];
		sort(num, num + n);
		int lb = 0,ub = (num[n-1]-num[0])/(m-1);
		while(ub-lb>1)
		{
			int mid = (lb + ub) / 2;
			if (find(mid))
				lb = mid;
			else
				ub = mid;
		}
		cout << lb<<endl;
	return 0;
}

  

H - Aggressive cows (POJ - 2456)