贪心法之活动安排问题

问题:

                给定n个活动,每个活动有一个开始时间si和结束时间fi,选择出最大的互不相容的活动     集合。

思路:     

  1. 将所有活动按照结束时间从小到大排序。

  2. 选择第一个活动,并将其加入最终的选择集合中。

  3. 依次考虑剩余的活动,如果当前活动的开始时间晚于等于上一个已选活动的结束时间,则将该活动加入最终的选择集合中。

  4. 重复步骤3,直到所有活动都被考虑完毕。

  5. 输出最终的选择集合。

示例:

按照右端点从小到大排序后的顺序为:

                 区间1: [1, 4]
                 区间2: [3, 6]
                 区间3: [5, 7]

按照区间调度算法进行选择,具体步骤如下:

首先选择右端点最小的区间1 [1, 4],更新preEnd为4。
接着剩下区间2 [3, 6] 的起始位置小于preEnd,无法选择。
最后剩下的区间3 [5, 7] 的起始位置大于preEnd,可以选择。
选中的区间序号为1和3,选中的区间个数为2。

所以最优解是选择区间1和3。

代码:

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;int main() {// 读取活动数量int n;cin >> n;// 保存活动开始时间和结束时间的向量vector<pair<int, int>> activities(n);// 读取每个活动的开始时间和结束时间for (auto& activity : activities) {cin >> activity.first >> activity.second;}// 按活动结束时间对活动进行排序sort(activities.begin(), activities.end(), [](const auto& a, const auto& b) { return a.second < b.second; });// 保存被选中的活动序号的向量vector<int> selected;int lastEnd = 0; // 上一个被选择活动的结束时间// 遍历排序后的活动列表,选择不冲突的活动for (int i = 0; i < n; ++i) {// 如果当前活动的开始时间大于等于上一个被选择活动的结束时间,// 则说明当前活动与上一个被选择活动不冲突,可以选择if (activities[i].first >= lastEnd) {selected.push_back(i + 1); // 将符合条件的活动序号加入selected向量lastEnd = activities[i].second; // 更新上一个被选择活动的结束时间}}// 输出最大不相交活动集合的大小cout << "最大不相交活动集合的大小:" << selected.size() << endl;// 输出被选择的活动序号cout << "被选择的活动序号:";for (auto num : selected) {cout << num << " ";}return 0;
}

运行程序: 将测试用例输入程序。你可以在终端中手动输入活动数量以及每个活动的开始和结束时间,或者将测试用例保存在文本文件中,并使用文件重定向将其输入到程序中。

例如,在终端中手动输入:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/294501.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【每日一题】移除石子使总数最小

文章目录 Tag题目来源解题思路方法一&#xff1a;贪心优先队列 写在最后 Tag 【贪心优先队列】【数组】【2023-12-23】 题目来源 1962. 移除石子使总数最小 解题思路 方法一&#xff1a;贪心优先队列 思路 本题比较简单&#xff0c;思路也十分清晰。对于 k 次操作&#xf…

【C++】理解string类的核心理念(实现一个自己的string类)

目录 一、引言 二、自我实现 1.成员变量的读写 2.构造与析构 3.迭代器 4.插入字符或字符串 尾插 中间插入 5.删除字符或子字符串 6.查找字符或子串 7.获取子串 三、完整代码 四、补充 一、引言 实现自己的 string 类是学习 C 语言和面向对象编程的一个好方法。通过…

【Python必做100题】之第二十六题(小球反弹问题)

题目&#xff1a;一小球从100米高度自由落体落下&#xff0c;每次落地后反跳回原来高度的一半再落下&#xff0c;求它在第10次落地时&#xff0c;共经过多少米&#xff1f;第10次反弹多高&#xff1f; 思路&#xff1a;初始为100米&#xff0c;落下反弹为原来的一半&#xff1…

数据结构和算法-二叉排序树(定义 查找 插入 删除 时间复杂度)

文章目录 二叉排序树总览二叉排序树的定义二叉排序树的查找二叉排序树的插入二叉排序树的构造二叉排序树的删除删除的是叶子节点删除的是只有左子树或者只有右子树的节点删除的是有左子树和右子树的节点 查找效率分析查找成功查找失败 小结 二叉排序树 总览 二叉排序树的定义 …

模型推理加速系列 | 08:TensorRT-LLM助力LLM高性能推理

引言 ​ 日暮苍山远&#xff0c;天寒白屋贫。Created by DALLE 3 小伙伴们好&#xff0c;我是《小窗幽记机器学习》的小编&#xff1a;卖汤圆的小女孩&#xff0c;今天是冬至&#xff0c;祝福小伙伴们幸福安康吧。紧接前文&#xff1a; 万字长文细说ChatGPT的前世今生 Llam…

一款基于.NET Core的快速开发框架、支持多种前端UI、内置代码生成器

前言 经常看到有小伙伴在技术群里问有没有什么好用且快速的开发框架推荐的&#xff0c;今天就给大家分享一款基于MIT License协议开源、免费的.NET Core快速开发框架、支持多种前端UI、内置代码生成器、一款高效开发的利器&#xff1a;WalkingTec.Mvvm框架&#xff08;简称WTM…

论文推荐:大型语言模型能自我解释吗?

这篇论文的研究主要贡献是对LLM生成解释的优缺点进行了调查。详细介绍了两种方法&#xff0c;一种是做出预测&#xff0c;然后解释它&#xff0c;另一种是产生解释&#xff0c;然后用它来做出预测。 最近的研究发现&#xff0c;即使LLM是在特定数据上训练的&#xff0c;也不能认…

基于Spring自动注入快速实现策略模式+工厂模式优化过多的if..else

一、策略模式 1.1策略模式定义 在策略模式&#xff08;Strategy Pattern&#xff09;中一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式定义了一系列算法或策略&#xff0c;并将每个算法封装在独立的类中&#xff0c;使得它们可以互相…

echarts:设置折线图线条和端点的颜色

1、代码 <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>Echarts折线图</title> </head> <body> <div id"main" style"width: 600px;height:400px;"></div> <sc…

爬虫概念简述

爬虫简述 ⼀、什么是爬虫&#xff1f;二、爬虫有什么用?三、爬虫的分类四、所谓的“爬虫学的好&#xff0c;牢饭吃到饱 !”五、爬虫的大致流程 ⼀、什么是爬虫&#xff1f; ​ 简言之&#xff0c;爬虫可以帮助我们把网站上的信息快速提取并保存下来。 ​ 我们可以把互联网比…

2016年第五届数学建模国际赛小美赛C题对超级细菌的战争解题全过程文档及程序

2016年第五届数学建模国际赛小美赛 C题 对超级细菌的战争 原题再现&#xff1a; 最近有很多关于我们抗生素耐药性危机的讨论。进化出的能够抵抗抗生素的细菌每年杀死70万人&#xff0c;越来越强大的细菌正在世界各地传播。研究人员担心&#xff0c;我们将进入一个后抗生素时代…

U-Net: Convolutional Networks for Biomedical Image Segmentation(CVPR2015)

文章目录 AbstractIntroductionNetwork ArchitectureConclusiontorch code hh 源代码 Abstract 人们普遍认为&#xff0c;深度网络的成功训练需要成千上万个带注释的训练样本。在这篇论文中&#xff0c;我们提出了一个网络和训练策略&#xff0c;该策略依赖于数据增强的强大使…