• POJ 3258 River Hopscotch(二分查找答案)


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

    #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
    ",num);
        }
        return 0;
    }
  • 相关阅读:
    为什么项目经理非常难有节操的选举
    二叉查找树的删除操作
    二叉查找树的前驱后继
    替罪羊树
    树链剖分
    DFS序
    bzoj3224: Tyvj 1728 普通平衡树(平衡树)
    splay树入门(带3个例题)
    红黑树
    AVL树
  • 原文地址:https://www.cnblogs.com/jifahu/p/5449049.html
Copyright © 2020-2023  润新知