二分答案

记得上学那会, Fbs同学经常会欺负萝卜同学。有一次,他出了这么一道题目,想为难一下萝卜同学。题目是这样的: 有N个整数X_i, X_i值的范围从0到1000000000。要从中选出C个数( 2<=C<=N),使得任意两个数差的绝对值的最小值尽可能大,求这个最大值。 由于数据太大, 这次萝卜同学的确被难住了,怎么办呢,请你来帮帮萝卜同学吧!
【输入格式】
第一行是N和C。
接下来的N行,每行一个整数。
【输入格式】
一个整数,表示两两最小差距的最大值。
【输入输出样例】
aggr.in aggr.out
5 3
1
2
8
4
9
3
解题思路:

        二分答案。
ac代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[100005];
int main()
{
    int n,c,i;
    scanf("%d%d",&n,&c);
    for(i = 1;i <= n;i ++){
        scanf("%d",&a[i]);
    }
    sort(a + 1,a + 1 + n);
    ll l = 0,r = 1000000000;
    int s1,num;
    while(l + 1 < r){
        ll mid = (l + r) / 2;
        s1 = 1,num = 1;
        for(i = 2;i <= n;i ++){
            if(a[i] - a[s1] >= mid){
                num ++;
                s1 = i;
            }
        }
        if(num >= c) l = mid;
        else r = mid;
    }
    printf("%d\n",l);
    return 0;
}

参考stevensonson的博客,链接:http://blog.csdn.net/stevensonson/article/details/77937455

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值