Aggressive Cows PKU 2456 二分法 最大化最小值

原题

         攻击的牛

题目描述:

         农夫约翰搭了一间牛棚,有N个牛舍。牛舍排在一条线上,第i号牛舍在xi的位置。但是他的M头牛对小屋不满意,因此经常相互攻击。约翰为了防止牛之间相互伤害,因此决定把每头牛都放在离其他牛尽可能远的牛舍。也就是要最大化最近的两头牛之间的距离.

解题思路:

     1.对牛舍位置从小到大排序。

     2.把第一头牛放在 x0 处。

     3.把第 i 头牛放在 xj 处的话,第 i+1 头牛就应该放在 大于等于  x0+d  处。( d 为两头牛的距离)

Input 

5 3
1 2 8 4 9

Output

3

用二分法枚举 d 的大小,寻求最适合的距离

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 100000005;
int a[maxn];
int main(){
	int n,c;
	scanf("%d%d",&n,&c);
	for(int i = 0;i < n;i++){
		scanf("%d",&a[i]);
	}
	sort(a,a+n);   //对牛舍位置从小到大排序
	int r,l,mid;
	l = 0;
	r = a[n-1]+1;
	while(l +1 < r){
		int sum = 1;
		int mid = (l + r) / 2;
		int last = 0;
		for(int i = 1;i < n;i++){    // 判断该距离 d 是否能放得下 C 头牛
		    if(a[i] - a[last] > mid){
			  sum++;               //sum 为距离 d 放下的牛的数量
			  last = i;
		    }
		}
		if(sum < c){   //如果不能够满足 C 头牛的情况
		    r = mid;   //距离减少
		}
		else{          //如果能满足  C 头牛的情况
		    l = mid;   // 距离增加
		}
	}
	printf("%d\n",r);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/error311/article/details/81241172