二分答案

记得上学那会, 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
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

你可能感兴趣的:(ACM)