题目描述

一些项目要占用一个会议室宣讲,同一个时间会议室中只能有一个项目在宣讲。给你每一个项目开始的时间和结束的时间(给你一个数组,里面是一个个具体的项目), 你来安排宣讲的日程, 要求会议室进行的宣讲的场次最多。返回这个最多的宣讲场次。

题目解析

贪心算法

问题是怎么贪心呢?

  • 如果选择开始时间最早的。但是这样的话假如有一个会议开始很早,持续时间很长的话,并不是最优解

  • 选择持续时间最短的。但是这样的话假如有一个持续很短的会议夹在二个会议之间,这样的话就会导致那二个会议不能进行,也不是最优解。

  • 选择结束时间最早的进行排序,然后下一次安排的话我们要保证开始时间在上一次的结束时间之后,这样就算一次有效的会议安排。

贪心策略:

  • 先将项目按照会议结束时间从小到大排序
  • 每次选择结束时间最早的项目(如果这个项目的开始时间在前一个项目结束之后)
int bestArrange2(std::vector<std::vector<int>>intervals){if(intervals.empty()){return 0;}//结束时间早的排在前面(小根堆)std::sort(intervals.begin(), intervals.end(), [](std::vector<int> &l, std::vector<int> &r){return l[1] < r[1];});// timeline表示来到的时间点int timeLine = 0;// result表示安排了多少个会议int result = 0;// 由于刚才按照结束时间排序,当前是按照谁结束时间早的顺序遍历for (auto & interval : intervals) {if(timeLine <= interval[0]){++result;timeLine = interval[1];}}return result;
}

暴力

#include <iostream>
#include <vector>
#include <random>
#include <algorithm>
#include <queue>
#include <map>
#include <list>
#include <memory>
#include <stack>std::vector<std::vector<int>>  copyButExcept(std::vector<std::vector<int>>intervals, int k){std::vector<std::vector<int>> ans(intervals.size() - 1);int index = 0;for (int i = 0; i < intervals.size(); ++i) {if(i != k){ans[index++] = intervals[i];}}return ans;
}
// 目前来到timeLine的时间点,已经安排了done多的会议,剩下的会议programs可以自由安排
// 返回能安排的最多会议数量
int process(std::vector<std::vector<int>>intervals, int done, int timeLine){// 没有会议可以安排,返回安排了多少会议的数量if(intervals.empty()){return done;}int max = done;// 当前安排的会议是什么会,每一个都枚举for (int i = 0; i < intervals.size(); ++i) {if(intervals[i][0] >= timeLine){auto next = copyButExcept(intervals, i);max = std::max(max, process(next, done + 1, intervals[i][1]));}}return max;
}int bestArrange1(std::vector<std::vector<int>>intervals){if(intervals.empty()){return 0;}return process(intervals, 0, 0);
}

对数器

std::default_random_engine e;
std::vector<std::vector<int>>  generatePrograms(int maxLen, int minValue, int maxValue){std::uniform_int_distribution<int> distS(1, maxLen);std::uniform_int_distribution<int> distV(minValue, maxValue);int size = distS(e);std::vector<std::vector<int>> result(size, std::vector<int>(2));for (int i = 0; i < size ; ++i) {int v1 = distV(e);int v2 = distV(e);if(v1 == v2){result[i][0] = v1;result[i][1] = v1 + 1;}else{result[i][0] = std::min(v1, v2);result[i][1] = std::max(v1, v2);}}return result;
}int main() {std::vector<std::vector<int>> pro = {{1, 3}, {2, 3}};printf("%d, %d\r\n", bestArrange1(pro),bestArrange2(pro));int programSize = 12;int timeMax = 20;int timeTimes = 10;for (int i = 0; i < timeTimes; i++) {auto programs = generatePrograms(programSize, 0, timeMax);int ans1 = bestArrange1(programs);int ans2 = bestArrange2(programs);if(ans1 != ans2){printf("error");return -1;};}printf("finish!");return 0;
}

类似题目

题目 思路
算法:会议室宣讲场次最多
leetcode:1353. 最多可以参加的会议数目
leetcode:1705. 吃苹果的最大数目

