转载请注明原创:http://www.cnblogs.com/StartoverX/p/4608412.html

题目:

  有一组活动,我们需要将它们安排到一些教室,任意活动都可以在任意教室进行。我们希望使用最少的教室完成所有活动。

  设计一个高效的贪心算法求每个活动应该在哪个教室进行。

分析:

  本题是对书中活动选择问题的一个扩展。在活动选择问题中,我们要求的是一个最大兼容活动集,也就是在所有时间内时间不重叠的最多的活动集合。

  易知,这样一个活动集,就是一个教室最多能够举办的活动集。所以剩下的活动一定不能和该活动集内的活动在同一个教室举行。我们不断对剩下的活动使用贪心算法,需要多少次贪心能够选取完所有的活动,就最少需要几个教室。

  我们首先对所有活动按结束时间排序。遍历所有活动,如果下一个活动开始时间比某教室中最后一个活动结束时间晚,则加入该教室。如果不能加入已使用的任何教室,则需要新开一个教室。

#include <iostream>
#include <vector>
#include <utility>
#include <algorithm>using namespace std;typedef pair<int,int> Acti;//用起始时间和结束时间的pair表示一个活动。void party(vector<Acti>& acti_vec)
{        sort(acti_vec.begin(),acti_vec.end(),[](const Acti& a,const Acti& b){return a.second < b.second;});//按结束时间对所有活动排序。    vector<vector<Acti>> classroom;//教室列表。vector<Acti> classroom1;classroom1.push_back(*acti_vec.begin());//初始化第一个教室,将结束时间最早的活动放入。    classroom.push_back(classroom1);//将第一个教室加入教室列表。for(int i = 1;i<(int)acti_vec.size();i++)//遍历一遍活动列表。
    {int j;for(j = 0;j < (int)classroom.size();j++){if(acti_vec[i].first >= (*(classroom[j].end()-1)).second)//如果该活动的开始时间比某教室目前为止最后一个活动结束结束时间晚,则加入该教室。
            {classroom[j].push_back(acti_vec[i]);break;}}    if(j == (int)classroom.size())//如果无法加入当前任何一个教室,则需要一个新的教室。
        {vector<Acti> classroom_temp;classroom_temp.push_back(acti_vec[i]);classroom.push_back(classroom_temp);}}    for(int i = 0;i < (int)classroom.size();i++)//对每一个教室,按起始时间 结束时间输出每一个活动。
    {cout<<"classroom "<<i+1<<":"<<endl;for(int j = 0;j < (int)classroom[i].size();j++){cout<<classroom[i][j].first<<" "<<classroom[i][j].second<<endl;}}
}int main()
{vector<Acti> acti_vec = {{1,4},{3,5},{0,6},{5,7},{3,9},{5,9},{6,10},{8,11},{8,12},{2,14},{12,16}};party(acti_vec);return 0;
}

  在本题解法的第一次实现中犯了一个错误,错误的使用了迭代器,然而,由于在遍历的过程中,要向classroom的vector中添加元素,当vector被修改后,原先的迭代器都会失效,所以不能使用迭代器,而改用int下标。

 

转载于:https://www.cnblogs.com/StartoverX/p/4608412.html

