[BZOJ4525] [Usaco2016 Jan]Angry Cows

题目描述

Description

奶牛Bessie设计了一个游戏:“愤怒的奶牛”。游戏的原型是:有一些可爆炸的草堆分布在一条数轴的某些坐标上,玩家用弹弓把一头奶牛发射到数轴上。奶牛砸到数轴上的冲击波会引发附近的草堆爆炸。游戏的目标是玩家用一些奶牛炸掉所有的草堆。
有N个草堆在数轴的不同位置,坐标为x1,x2,….,xn。如果玩家以能量R把奶牛发射到坐标x,就会引爆半径R及以内的的草堆,即坐标范围[x−R,x+R]的草堆都会燃爆。
现在有K头奶牛,每头奶牛的能量都是R,请计算如果要引爆所有的草堆,最小的R是多少?

Input

第一行:2个整数N(1≤N≤50,000)和K(1≤K≤10)。
下面有N行,每行一个整数:x1,x2,…,xn,范围在[0…1,000,000,000]。

Output

输出最小可能的R。

Sample Input

7 2
20
25
18
8
10
3
1

Sample Output

5

题目分析

二分+贪心check 注意:不一定将奶牛正好砸在草堆上

#include <cstdio>
#include <cstring>
#include <set>
#include <map>
#include <vector>
#include <cmath>
#include <queue>
#include <algorithm>
using namespace std;
int n,m;
int x[50010];
int check(int mid)
{
    int num=0;
    for(int i=1;i<=n;)  
    {
        num++;
        int tmp=x[i];
        while(i+1<=n&&x[i+1]-tmp<=mid*2) i++;
        i++;
    }
    return num;
}
int main()
{   
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",&x[i]);
    sort(x+1,x+n+1);
    int l=0,r=1000000000,mid,ans;
    while(l<r)
    {
        mid=(l+r)>>1;
        if(check(mid)<=m) ans=mid,r=mid;
        else l=mid+1;
    }
    printf("%d",ans);
    return 0;
}

发表评论

邮箱地址不会被公开。 必填项已用*标注