1、活动安排问题

问题:有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个教室,活动之间不能交叠,求最多安排多少个活动?

解题思路:将活动按照结束时间进行从小到大排序,挑选出结束时间尽量早的活动,并且满足后一个活动的起始时间晚于前一个活动的结束时间,全部找出这些活动就是最大的相容活动子集合。

C代码示例

正确性证明:我们可以从贪心算法得到的结果集仅进行倒推。首先去掉结果集中的第一个活动A,那么在剩下的活动中,结束时间最早的活动B的结束时间一定不早于A,那么A活动在最优解中一定合理。再用同样的方式判断活动B,依次类推,则结果集就是最优解。

2、最小延迟问题

问题:顾客在饭店中点餐,ti 表示i顾客所有菜加工的时间,di 表示i顾客要求菜全部完成的时间。如果实际完成的时间小于规定完成时间,那么就没有延迟。由于有很多顾客,所以会有很多不同的拖延值,我们的目标是,求得所有拖延值中的最大值,并使得这个最大的拖延值最小。

解题思路:使用贪心算法,按照截止时间ddl排序,越早截止的任务越早完成。该算法是一个没有空闲的最优调度,即从时刻0开始都有在处理请求,直到最后一个请求执行完释放资源之后才空闲。

C代码示例

const int MAX_SIZE = 100;
struct Request {int time, ddl;int begin, end;
} req[MAX_SIZE];
bool operator<(const Request& req1, const Request& req2) {return req1.ddl < req2.ddl;
}
int main() {int requestNum;cin >> requestNum;for (int i = 0; i < requestNum; ++i) {cin >> req[i].time >> req[i].ddl;}sort(req, req + requestNum);  //按照截止时间进行顺序排序int start = 0, maxDelay = 0;for (int i = 0; i < requestNum; ++i) {req[i].begin = start;req[i].end = start + req[i].time;start += req[i].time;if (maxDelay < req[i].end - req[i].ddl) {maxDelay = req[i].end - req[i].ddl;}}cout << "最小的最大延迟: " << maxDelay << endl;return 0;
}

正确性证明

3、多区间调度问题

问题:有很多间课室,某个周末有多个社团需要申请课室办活动,每个社团都有一个对应的申请时间(包括开始时间和结束时间),求最少需要多少间课室才能够满足所有社团的需求(在这个问题之中时间重叠的社团需要安排在其他课室,即会使用到多个资源,需要考虑多个资源上的调度安排,故称为多区间调度)。

解题思路:使用贪心算法,将需求按照开始时间的早晚进行排序,然后开始为这些资源打标签,每个标签代表都一个资源,需求req-i被打上标签k表示该请求分配到的资源是k。遍历排序后的需求,如果一个需求与某个已分配资源上的其他安排不冲突,则把该需求也放进该资源的安排考虑中;如果冲突,那么应该要给此需求分配新的资源,已用资源数量加一。

C++代码示例

const int MAX_SIZE = 100;
struct Request {int begin, end, tag;
} req[MAX_SIZE];
bool operator<(const Request& req1, const Request& req2) {return req1.begin < req2.begin;
}
int main() {int requestNum;cin >> requestNum;for (int i = 0; i < requestNum; ++i) {cin >> req[i].begin >> req[i].end;}sort(req, req + requestNum);
int tagSize = 1;req[0].tag = 0;bool tags[MAX_SIZE];for (int i = 1; i < requestNum; ++i) {memset(tags, 1, sizeof(tags));for (int j = 0; j < i; ++j) {if (req[j].end > req[i].begin) {tags[req[j].tag] = false;}}bool isTagsEmpty = true;int tag;for (int j = 0; j < tagSize; ++j) {if (tags[j]) {isTagsEmpty = false;tag = j;break;}}if (isTagsEmpty) {req[i].tag = tagSize;++tagSize;} else {req[i].tag = tag;}}cout << "最小资源使用量: " << tagSize << endl;return 0;
}

贪心算法区间调度问题思路代码证明相关推荐

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

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

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

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

  3. 贪心算法—区间调度 电影节(POJ 4151)

    贪心算法--区间选取问题 或是区间调度问题 本文解决一个很经典的贪心算法问题 Interval Scheduling(区间调度问题).给你很多形如[start,end]的闭区间,请你设计一个算法,算出 ...

  4. 2020-11-23 PTA算法_贪心算法部分习题及代码

    贪心算法部分习题及代码 1 装箱问题 2 月饼 3 最优合并问题 4 看电影 5 喷水装置 6 活动选择问题 1 装箱问题 假设有N项物品,大小分别为s​1​​.s​2​​.-.s​i​​.-.s​N ...

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

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

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

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

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

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

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

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

  9. 杭电1052-Tian Ji -- The Horse Racing 贪心算法(有思路和注释)

    Problem Description Here is a famous story in Chinese history. "That was about 2300 years ago. ...

最新文章

  1. Python实用笔记 (16)函数式编程——偏函数
  2. turbolinux mysql 5.0 cluste,Debian -- 新聞 -- Debian GNU/Linux 5.0 發布
  3. java1.8之supplier
  4. 详解 TCP 和 UDP
  5. Spring JdbcTemplate+JdbcDaoSupport实例
  6. php分页操作,PHP实现适用于文件内容操作的分页类
  7. GCC在C语言中内嵌汇编 asm __volatile__
  8. C++学习笔记系列二
  9. 项目疑难杂症记录(五):fragment生命周期都回调了,却不见其页面展示
  10. java 枚举放那个包,java枚举,包装类,math使用
  11. 分享网上一篇产品经理的经验总结--产品经理九步法
  12. linux date命令 下月,Linux date命令用法和使用技巧(获取今天.昨天.一分钟前等)
  13. 1219 厘米到英寸的转换
  14. 百趣生物受邀参加代谢组学及脂质组学质谱技术研讨会
  15. java activity_java中的Activity
  16. 滴滴Booster移动APP质量优化框架 学习之旅
  17. WEB前端面试选择题解答
  18. 【icem】非结构体网格的质量+混合网格的合并问题
  19. 自然语言处理nlp小姜机器人(闲聊) nlp_xiaojiang-996station GitHub鉴赏官
  20. 老年人微信教程手绘版|微信入门教程1

热门文章

  1. mysql explain字段含义,MySQL(十七):EXPLAIN 输出信息之 Extra 字段解释
  2. python基础入门:实现(无重复字符)字符串的全排列的两种方法
  3. Python脚本后台运行的五种方式
  4. python反射和高阶内置方法
  5. python对象的 init 和 del 方法
  6. python3 gb2312转utf8_字符编码和python使用encode,decode转换utf-8, gbk, gb2312
  7. NumPy复制数组之浅拷贝和深拷贝(注意,直接用等号不是复制,且切片会改变原数组!!!)ndarray.copy() ndarray.view()(view()只是改变shape形状,数据还是同一个)
  8. 使用ONVIF协议控制海康威视球机
  9. php性能提升5倍的秘诀,停机维护时长缩短5倍,全靠这3个秘诀
  10. python urllib3离线安装_全球Python库下载前10名