Aggressive cows(二分)

POJ - 2456 

有一个神奇的盒子,它有N (2 <= N <= 1e5)个空间,这些空间依次编号为a1,...,aN (0 <= ai <= 1e9). 有x (2 <= x <= N)巧克力,如果多个巧克力放在一个空间就会爆炸。为了不让巧克力爆炸。我们需要使任意两个巧克力之间的最小距离尽可能的大,那么,这个最大的最小距离是什么呢?

Input

有多组测试数据,以EOF结束。 第一行:空格分隔的两个整数N和C 第二行——第N+1行:分别指出了ai的位置

Output

每组测试数据输出一个整数,满足题意的最大的最小值,注意换行。

Sample Input

5 3
1
2
8
4
9

Sample Output

3

Hint

1位置放一个巧克力,4位置放一个巧克力,它们的差值为3;最后一个巧克力放在8或9位置都可以,和4位置的差值分别为4、5,和1位置的差值分别为7和8,不比3小,所以最大的最小值为3。

最小值最大化问题,用二分找很方便,复杂度也低。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
ll a[100010];
int n,k;
int check(int d){
	int last=0;
	for(int i=1;i<k;i++){
		int cur=last+1;
		while(cur<n && a[cur]-a[last]<d)
			cur++;
		if(cur==n) return 0;
		last=cur;
	}
	return 1;
}
int main(){
	while(cin>>n>>k){
		for(int i=0;i<n;i++){
			scanf("%lld",&a[i]);
		}
		sort(a,a+n);
		int l=0,r=INF;
		int mid;
		while(r-l>1){
			mid=(l+r)/2;
			if(check(mid)) l=mid;
			else r=mid;
		}
		printf("%d\n",l);
	} 
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42759455/article/details/82054407