贪心算法——区间选取问题 或是区间调度问题

本文解决一个很经典的贪心算法问题 Interval Scheduling(区间调度问题)。给你很多形如[start,end]的闭区间,请你设计一个算法,算出这些区间中最多有几个互不相交的区间


什么是区间调度问题

举个例子,intvs=[[1,3],[2,4],[3,6]],这些区间最多有两个区间互不相交,即[[1,3],[3,6]],你的算法应该返回 2。注意边界相同并不算相交。

这个问题在生活中的应用广泛,比如你今天有好几个活动,每个活动都可以用区间[start,end]表示开始和结束的时间,请问你今天****最多能参加几个活动呢?

正确的思路其实很简单,可以分为以下三步:

  1. 从区间集合 intvs 中选择一个区间 x,这个 x 是在当前所有区间中结束最早的(end 最小)。
  2. 把所有与 x 区间相交的区间从区间集合 intvs 中删除。
  3. 重复步骤 1 和 2,直到 intvs 为空为止。之前选出的那些 x 就是最大不相交子集。

把这个思路实现成算法的话,可以按每个区间的end数值升序排序,因为这样处理之后实现步骤 1 和步骤 2 都方便很多:

现在来实现算法,对于步骤 1,由于我们预先按照end排了序,所以选择 x 是很容易的。关键在于,如何去除与 x 相交的区间,选择下一轮循环的 x 呢?

由于我们事先排了序,不难发现所有与 x 相交的区间必然会与 x 的end相交;如果一个区间不想与 x 的end相交,它的start必须要大于(或等于)x 的end


经典案例

源于 北大OJ (POJ 4151)电影节

描述

大学生电影节在北大举办! 这天,在北大各地放了多部电影,给定每部电影的放映时间区间,区间重叠的电影不可能同时看(端点可以重合),问李雷最多可以看多少部电影。

输入

多组数据。每组数据开头是n(n<=100),表示共n场电影。
接下来n行,每行两个整数(0到1000之间),表示一场电影的放映区间
n=0则数据结束

输出

对每组数据输出最多能看几部电影

样例输入

8
3 4
0 7
3 8
15 19
15 20
10 15
8 18
6 12
0

样例输出

3

实现代码:

#include<iostream>
#include<string>
#include<algorithm>
#include<math.h>
using namespace std;
struct ti{int start;int end;
}tm[101];
bool cmp(ti a,ti b){return (a.end<b.end);  //按照结束时间从小到大排序
}
int main(){int n;while(true){scanf("%d",&n);if(n==0) break;for(int i=0;i<n;i++){scanf("%d%d",&tm[i].start,&tm[i].end);}//按照结束时间排序sort(tm,tm+n,cmp);//从结束时间最小的开始选取int ans=1;//每组重置个数int endtime=tm[0].end;for(int i=1;i<n;i++){if(tm[i].start>=endtime){endtime=tm[i].end;ans++;}}printf("%d\n",ans);}
}

贪心算法—区间调度 电影节(POJ 4151)相关推荐

  1. java贪心算法 区间调度_贪心算法-区间调度问题解之证明(示例代码)

    一.贪心算法 定义:一个算法是贪心算法,如果它是通过一些小的步骤来一个求解,并且在每一步根据局部情况选择一个决定,使得某些主要的指标得到优化. 二.区间调度问题 1. 问题:我们有一组需求{1,2,3 ...

  2. matlab车辆贪心作业调度,贪心算法-区间调度-Interval Scheduling

    什么是贪心算法呢? 贪心算法可以认为是动态规划算法的一个特例,相比动态规划,使用贪心算法需要满足更多的条件(贪心选择性质),但是效率比动态规划要高. 比如说一个算法问题使用暴力解法需要指数级时间,如果 ...

  3. 贪心算法区间调度问题思路代码证明

    1.活动安排问题 问题:有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个教室,活动之间不能交叠,求最多安排多少个活动? 解题思路:将活动按照结束时间进行从小到大排序,挑选出结束时间尽量 ...

  4. 一份贪心算法区间调度问题解法攻略,拿走不谢

    作者 | labuladong 来源 | labuladong(ID:labuladong) [导读]什么是贪心算法呢?贪心算法可以认为是动态规划算法的一个特例,相比动态规划,使用贪心算法需要满足更多 ...

  5. 贪心算法——区间选点问题

    转载:https://blog.csdn.net/xia842655187/article/details/51944763 区间选点的问题大致可以描述为:  给定N个区间[a,b],取尽量少的点,使 ...

  6. 贪心算法-区间选点问题-种树

    [题目描述]一条街道的一边有几座房子.因为环保原因居民想要在路边种些树,路边的地区被分割成n块,并被编号为1~n.每块大小为一个单位尺寸且最多可总一棵树.每个居民想在门前种些树并制定了三个数b,e,t ...

  7. 57 - 算法 -贪心算法 - 区间不相交问题

    #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstdio> #include <cmath ...

  8. 贪心算法—建立雷达(POJ 1328)

    贪心算法--区间选点问题 这也是贪心算法的经典问题,一般情况为:有n个闭区间[ai,bj],取尽量少的点,使得每个区间内都至少有一个点. 分析 如果区间i内已经有一个点被取到,则称此区间已经被满足. ...

  9. 信息学奥赛第十节 —— 贪心算法(渡河问题POJ 1700 Crossing River + 拦截导弹的系统数量求解)

    复习概念 贪心算法又叫贪婪算法,是指在对问题求解时,总是做出在当前看来是最好的选择.也就是说,贪心算法不从整体最优上加以考虑,它所做出的是在某种意义上的局部最优解. 无后效性:贪心算法不是对所有问题都 ...

最新文章

  1. 用python画关系网络图-python networkx 包绘制复杂网络关系图的实现
  2. Java集合框架:Arrays工具类
  3. 2021牛客暑期多校训练营2 B-Cannon(组合+推式子)
  4. 可以自由停靠的窗体!
  5. html转换成avi,swf怎么转换成avi,swf转换avi的方法
  6. Map集合的遍历方式(3种)
  7. 如何从hibernate官网下载各个版本的hibernate
  8. openwrt折腾记2-广告拦截adbyby与pass
  9. android自定义view星空,自定义RecyclerView星空列表「多item且互相交错,自定义列表,ViewGroup级」...
  10. xp系统dns服务器异常,电脑dns异常怎么修复,电脑dns异常修复方法介绍
  11. 物联网芯片+区块链底层融合:紫光展锐开创产业升级新思路
  12. JAVA入门学习资料
  13. gitlab小记(一)
  14. 08.甲流疫情死亡率
  15. 重载和重写的区别???
  16. 【pytorch】model.train()和model.evel()的用法
  17. 从装大象中我们学会了什么设计模式
  18. 大饼震荡不变,新平台搭建?
  19. 普元信息 服务器,普元信息发布EOS Platform V8.1 打造云端体验的微服务应用平台...
  20. 第二十二章:如何管理信息系统

热门文章

  1. 通过CISA的一些经验分享(原文写于09年)
  2. 查看oracle中各个表空间的已使用空间和最大分配空间
  3. 所有XP_SP2服务的详细介绍
  4. php软件开发--nodejs
  5. 大一计算机专业,大一计算机专业学生
  6. linux中终止停止进程_如何在Linux中终止进程或停止程序
  7. devops什么意思_DevOps有什么意义?
  8. openstack 教程_OpenStack的新提示,技巧和教程
  9. 缓冲区 | 没吃透Netty 缓冲区,还能算得上Java老司机?
  10. Bootstrap 下拉菜单