zoukankan      html  css  js  c++  java
  • 基于贪心算法的区间覆盖问题 附代码

    1)区间完全覆盖问题

    问题描述:给定一个长度为m的区间,再给出n条线段的起点和终点(注意这里是闭区间),求最少使用多少条线段可以将整个区间完全覆盖

       样例:区间长度8,可选的覆盖线段[2,6],[1,4],[3,6],[3,7],[6,8],[2,4],[3,5]

    解题过程:

    1.将每一个区间按照左端点递增顺序排列,排完序后为[1,4],[2,4],[2,6],[3,5],[3,6],[3,7],[6,8]

    2.设置两个变量 last 和 far

      last 表示当前已经覆盖到的区域的最右边距离 .

      far 表示在剩下的线段中找到的所有左端点小于等于当前已经覆盖到的区域的右端点的线段中,不断更新 最右边的距离

    3.重复以上过程 直到区间全部覆盖 否则 区间不能全部覆盖

    int solve()
    {
        int cnt = 0;
        double last = 0,far = 0;
        for(int i=0;i < num;i++)
        {
            if(last >= l) return cnt;
            if(s[i].a <= last)
                far = max(far , s[i].b);
            else if(s[i].a > last)
            {
                cnt++;
                last = far;
                if(s[i].a <= last)
                    far = max(far,s[i].b);
                else
                    return -1;
            }
        }
        if(last < l && far >= l) return cnt+1;
        if(far < l ) return -1;
        return cnt;
    }

    3过程:

    假设第一步加入[1,4] ,那么下一步能够选择的有[2,6],[3,5],[3,6],[3,7],由于7最大

    所以下一步选择[3,7],最后一步只能选择[6,8],这个时候刚好达到了8退出,所选区间为3

     

    参考原文:

    http://blog.csdn.net/chenguolinblog/article/details/7882316

     

     

     

  • 相关阅读:
    面试常考知识点——Java(JVM,JDK,JRE)
    使用CSS transform属性的skewX、skewY沿X、Y轴倾斜元素
    视觉设计应用
    小程序
    小程序获取用户的登录头像和用户名
    整站建设
    2018-05-05(在小程序中使用图标)
    2018-05-03(PHP)
    webpack
    简历
  • 原文地址:https://www.cnblogs.com/Draymonder/p/7215230.html
Copyright © 2011-2022 走看看