1. 程式人生 > >POJ 2456 Aggressive cows(二分搜尋,最大化最小值)

POJ 2456 Aggressive cows(二分搜尋,最大化最小值)

Aggressive cows

Time Limit:1000MS

Memory Limit:65536K

Total Submissions:9062

Accepted:4504

Description

Farmer John has built a new long barn, with N (2 <= N <= 100,000) stalls. The stalls are located along a straight line at positions x1,...,xN (0 <= xi <= 1,000,000,000).

His C (2 <= C <= N) cows don't like this barn layout and become aggressive towards each other once put into a stall. To prevent the cows from hurting each other, FJ want to assign the cows to the stalls, such that the minimum distance between any two of them is as large as possible. What is the largest minimum distance?

Input

* Line 1: Two space-separated integers: N and C

* Lines 2..N+1: Line i+1 contains an integer stall location, xi

Output

* Line 1: One integer: the largest minimum distance

Sample Input

5 3
1
2
8
4
9

Sample Output

3

Hint

OUTPUT DETAILS:

FJ can put his 3 cows in the stalls at positions 1, 4 and 8, resulting in a minimum distance of 3.

Huge input data,scanf is recommended.

題意:在有N間牛舍的小屋中,第i個牛舍在xi的位置上,農夫擁有的M頭牛,彼此間會經常攻擊。所以需要把每頭牛都放在離其他牛儘可能遠的牛舍。也就是要最大化最近的兩頭牛之間的距離。

題解:我們設d為最近兩頭牛之間的距離,按照題意我們要使d的值最大。可以使用二分搜尋法。先對牛舍的位置x進行排序,把第一頭牛放入x0的牛舍。如果第i頭牛放入了xj中,第i+1頭牛就要放入滿足xj+d<=xk的最大的xk中。

程式碼如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,a[100010];

bool dis(int d)
{
	int k=0,next,i;
	for(i=1;i<m;++i)
	{
		next=k+1;
		while(next<n&&a[next]-a[k]<d)
			next++;
		if(next==n)
			return false;
		k=next;	
	}
	return true;
}

int main()
{
	int i;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		int INF=0;
		for(i=0;i<n;++i)
		{
			scanf("%d",&a[i]);
			if(INF<a[i])
				INF=a[i];
		}
		sort(a,a+n);
		int left=0,right=INF+1,mid;
		while(right-1>left)
		{
			mid=(left+right)/2;
			if(dis(mid))
				left=mid;
			else
				right=mid;
		}
		printf("%d\n",left);	
	}
	return 0;
}