zoukankan      html  css  js  c++  java
  • 设定值范围+区间覆盖

    区间选点+区间覆盖

    区间选点问题(选择最少的点,使得每一个区间都至少有k个点)

    将这些区间[l,r]先依照r从小到大排序,再依照l从大到小排序。

    选点尽量选择靠近右边界的点。然后依照这个排序后的区间进行遍历,用一个变量来存放遍历过程中上个区间的右边界,然后碰到一个新的区间的时候须要分两种情况讨论:1、这个区间和上个区间有相交的部分,那么就须要推断一下上次选择的点有多少在这个区间内。这些点满足要求吗?不满足的话还须要在这个区间内选点2、这个区间和上个区间没有交集,那么这个区间就须要选点。

    上述策略能够保证右边界同样的区间,先选择区间短的那个。

    由于短区间的点被选择了,那么同样右边界的更大的区间肯定包括这个比較小的区间选择的全部点。这样这个大点的区间被满足的可能性就比較大了。

    而且这里选点的策略是取尽量靠近右边界的点,这样选取被满足区间个数会是最大的。

    伪代码
        interval[maxn][2];
        sort(interval, interval + maxn, cmp);//cmp依照r小l大优先级高来排列
    
        pre = interval[1][0] - 1;   //制造出不相交的右边界
        for in range(1, maxn):
            if interval[i][0] > pre://不相交
                //靠近右边界选点
            else:
                //先查找这个区间已经被选中了多少点,然后依据是否满足要求再进行选点
            pre = interval[1][1]; //更新右边界
        else:;
    

    题目:uva10148Advertisement(区间选点)

    区间覆盖问题(选择最少的区间使得覆盖[m,n])

    如果覆盖的区间是[m, n].先预先处理掉和[m,n]不沾边的区间。把起点小的区间放前面,如果起点同样的区间就把长的区间放前面。

    做两个特判,推断起点最先的区间是否涵盖m,和最后的覆盖是否有覆盖到n。

    接着就是中间的推断了,中间的推断看代码吧。

    伪代码
        interval[maxn][2];
        vis[maxn];//记录哪条边被选择
        //删除和[m, n]不沾边的区间,而且依照l小r大优先级高排序
    
        function Cover_Interval:    
            if interval[0][0] < m   //是否涵盖m
                return false;
            pre = m;//前一个选择区间的右边界,也是下个要选择区间的有效的起始边界
            t = -1;//记录前一个区间的下标,由于可能这个区间并非最好的区间
            cover = m - 1;//眼下已经覆盖了的位置
    
            for in range(1, maxn):
                if interval[i][0] <= pre: //满足至少覆盖到上个区间右边界pre,使得整个覆盖的区间不会断开
                    if interval[i][1] > cover: //选取最长的满足上面的要求的区间
                        vis[i] = 1;
                        cover = interval[i][1]; //更新覆盖位置
                        if t != -1:             //上次选中的取消
                            vis[t] = 0;
                else:                     //不满足要求说明须要选择下个新的区间,更新pre
                    pre = cover;
                    if interval[i][0] > pre: //假设当前这个区间的左边界比覆盖位置更大,那么说明中间有一段是覆盖不到的
                        return false;
                    t = -1;                  //新的区间清空上次选中
                    i--;
                if cover >= n:
                    break;
            else:;
    
            if cover < n
                return false;
            //输出被选择的区间according to vis[maxn]
            return true;
        function end;
    

    题目:uva10020 - Minimal coverage(区间覆盖)uva10382 - Watering Grass(变形区间覆盖)

    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    发现个atan2的正确使用方式
    Forward+ Shading架构
    fatal: unable to connect to gitee.com: gitee.com[0: 180.97.125.228]: errno=Unknown error 解决方案
    HDFS HA(高可用性)集群规划
    如何使用RTP引擎对语音编码进行转码
    关于 Angular 应用 tsconfig.json 中的 target 属性
    浅谈 Orbeon form builder 的权限控制
    关于 Angular 应用 tsconfig.json 中的 lib 属性
    orbeon form 通过 url 的方式同第三方应用集成的开发明细
    orbeon form 的配置介绍
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4662378.html
Copyright © 2011-2022 走看看