【题目描述】
奶牛Bessie设计了一个游戏:“愤怒的奶牛”。游戏的原型是:有一些可爆炸的草堆分布在一条数轴的某些坐标上,玩家用弹弓把一头奶牛发射到数轴上。奶牛砸到数轴上的冲击波会引发附近的草堆爆炸。游戏的目标是玩家用一些奶牛炸掉所有的草堆。
有 N 个草堆在数轴的不同位置,坐标为x1,x2,….,xn 。如果玩家以能量R把奶牛发射到坐标 x ,就会引爆半径R 及以内的的草堆,即坐标范围 [x−R,x+R] 的草堆都会燃爆。
现在有 K 头奶牛,每头奶牛的能量都是R ,请计算如果要引爆所有的草堆,最小的 R 是多少?
【输入格式】
第一行:2个整数N(1≤N≤50,000) 和 K(1≤K≤10) 。
下面有N行,每行一个整数: x1,x2,…,xn ,范围在 [0…1,000,000,000] 。
【输出格式】
输出最小可能的 R <script type="math/tex" id="MathJax-Element-52">R</script>。
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int N, K;
cin>>N>>K;
int loc[N+2];
for (int i=0; i<N; i++)
cin>>loc[i];
sort(loc, loc+N);
int llim = 0;
int rlim = (loc[N-1] - loc[0] + 1) / K + 1;
while (llim+1 < rlim) {
int mid = (llim+rlim) >> 1;
int used = 0;
int lp = 0;
while(lp < N) {
used++;
int curr = lp+1;
for (; curr < N && loc[curr] - loc[lp] <= 2*mid; curr++);
lp = curr;
}
if (used <= K)
rlim = mid;
else
llim = mid;
}
cout<<rlim<<endl;
return 0;
}