1. 程式人生 > >Aggressive cows(最大化最小值問題)

Aggressive cows(最大化最小值問題)

Problem 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< br>< br>* 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

題目大意:

//有n個點,給出每個點的位置,然後沒c個點一組,這一組裡的距離的最小值為minn,在若干個這樣的組合中求出各個minn值中的最大值

思路:

將位置排排序,在最小距離和最大的距離中間,進行二分,看看能放的牛的牛棚的個數,和牛的數量比較,然後改變二分的區間。


#if 0
#include<iostream>
#include<cmath>  
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
int a[100005];
int n,c;
int fun(int mid)
{
	int cnt=1,sum=0;
	for(int i=1; i<n; i++)
	{
		if(sum+a[i]-a[i-1]<mid)
		{
			sum+=a[i]-a[i-1];
		}
		else
		{
			sum=0;
			cnt++;	
		}	
	}
	
	if(cnt>=c)
	{
		return 1;	
	}
	else
	{
		return 0;	
	}	
}

int main()
{
	
	while(scanf("%d%d",&n,&c)==2)
	{
		memset(a,0,sizeof(a));
		for(int i=0; i<n; i++)
		{
			scanf("%d",&a[i]);
		}
		
		sort(a,a+n);
		int r=a[n-1]-a[0],l=a[n-1]-a[0];
		
		for(int i=1; i<n; i++)
		{
			if(a[i]-a[i-1]<l)
				l=a[i]-a[i-1];
		}
		
		while(r>=l) 
		{
			int mid=(l+r)/2;     
			if(fun(mid))            //多了 
			{
				l=mid+1;
			}
			else
			{
				r=mid-1;
			}
		}
		
		printf("%d\n",r);
	
	}
}
#endif