码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 3258 River Hopscotch

时间:2016-04-30 18:16:21      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:

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

#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;
}

 

POJ 3258 River Hopscotch

标签:

原文地址:http://www.cnblogs.com/jifahu/p/5449049.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!