【二分和三分】愤怒的牛

题目描述

农夫约翰建造了一座有n间牛舍的小屋,牛舍排在一条直线上,第i间牛舍在xi的位置,但是约翰的m头牛对小屋很不满意,因此经常互相攻击。约翰为了防止牛之间互相伤害,因此决定把每头牛都放在离其它牛尽可能远的牛舍。也就是要最大化最近的两头牛之间的距离。
牛们并不喜欢这种布局,而且几头牛放在一个隔间里,它们就要发生争斗。为了不让牛互相伤害。John决定自己给牛分配隔间,使任意两头牛之间的最小距离尽可能的大,那么,这个最大的最小距离是多少呢?

 

输入

第一行用空格分隔的两个整数n和m;
第二行为n个用空格隔开的整数,表示位置xi。

 

输出

输出仅一个整数,表示最大的最小距离值。

 

样例输入

5 3
1 2 8 4 9

 

样例输出

3

 

提示

把牛放在1,4,8这样最小距离是3

2≤n≤105 , 0≤xi≤109, 2≤m≤n

#include <iostream>

#include<bits/stdc++.h>

using namespace std;

int a[100050];

int main()

{

    int n,c;

    scanf("%d %d",&n,&c);

    for(int i=1;i<=n;i++)

    {

        scanf("%d",&a[i]);

    }

    sort(a+1,a+1+n);

    int le=0,ri=a[n];

    while(le<=ri)

    {

        int mid=(le+ri)>>1;

        int ans=1;

        int k=mid+a[1];

        for(int i=2;i<=n;i++)

        {

            if(a[i]>=k)

            {

                ans++;

                k=mid+a[i];

            }

        }

        if(ans>=c)

        {

            le=mid+1;

        }

        else

        {

            ri=mid-1;

        }

    }

    printf("%d\n",le-1);

    return 0;

}

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值