贪心法之活动安排问题

news2025/3/5 4:57:49

问题:

                给定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.coloradmin.cn/o/1329264.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Linphone android sdk开发Android软话机

1.Linphone简介 1.1 简介 LinPhone是一个遵循GPL协议的开源网络电话或者IP语音电话&#xff08;VOIP&#xff09;系统&#xff0c;其主要如下。使用linphone&#xff0c;开发者可以在互联网上随意的通信&#xff0c;包括语音、视频、即时文本消息。linphone使用SIP协议&#…

2024年你的年度目标OKR制定好了吗?

标题2023年余额见底&#xff0c;2024年的FLAG都制定好了吗&#xff1f; 目标很明确&#xff0c;计划很丰满&#xff0c;执行起来又处处透着一点点乏力&#xff0c;怎么办&#xff1f; 2024年可以尝试用OKR制定目标。 OKR目标管理方法&#xff0c;既适用于企业&#xff0c;也…

连续色调图像的二维编码

连续色调图像的二维编码&#xff08;也被称为连续色调图像的矢量量化&#xff09;是一种图像压缩和数据储存的方法&#xff0c;适用于连续渐变的色彩信息。该编码方法有助于减小图像文件的体积&#xff0c;并被广泛应用于数字图像处理、存储和传输领域。本文将介绍连续色调图像…

【科学计算语言】实验四 科学计算与可视化

【目的和要求】 &#xff08;1&#xff09;理解科学计算实质并掌握Python语言的科学计算应用 &#xff08;2&#xff09;掌握常用科学计算库 &#xff08;3&#xff09;熟练运用numpy及scipy、matplotlib等计算库资源 【实验准备】 Python核心科学计算库的导入、配置并熟悉相关…

Hive-high Avaliabl

hive—high Avaliable ​ hive的搭建方式有三种&#xff0c;分别是 ​ 1、Local/Embedded Metastore Database (Derby) ​ 2、Remote Metastore Database ​ 3、Remote Metastore Server ​ 一般情况下&#xff0c;我们在学习的时候直接使用hive –service metastore的方式…

基于ChatGLM搭建专业领域问答机器人的思路

如果我们对ChatGLM进一步提出涉及专业领域的问题&#xff0c;而此方面知识是ChatGLM未经数据训练的&#xff0c;那么ChatGLM的回答效果如何呢&#xff1f;本节将考察ChatGLM在专业领域的问答水平&#xff0c;并尝试解决此方面的问题。 在使用ChatGLM制作专业领域问答机器人之前…

【Amazon 实验①】Amazon WAF功能增强之实验环境准备

文章目录 1. 实验介绍2. 实验环境准备 1. 实验介绍 在真实的网络空间中&#xff0c;攻击者会使用大量广泛分布的僵尸网络、肉机等发起对目标的攻击。 其来源分布一般比较分散&#xff0c;因此难以简单防范。 本实验联合使用有多种AWS服务&#xff1a;Cloudfront、 Lambdaedge…

服务器数据恢复-服务器断电导致linux操作系统数据丢失的数据恢复案例

linux操作系统服务器数据恢复环境&#xff1a; 某品牌R730服务器MD3200系列存储&#xff0c;linux操作系统。 服务器故障&#xff1a; 机房意外断电导致服务器linux操作系统部分文件丢失。 服务器数据恢复过程&#xff1a; 1、将故障服务器连接到北亚企安数据恢复中心备份服务器…

【开源工程及源码】超级经典开源项目实景三维数字孪生智慧港口

智慧港口可视化平台&#xff0c;旨在实现对港口运营的全面监测、智能管理和优化决策。飞渡科技利用数字化、模拟和仿真的技术&#xff0c;通过互联的传感器和设备&#xff0c;实现实时数据的采集、传输和分析&#xff0c;将港口内外的复杂数据以直观、易懂的方式呈现&#xff0…

前端学习——vuex的入门

