15145641

  一个不错的二分,注释在代码里

#include <stdio.h>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <iostream>
using namespace std;
///二分搜索答案,最大化最小值
int main()
{
    int L,n,m;
    int a[50010];
    while(~scanf("%d %d %d",&L,&n,&m))
    {
        for(int i = 1; i <= n; i++)
            scanf("%d",&a[i]);
        a[0] = 0;
        a[n+1] = L;
        sort(a,a+n+2);
        /*for(int i = 0;i <= n+1;i++)
            cout<<a[i]<<" ";
        cout<<endl;*/
        int l = 0,r = L,mid;
        ///先模拟一个最小值mid,假设它就是正确答案
        int num;
        while(l <= r)
        {
            int last = 0;
            int sum = 0;
            mid = (l + r) / 2;
            for(int i = 1; i <= n+1; i++)
            {
                if(a[i] - a[last] < mid)///如果比mid小,就将该节点强制删除,并计数
                    sum++;
                else last = i;///如果不是就更新,为啥要更新,如果不更新,那我们计算的
                ///就不是两点之间的距离了啊
            }
            if(sum > m)///删多了,说明mid值偏大
                r = mid - 1;
            else
            {
                l = mid + 1;
                num = mid;
            }

        }
        ///最后经过二分循环,得到最大的mid;
        printf("%d\n",num);
    }
    return 0;
}

 

posted on 2016-04-30 17:54  icode-xiaohu  阅读(202)  评论(0编辑  收藏  举报