H

- 题目大意

    农夫约翰搭了一间有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;
}

  

原文地址:https://www.cnblogs.com/alpacadh/p/8449417.html