学习一门技术最快捷的方式就是先了解其概念和使用场景&#xff0c;毕竟任何技术的出现都是为了解决某一个场景下的通用解决方案&#xff0c;并且使用最合理的方式去解决问题。 那么什么是vuex&#xff1f; Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 库。它采用集中…

Python---搭建Python自带静态Web服务器

1. 静态Web服务器是什么&#xff1f; 可以为发出请求的浏览器提供静态文档的程序。 平时我们浏览百度新闻数据的时候&#xff0c;每天的新闻数据都会发生变化&#xff0c;那访问的这个页面就是动态的&#xff0c;而我们开发的是静态的&#xff0c;页面的数据不会发生变化。 …

使用 Postman 进行并发请求:实用教程与最佳实践

背景介绍 最近&#xff0c;我们发起了一个在线图书管理系统的项目。我负责的一个关键模块包括三个主要后台接口&#xff1a; 实现对books数据的检索。实施对likes数据的获取。通过collections端点访问数据。 应对高流量的挑战 在设计并部署接口时&#xff0c;我们不可避免地…

tomcat和nginx自定义404错误页面

nginx 编辑nginx配置文件 vim /www/server/nginx/nginx.conf server{listen 80;error_page 404 /404.html;location /404.html{root /home/liu/html/error-html;} }在家目录下创建一个html/error-html目录&#xff0c;用于存放错误页面 在error-html目录下创建404.html&a…

心有暖阳,笃定前行,2024考研加油

2024考研学子&#xff0c;所有的付出终有收获&#xff0c;阳光终将穿透阴霾&#xff0c;终将上岸。 当曙光破晓的时候&#xff0c;你可曾记得那些星月为伴&#xff0c;孤独为友&#xff0c;理想为灯来指引前行之路的日子&#xff0c;那些默默扎根的日子终将化作星星在未来闪闪发…

第一部分 数理逻辑

目录 什么是命题 注意&#xff1a; 例1 下列句子中那些是命题&#xff1f; 联结词 例2 将下列命题符号化. 注意&#xff1a; 例4 设 p&#xff1a;天冷&#xff0c;q&#xff1a;小王穿羽绒服&#xff0c;将下列命题符号化 例5 求下列复合命题的真值 例如 真值表: 例&#xff1…

我的应用我做主:扩展线程池

自定义线程创建&#xff1a;ThreadFactory 线程池中的线程是从哪里来的呢&#xff1f; ThreadPoolExecutor(int corePoolSize,//指定了线程池种的线程数量 int maximumPoolSize,//指定了线程池中的最大线程数量。 long keepAliveTime,// 当线程池数量超过了corePoolSize&#x…

MyBatis关联查询(二、一对多查询)

MyBatis关联查询&#xff08;二、一对多查询&#xff09; 需求&#xff1a;查询所有用户信息及用户关联的账户信息。 分析&#xff1a;用户信息和他的账户信息为一对多关系&#xff0c;并且查询过程中如果用户没有账户信息&#xff0c;此时也要将用户信息查询出来&#xff0c…

Python (十四)pandas(二)

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

WPF组合控件TreeView+DataGrid之DataGrid封装-粉丝专栏

wpf的功能非常强大&#xff0c;很多控件都是原生的&#xff0c;但是要使用TreeViewDataGrid的组合&#xff0c;就需要我们自己去封装实现。 我们需要的效果如图所示&#xff1a; 这2个图都是第三方控件自带的&#xff0c;并且都是收费使用。 现在我们就用原生的控件进行封装一…

rouyi-vue-pro+vue3+vite4+Element Plus项目中使用生成Vue2+Element UI标准模板

运行一个pro-vue3的前端项目&#xff0c;以及后端服务 在基础设施-代码生成模块中选择某张数据库表导入&#xff0c;并编辑生成信息&#xff0c;前端类型&#xff1a;Vue2Element UI标准模板 在vue3项目中创建一个vue文件 <template> </template><script>…