算法:会议室宣讲场次最多相关推荐

  1. 2021-03-03:一些项目要占用一个会议室宣讲,会议室不能同时容纳两个项目的宣讲。给你每一个项目开始的时间和结束的时间 。你来安排宣讲的日程,要求会议室进行的宣讲的场次最多。 返回最多的宣讲场次。

    2021-03-03:一些项目要占用一个会议室宣讲,会议室不能同时容纳两个项目的宣讲.给你每一个项目开始的时间和结束的时间 .你来安排宣讲的日程,要求会议室进行的宣讲的场次最多. 返回最多的宣讲场次. ...

  2. 安排项目宣讲日程得到最多的宣讲场次

    1.题目 一些项目要占用一个会议室宣讲,会议室不能同时容纳两个项目的宣讲. 给你每一个项目开始的时间和结束的时间 给定每个项目宣讲的开始时间 start 和 结束时间 end,你来安排宣讲的日程,要求 ...

  3. 算法会议室问题及计算重叠时间区间段

    算法会议室问题及计算重叠时间区间段 1. 会议室问题 2. 计算重叠时间区间段 1. 会议室问题 package com.zrj.algorithm.test;import cn.hutool.cor ...

  4. 算法训练 出现次数最多的整数

    问题描述 编写一个程序,读入一组整数,这组整数是按照从小到大的顺序排列的,它们的个数N也是由用户输入的,最多不会超过20.然后程序将对这个数组进行统计,把出现次数最多的那个数组元素值打印出来.如果有两 ...

  5. java 蓝桥杯算法提高 出现次数最多的整数

    思路:其实这道题不是太难,但是这个题太坑了,提交了好多次都不是100,后来才知道,一定一定要在输入数组数据之前先判断一下输进去的n的范围,一定一定要注意,否则就是跟我下面的图片一样的效果了,泪奔~ 问 ...

  6. 蓝桥杯 ALGO-90 算法训练 出现次数最多的整数

    问题描述 编写一个程序,读入一组整数,这组整数是按照从小到大的顺序排列的,它们的个数N也是由用户输入的,最多不会超过20. 然后程序将对这个数组进行统计,把出现次数最多的那个数组元素值打印出来.如果有 ...

  7. 算法探索_盛最多水的容器

    问题描述: 给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其 ...

  8. 成功的机器学习应用不是拥有最好的算法,而是拥有最多的数据

    机器学习的方法 1.回归算法 2.神经网络 3.svm(支持向量机) 4.聚类算法 5.降维算法 6.推荐算法 7.其它(高斯判别,朴素贝叶斯,决策树等等) 按照训练的数据有无标签,可以将上面算法分为 ...

  9. 贪心算法---会议室问题

    问题: 有一堆会议,每个会议都有开始时间和结束时间,问至少需要几个房间可以安排下这些会议? 解决思路: 这是个贪心类问题, 每个会议都有结束时间和开始时间,可以对两个时间分开存储并排序,从最先开始的会 ...

最新文章

  1. python算法特征_python 3.x实现特征选择ReliefF算法
  2. 08.存储Cinder→4.Cinder组件详解→3.cinder-volume
  3. c语言枚举入门,C语言入门之枚举与位运算(1)
  4. PP视频怎么关闭PP视频虚拟键盘显示
  5. 最短路径和距离及可视化——matlab
  6. SpringBoot配置详解
  7. mysql ibdata1 损坏_mysql innodb文件ibdata1损坏导致mysql无法启动
  8. 开心的小明 (NYOJ49) [动态规划.01背包]
  9. 30岁中专自学java,19岁中专毕业 工作两年感觉就是混日子 想再去学个软件编程 我这个学历学他有前途吗?...
  10. c语言如何引用一维数组,C语言一维数组的定义和引用
  11. Spine 2D骨骼动画插件 for Unity
  12. 教你在官网如何下载jdk
  13. 2017计算机驱动用什么好处,驱动精灵和驱动人生哪个好2017
  14. 接了几个APP逆向的私活,赚爆了!
  15. C语言——解四元一次方程组
  16. 路飞学城Python-Day2
  17. python人机猜拳随机,python实现人机猜拳小游戏
  18. 一张专家推荐的最健康的作息时间表
  19. matlab确定分段函数的间断点,分段函数必有间断点( )
  20. vmware设置静态ip地址

热门文章

  1. 域控锁定计算机和用户,AD域账户锁定时间
  2. 2018常州大学新生寒假训练会试 F.大佬的生日大礼包(二分)
  3. 编译原理——词法分析器实验
  4. QT5.15.2静态编译MSVC2019
  5. Ajax 详解 网页从输入url到渲染的流程 同步 异步 你想要的全都有
  6. bitnami redmine mysql_Bitnami Redmine相关配置
  7. 自己动手编译Mozilla Firefox和ThunderBird
  8. 公有云市场, SaaS难逃厄运
  9. TCP连接中的ACK与ack
  10. 实证型高水平英语论文基本结构与写作体会