算法:会议室宣讲场次最多
题目描述
一些项目要占用一个会议室宣讲,同一个时间会议室中只能有一个项目在宣讲。给你每一个项目开始的时间和结束的时间(给你一个数组,里面是一个个具体的项目), 你来安排宣讲的日程, 要求会议室进行的宣讲的场次最多。返回这个最多的宣讲场次。
题目解析
贪心算法
问题是怎么贪心呢?
- 如果选择开始时间最早的。但是这样的话假如有一个会议开始很早,持续时间很长的话,并不是最优解
- 选择持续时间最短的。但是这样的话假如有一个持续很短的会议夹在二个会议之间,这样的话就会导致那二个会议不能进行,也不是最优解。
- 选择结束时间最早的进行排序,然后下一次安排的话我们要保证开始时间在上一次的结束时间之后,这样就算一次有效的会议安排。
贪心策略:
- 先将项目按照会议结束时间从小到大排序
- 每次选择结束时间最早的项目(如果这个项目的开始时间在前一个项目结束之后)
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. 吃苹果的最大数目 |
算法:会议室宣讲场次最多相关推荐
- 2021-03-03:一些项目要占用一个会议室宣讲,会议室不能同时容纳两个项目的宣讲。给你每一个项目开始的时间和结束的时间 。你来安排宣讲的日程,要求会议室进行的宣讲的场次最多。 返回最多的宣讲场次。
2021-03-03:一些项目要占用一个会议室宣讲,会议室不能同时容纳两个项目的宣讲.给你每一个项目开始的时间和结束的时间 .你来安排宣讲的日程,要求会议室进行的宣讲的场次最多. 返回最多的宣讲场次. ...
- 安排项目宣讲日程得到最多的宣讲场次
1.题目 一些项目要占用一个会议室宣讲,会议室不能同时容纳两个项目的宣讲. 给你每一个项目开始的时间和结束的时间 给定每个项目宣讲的开始时间 start 和 结束时间 end,你来安排宣讲的日程,要求 ...
- 算法会议室问题及计算重叠时间区间段
算法会议室问题及计算重叠时间区间段 1. 会议室问题 2. 计算重叠时间区间段 1. 会议室问题 package com.zrj.algorithm.test;import cn.hutool.cor ...
- 算法训练 出现次数最多的整数
问题描述 编写一个程序,读入一组整数,这组整数是按照从小到大的顺序排列的,它们的个数N也是由用户输入的,最多不会超过20.然后程序将对这个数组进行统计,把出现次数最多的那个数组元素值打印出来.如果有两 ...
- java 蓝桥杯算法提高 出现次数最多的整数
思路:其实这道题不是太难,但是这个题太坑了,提交了好多次都不是100,后来才知道,一定一定要在输入数组数据之前先判断一下输进去的n的范围,一定一定要注意,否则就是跟我下面的图片一样的效果了,泪奔~ 问 ...
- 蓝桥杯 ALGO-90 算法训练 出现次数最多的整数
问题描述 编写一个程序,读入一组整数,这组整数是按照从小到大的顺序排列的,它们的个数N也是由用户输入的,最多不会超过20. 然后程序将对这个数组进行统计,把出现次数最多的那个数组元素值打印出来.如果有 ...
- 算法探索_盛最多水的容器
问题描述: 给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其 ...
- 成功的机器学习应用不是拥有最好的算法,而是拥有最多的数据
机器学习的方法 1.回归算法 2.神经网络 3.svm(支持向量机) 4.聚类算法 5.降维算法 6.推荐算法 7.其它(高斯判别,朴素贝叶斯,决策树等等) 按照训练的数据有无标签,可以将上面算法分为 ...
- 贪心算法---会议室问题
问题: 有一堆会议,每个会议都有开始时间和结束时间,问至少需要几个房间可以安排下这些会议? 解决思路: 这是个贪心类问题, 每个会议都有结束时间和开始时间,可以对两个时间分开存储并排序,从最先开始的会 ...
最新文章
- python算法特征_python 3.x实现特征选择ReliefF算法
- 08.存储Cinder→4.Cinder组件详解→3.cinder-volume
- c语言枚举入门,C语言入门之枚举与位运算(1)
- PP视频怎么关闭PP视频虚拟键盘显示
- 最短路径和距离及可视化——matlab
- SpringBoot配置详解
- mysql ibdata1 损坏_mysql innodb文件ibdata1损坏导致mysql无法启动
- 开心的小明 (NYOJ49) [动态规划.01背包]
- 30岁中专自学java,19岁中专毕业 工作两年感觉就是混日子 想再去学个软件编程 我这个学历学他有前途吗?...
- c语言如何引用一维数组,C语言一维数组的定义和引用
- Spine 2D骨骼动画插件 for Unity
- 教你在官网如何下载jdk
- 2017计算机驱动用什么好处,驱动精灵和驱动人生哪个好2017
- 接了几个APP逆向的私活,赚爆了!
- C语言——解四元一次方程组
- 路飞学城Python-Day2
- python人机猜拳随机,python实现人机猜拳小游戏
- 一张专家推荐的最健康的作息时间表
- matlab确定分段函数的间断点,分段函数必有间断点( )
- vmware设置静态ip地址