POJ - 2456:Aggressive cows(二分查找)

原题链接
有一个神奇的盒子,它有N (2 <= N <= 1e5)个空间,这些空间依次编号为a1,…,aN (0 <= ai <= 1e9). 有x (2 <= x <= N)巧克力,如果多个巧克力放在一个空间就会爆炸。为了不让巧克力爆炸。我们需要使任意两个巧克力之间的最小距离尽可能的大,那么,这个最大的最小距离是什么呢?
Input
有多组测试数据,以EOF结束。 第一行:空格分隔的两个整数N和X 第二行——第N+1行:分别指出了ai的位置
Output
每组测试数据输出一个整数,满足题意的最大的最小值,注意换行。
Sample Input
5 3
1
2
8
4
9
Sample Output
3
Hint
1位置放一个巧克力,4位置放一个巧克力,它们的差值为3;最后一个巧克力放在8或9位置都可以,和4位置的差值分别为4、5,和1位置的差值分别为7和8,不比3小,所以最大的最小值为3。

题目描述

有n个盒子(每个盒子都有编号),m个巧克力,那么你需要将m个巧克力放在n个盒子中,并得到盒子之间最大差值的最小值
思路:我们可以将最大盒子编号与最小盒子编号作为一个区间,使用二分法,不断去查找满足要求的最大差值,只要某个差值 d 满足 x[i+1] - x[i] >= d
代码如下

#include <algorithm>
#include <stdio.h>
#define N 100005
using namespace std;

int x[N],n,m;

int check(int mid)
{
    int i,c = 1,last = 0;
    for(i = 1;i < n;i++)
    {
        if(x[i] - x[last] >= mid)
        {
            last = i;
            c++;
        }
    }
    if(c >= m)
        return 1;
    return 0;
}

int main()
{
    int i;
    scanf("%d %d",&n,&m);
    for(i = 0;i < n;i++)
        scanf("%d",&x[i]);
    sort(x, x+n);
    int l = 0, r = x[n-1], mid, ans;
    while(l <= r)
    {
        mid = (l+r) / 2;
        if(check(mid))
        {
            ans = mid;
            l = mid + 1;
        }
        else
            r = mid - 1;
    }
    printf("%d\n",ans);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值