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

     

     

     

  • 相关阅读:
    composer 的安装以及一些插件的下载等
    linux 服务器安装php5.6
    数据库异地备份---服务器配置流程
    expect安装
    linux 服务器安装mysql5.6
    使用navicat 使用IP、用户名、密码直接连接linux服务器里面的数据库
    函数指针 指针函数
    信号量
    消息队列-Message Queue
    生成库文件,会链接依赖的库文件吗?
  • 原文地址:https://www.cnblogs.com/Draymonder/p/7215230.html
Copyright © 2011-2022 走看看