USACO 2016 Jan Silver 愤怒的奶牛(Angry Cows)

原题目 数据 正解

【题目描述】
奶牛Bessie设计了一个游戏:“愤怒的奶牛”。游戏的原型是:有一些可爆炸的草堆分布在一条数轴的某些坐标上,玩家用弹弓把一头奶牛发射到数轴上。奶牛砸到数轴上的冲击波会引发附近的草堆爆炸。游戏的目标是玩家用一些奶牛炸掉所有的草堆。
N 个草堆在数轴的不同位置,坐标为 x1,x2,.,xn 。如果玩家以能量R把奶牛发射到坐标 x ,就会引爆半径 R 及以内的的草堆,即坐标范围 [xR,x+R] 的草堆都会燃爆。
现在有 K 头奶牛,每头奶牛的能量都是 R ,请计算如果要引爆所有的草堆,最小的 R 是多少?
【输入格式】
第一行:2个整数 N(1N50,000) K(1K10)
下面有N行,每行一个整数: x1,x2,,xn ,范围在 [01,000,000,000]
【输出格式】
输出最小可能的 R

#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;
}

你可能感兴趣的:(二分查找,USACO)