[算法导论]练习16.1-4 活动教室分配(区间着色问题)相关推荐

  1. 算法导论第16章练习题 16.1-4

    16.1-4 假设有一组活动,我们需要将它们安排到一些教室,任意活动都可以在任意教室进行.我们希望使用最少的教室来完成活动.设计一个高效的贪心算法,求每个活动应该在哪个教室来进行. (这个问题也被称为 ...

  2. 算法导论 10.1-6

    题目:用两个栈实现一个队列,并分析相关队列操作的运行时间 解答: 1.使用两个栈S1与S2: 2.通过栈S1的Push执行队列入队操作,通过栈S2的Pop执行队列出队操作 3.当栈S2为空后,即S1- ...

  3. 《算法导论》学习总结 — 21.第16章 贪心算法(1) 基础入门1

    建议先看看前言:http://www.wutianqi.com/?p=2298 连载总目录:http://www.wutianqi.com/?p=2403 说到贪心算法,避免不了于DP对比,所以前面的 ...

  4. 《算法导论》读书笔记(七)

    <算法导论>读书笔记之第16章 贪心算法-活动选择问题 前言:贪心算法也是用来解决最优化问题,将一个问题分成子问题,在现在子问题最优解的时,选择当前看起来是最优的解,期望通过所做的局部最优 ...

  5. 算法导论中英文版下载

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 算法导论 ...

  6. 《算法导论3rd第十六章》贪心算法

    前言 适用于最优化问题的算法往往包含一系列步骤,每个步骤都面临多种选择.使用动态规划解决最优化问题,相当于计算出每咱选择,浪费大量效率.对于"特定"下的最优化问题,可以使用更简单更 ...

  7. 算法导论Java实现-构建MaxHeap

    package lhz.algorithm.chapter.six; /** * "构建堆",<算法导论>6.3章节 Building a heap * 利用之前实现的 ...

  8. Python语言程序设计之urllib.request抓取页面,网易公开课之《麻省理工学院公开课:算法导论》

    Python语言用urllib.request模块抓取页面非常简单,再将抓取的页面内容用re模块解析,找出自己想要的东西.下面就就此方法来抓取网易公开课之<麻省理工学院公开课:算法导论>, ...

  9. 算法导论之贪心算法(Huffman编码和拟阵)

    贪心算法,在解决最优化问题上,通过得到子问题的局部最优解来合成问题的一个解,以局部最优选择来输出一个全局最优解. 问题要用贪心算法来求解,需满足和动态规划一样的最优子结构特征,同时还需要再每个子问题最 ...

最新文章

  1. tp3.2.3权限控制二之后台管理部分,及菜单栏目显示问题
  2. 使用ros标定相机的内参和外参
  3. 浅谈电量传感器在数据中心的UPS电源中的应用
  4. Machine Learning on Spark——统计基础(二)
  5. 前端学习(1400):多人管理20代码优化
  6. linux的驱动开发——简单驱动程序编写
  7. 如何通过 Python 和 OpenCV 实现目标数量监控?
  8. 近期机器学习竞赛汇总~总奖池超三百万人民币!
  9. 自学Web前端有哪些误区?自学Web需要掌握哪些技术
  10. CCF NOI1039 2的n次方
  11. 马哥运维班第一周作业
  12. SQL Server导出导入数据方法
  13. 拓端tecdat|R语言对巨灾风险下的再保险合同定价研究案例:广义线性模型和帕累托分布Pareto distributions分析
  14. 音频处理之语音加速播放
  15. MOSSE相关滤波算法学习笔记
  16. netkeeper客户端_netkeeper校园客户端
  17. 千万不要点开,Cjson入门快速使用看这篇就够了(CJSON入门操作以及问题讲解,CJSON对象删除出错)
  18. win7搭建nas存储服务器_普通用户的低成本家庭文件服务器(伪NAS)的搭建(系统篇)...
  19. 三款软件,让你的文字转语音更简单
  20. 【Java并发】Java并发编程-01

热门文章

  1. 四川大学金融转计算机,[请教]川大和西财哪个金融系好?!
  2. 统信uos系统考试题_离Windows更近一步!微信Linux原生版上线:国产统信UOS系统已适配...
  3. java的构造函数详解,Java构造函数与普通函数用法详解
  4. python中可迭代对象拆包时、怎么赋值给占位符_python3-数据结构和算法 » 1.2 解压可迭代对象赋值给多个变量...
  5. 计算机网络技术教法改革方案,计算机网络技术专业教学模式改革探索
  6. python redis pipeline使用方法_python使用pipeline批量读写redis的方法
  7. shell shocked伴奏版_Shell Shocked
  8. mysql8 安装_MySQL8.x安装使用
  9. python 发送邮件附件很慢_python下smtpsendmail发送特别慢
  10. 内蒙古高考2021年成绩查询,内蒙古招生考试信息网:2021年内蒙古高考查分入口、查分系统...