题目:
Aggressive cows ( POJ No.2456 )
农夫约翰搭了一间有N间牛舍的小屋。牛舍排在一条线上,第i号牛舍在x的位置。但是他的M头牛对小屋很不满意,因此经常互相攻击。约翰为了防止牛之间互相伤害,因此决定把每头牛都放在离其他牛尽可能远的牛舍。也就是要最大化最近的两头牛之间的距离。
①限制条件
●2≤N≤100000
●2≤M≤N
●0≤xi≤10^9
输入
N=5
M= 3
x= {1,2,8,4,9}
输出
3 (在位置1, 4, 9的牛舍中放入三头牛)
分析:
类似的最大化最小值或者最小化最大值的问题,通常用二分搜索法就可以很好地解决。我们定义
Cmp(d):=判断是否所有牛的位置使得最近的两头牛的距离不小于d
那么问题就变成了求满足Cmp(d)的最大的d。另外,最近的间距不小于d也可以说成是所有牛的间距都不小于d,因此就有
C(d)=可以安排牛的位置使得任意的牛的间距都不小于d
这个问题的判断使用贪心法便可非常容易地求解。
■对牛舍的位置x进行排序
■把第一头牛放入x的牛舍
■如果第i头牛放入了x的话,第i+1头牛就要放人满足x+d≤x的最小的x中
对x的排序只需在最开始时进行一次就可以了, 每一次判断对每头牛最多进行一次 处理,因此复杂度是0(N)。