【最大最小值】

描述

凯亚建造了一个有N(2<=N<=100,000)个隔间的养猪场,这些隔间分布在一条直线上,坐标是x1,...,xN (0<=xi<=1,000,000,000)。

他的C(2<=C<=N)头猪不满于隔间的位置分布,它们为猪圈里其他的猪的存在而愤怒。为了防止猪之间的互相打斗,凯亚想把这些猪安置在指定的隔间,所有猪中相邻两头的最近距离越大越好。那么,这个最大的最近距离是多少呢?

输入

第1行:两个用空格隔开的数字N和C。

第2行:N个整数,表示每个隔间的坐标。

输出

输出只有一行,即相邻两头猪最大的最近距离。

输入样例 1 

5 3
1 2 8 4 9 

输出样例 1

3

思路:样例为例。猪圈排序后。可以看出两个猪之间的距离范围为1~8.接下来就要二分缩小范围。

mid = 4.第一头猪肯定要放第一个隔间。

比较第二个隔间和第一头猪的距离,差值小于mid,不能放。比较第三个隔间和第一头猪的位置,差值小于mid,不能放。比较第四个隔间和第一头猪的位置,差值>mid.可以放,放第二头猪。比较第五个隔间与第二头猪的距离,差值小于mid,不能放。所以总归才放2头猪,说明距离如果为4就太大了,放不下三头猪。

那范围就在1~3之间。

mid = 2.第一头猪肯定要放第一个隔间。

比较第二个隔间和第一头猪的距离,差值小于mid,不能放。比较第三个隔间和第一头猪的位置,差值>mid,可以放,放第二头猪。比较第四个隔间和第二头猪的位置,差值>mid.可以放,放第三头猪。比较第五个隔间与第三头猪的距离,差值小于mid,不能放。所以总共能放3头猪,说明距离为2的话是可以的,

那现在知道最大的范围应该出现在3~3了。

mid = 3.第一头猪放第一个隔间。

比较第二个隔间和第一头猪的距离,差值小于mid,不能放。比较第三个隔间和第一头猪的位置,差值==mid,可以放,放第二头猪。比较第四个隔间和第二头猪的位置,差值>mid.可以放,放第三头猪。比较第五个隔间与第三头猪的距离,差值小于mid,不能放。所以总共能放3头猪,说明距离为3的话是可以的。

接下来left+1>right.

所以最后left == right =3的。所以最大的距离就是3.

程序如下:

#include<iostream>
#include<algorithm>
using namespace std;
int a[100011];
int n,c;
int check(int x){
    int cnt=1,last=a[1];
    for(int i=2;i<=n;i++){
        if(a[i]-last>=x){
            cnt++;
            last=a[i];
        }
    }
    if(cnt>=c)
        return 1;
    else
        return 0;
}

int main(){

    cin>>n>>c;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    sort(a+1,a+1+n);
    int left=1,right=a[n]-a[1];
    int mid;
    while(left<=right){
        mid=(left+right)/2;
        if(check(mid)) left=mid+1;
        else right=mid-1;
    }
    cout<<right;
    return 0;
}
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值