贪心算法—区间调度 电影节(POJ 4151)
贪心算法——区间选取问题 或是区间调度问题
本文解决一个很经典的贪心算法问题 Interval Scheduling(区间调度问题)。给你很多形如[start,end]
的闭区间,请你设计一个算法,算出这些区间中最多有几个互不相交的区间。
什么是区间调度问题
举个例子,intvs=[[1,3],[2,4],[3,6]]
,这些区间最多有两个区间互不相交,即[[1,3],[3,6]]
,你的算法应该返回 2。注意边界相同并不算相交。
这个问题在生活中的应用广泛,比如你今天有好几个活动,每个活动都可以用区间[start,end]
表示开始和结束的时间,请问你今天****最多能参加几个活动呢?
正确的思路其实很简单,可以分为以下三步:
- 从区间集合 intvs 中选择一个区间 x,这个 x 是在当前所有区间中结束最早的(end 最小)。
- 把所有与 x 区间相交的区间从区间集合 intvs 中删除。
- 重复步骤 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)相关推荐
- java贪心算法 区间调度_贪心算法-区间调度问题解之证明(示例代码)
一.贪心算法 定义:一个算法是贪心算法,如果它是通过一些小的步骤来一个求解,并且在每一步根据局部情况选择一个决定,使得某些主要的指标得到优化. 二.区间调度问题 1. 问题:我们有一组需求{1,2,3 ...
- matlab车辆贪心作业调度,贪心算法-区间调度-Interval Scheduling
什么是贪心算法呢? 贪心算法可以认为是动态规划算法的一个特例,相比动态规划,使用贪心算法需要满足更多的条件(贪心选择性质),但是效率比动态规划要高. 比如说一个算法问题使用暴力解法需要指数级时间,如果 ...
- 贪心算法区间调度问题思路代码证明
1.活动安排问题 问题:有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个教室,活动之间不能交叠,求最多安排多少个活动? 解题思路:将活动按照结束时间进行从小到大排序,挑选出结束时间尽量 ...
- 一份贪心算法区间调度问题解法攻略,拿走不谢
作者 | labuladong 来源 | labuladong(ID:labuladong) [导读]什么是贪心算法呢?贪心算法可以认为是动态规划算法的一个特例,相比动态规划,使用贪心算法需要满足更多 ...
- 贪心算法——区间选点问题
转载:https://blog.csdn.net/xia842655187/article/details/51944763 区间选点的问题大致可以描述为: 给定N个区间[a,b],取尽量少的点,使 ...
- 贪心算法-区间选点问题-种树
[题目描述]一条街道的一边有几座房子.因为环保原因居民想要在路边种些树,路边的地区被分割成n块,并被编号为1~n.每块大小为一个单位尺寸且最多可总一棵树.每个居民想在门前种些树并制定了三个数b,e,t ...
- 57 - 算法 -贪心算法 - 区间不相交问题
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstdio> #include <cmath ...
- 贪心算法—建立雷达(POJ 1328)
贪心算法--区间选点问题 这也是贪心算法的经典问题,一般情况为:有n个闭区间[ai,bj],取尽量少的点,使得每个区间内都至少有一个点. 分析 如果区间i内已经有一个点被取到,则称此区间已经被满足. ...
- 信息学奥赛第十节 —— 贪心算法(渡河问题POJ 1700 Crossing River + 拦截导弹的系统数量求解)
复习概念 贪心算法又叫贪婪算法,是指在对问题求解时,总是做出在当前看来是最好的选择.也就是说,贪心算法不从整体最优上加以考虑,它所做出的是在某种意义上的局部最优解. 无后效性:贪心算法不是对所有问题都 ...
最新文章
- 用python画关系网络图-python networkx 包绘制复杂网络关系图的实现
- Java集合框架:Arrays工具类
- 2021牛客暑期多校训练营2 B-Cannon(组合+推式子)
- 可以自由停靠的窗体!
- html转换成avi,swf怎么转换成avi,swf转换avi的方法
- Map集合的遍历方式(3种)
- 如何从hibernate官网下载各个版本的hibernate
- openwrt折腾记2-广告拦截adbyby与pass
- android自定义view星空,自定义RecyclerView星空列表「多item且互相交错,自定义列表,ViewGroup级」...
- xp系统dns服务器异常,电脑dns异常怎么修复,电脑dns异常修复方法介绍
- 物联网芯片+区块链底层融合:紫光展锐开创产业升级新思路
- JAVA入门学习资料
- gitlab小记(一)
- 08.甲流疫情死亡率
- 重载和重写的区别???
- 【pytorch】model.train()和model.evel()的用法
- 从装大象中我们学会了什么设计模式
- 大饼震荡不变,新平台搭建?
- 普元信息 服务器,普元信息发布EOS Platform V8.1 打造云端体验的微服务应用平台...
- 第二十二章:如何管理信息系统