动态规划——活动安排问题II(C++)

news2024/11/21 16:13:24

Take it easy!

2024年6月19日


题目描述

        假设有n个活动和一个资源,每个活动执行时都需要占用该资源,并且该资源在任何时间只能被一个活动所占用,一旦某个活动开始执行,中间将不能被打断,直到其执行完毕。每个活动i都有一个开始时间start_i和结束时间end_i(start_i < end_i),其占用的资源的时间=start_i - end_i。假设最早活动执行的时间为0,试求一种最优活动安排方案,使得安排的活动占用时间最长。

输入格式

        第一行输入t表示活动的数量,其后的t行分别输入每个活动的开始时间和结束时间。

输入样例

11

1   4
3   5
6   10
0   6
5   7
3   8
8   12
5   9
8   11
12  15
2   13

输出样例

13


题解方法

        贪心法+动态规划

1. 根据贪心思想,按活动结束时间递增排序;

2. 确定状态转移方程;(本题和0-1背包问题类似)

dp[i]表示在活动0~i之间选取可兼容的活动能够持续的最长时间。

  • 和0-1背包问题有一点相似,每个活动都有选与不选,但是需要确定每个活动的前驱活动;(注意前驱活动不是想当然的前一个活动!前驱活动表示与当前活动相兼容的前一个活动)
  • 如果没有前驱活动,当前dp[i] = max(dp[i - 1], v[i].end - v[i].start);
  • 如果有前驱活动,当前dp[i] = max(dp[i - 1], dp[j] + v[i].end - v[i].start);

题解代码

1. 定义活动结构体;

struct Action{
    int start;
    int end;
    Action(int start, int end):start(start), end(end) {}
    bool operator<(const Action &a) const{
        return end <= a.end;
    }
};

2. 定义求解最长持续时间函数;

int getLongestLastTime(vector<Action> &v, vector<int> &dp){
    sort(v.begin(), v.end());
    int len = v.size();
    // 定义结果
    int res = 0;
    // 第一个活动很明显没有前驱活动
    // dp[i]表示在0~i之间的活动中选取,持续的最长时间
    dp[0] = v[0].end - v[0].start;
    for(int i = 1; i < len; i++){
        // 定义前驱活动的标记
        int pre = i - 1;
        while(pre >= 0 && v[pre].end > v[i].start){
            pre--;
        }
        if(pre != -1){//说明有前驱活动
            dp[i] = max(dp[i-1], dp[pre] + v[i].end - v[i].start);
        }
        else{
            dp[i] = max(dp[i-1], v[i].end - v[i].start);
        }
    }
    cout<<"dp数组为:";
    for(auto e:dp){
        cout<<e<<'\t';
    }
    return dp[len-1];
}

3. 完整代码

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

struct Action{
    int start;
    int end;
    Action(int start, int end):start(start), end(end) {}
    bool operator<(const Action &a) const{
        return end <= a.end;
    }
};

int getLongestLastTime(vector<Action> &v, vector<int> &dp){
    sort(v.begin(), v.end());
    int len = v.size();
    // 定义结果
    int res = 0;
    // 第一个活动很明显没有前驱活动
    // dp[i]表示在0~i之间的活动中选取,持续的最长时间
    dp[0] = v[0].end - v[0].start;
    for(int i = 1; i < len; i++){
        // 定义前驱活动的标记
        int pre = i - 1;
        while(pre >= 0 && v[pre].end > v[i].start){
            pre--;
        }
        if(pre != -1){//说明有前驱活动
            dp[i] = max(dp[i-1], dp[pre] + v[i].end - v[i].start);
        }
        else{
            dp[i] = max(dp[i-1], v[i].end - v[i].start);
        }
    }
    cout<<"dp数组为:";
    for(auto e:dp){
        cout<<e<<'\t';
    }
    return dp[len-1];
}

int main(){

    vector<Action> v;
    int t;
    cin>>t;
    for(int i = 0; i < t; i++){
        int start, end;
        cin>>start>>end;
        v.push_back(Action(start, end));
    }

    vector<int> dp(v.size(), 0);
    int res = getLongestLastTime(v, dp); 
    cout<<endl<<"活动的最长持续时间为"<<res;
    return 0;
}

4. 输出结果

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

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

相关文章

数据结构--顺序表(图文)

顺序表的概念和特点 顺序表是一种线性数据结构&#xff0c;它由一组数据元素构成&#xff0c;这些元素具有相同的特性&#xff0c;并按照一定的顺序排列。在顺序表中&#xff0c;数据元素通常存储在连续的内存空间中&#xff0c;这使得通过索引可以直接访问到表中的任意元素。…

考研计组chap2数据的表示和运算

3一、进位计数制 1.r进制 第i位表示r进制的权为i 2.进制转换 &#xff08;1&#xff09;r->10 对应位置数*权值 &#xff08;2&#xff09;2 -> 16 or 8 每三位2进制数可表示1位16进制 每四位2进制数可表示1位16进制 so 分开之后转为16进制即可 eg&#xff1a;1…

欧拉函数的求解

欧拉函数的定义 欧拉函数的性质 性质1是性质2的特殊情况 性质1的理解&#xff1a;一个数a是质数&#xff0c;前面的数b与a的gcd一定是1 性质2的理解&#xff1a;1,2,…p,p1,p2…2p,…3p…p^k 其中以np结尾的序列重复了p^&#xff08;k-1&#xff09;次&#xff0c;每一次的循环…

Day10—Spark SQL基础

Spark SQL介绍 ​ Spark SQL是一个用于结构化数据处理的Spark组件。所谓结构化数据&#xff0c;是指具有Schema信息的数据&#xff0c;例如JSON、Parquet、Avro、CSV格式的数据。与基础的Spark RDD API不同&#xff0c;Spark SQL提供了对结构化数据的查询和计算接口。 Spark …

星戈瑞FITC-Cytochrome C:荧光标记细胞色素C的研究与应用

细胞色素C&#xff08;Cytochrome C&#xff09;是一种位于线粒体内膜上的蛋白质。为了深入地研究细胞色素C在细胞生物学和病理学中的功能&#xff0c;科学家们常常采用荧光标记技术对其进行追踪和观察。其中&#xff0c;异硫氰酸荧光素&#xff08;FITC&#xff09;作为一种常…

iOS原生APP开发的技术难点

iOS原生APP开发的技术难点主要体现在以下几个方面&#xff0c;总而言之&#xff0c;iOS原生APP开发是一项技术难度较高的工作&#xff0c;需要开发者具备扎实的编程基础、丰富的开发经验和良好的学习能力。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xf…

再谈量化策略失效的问题

数量技术宅团队在CSDN学院推出了量化投资系列课程 欢迎有兴趣系统学习量化投资的同学&#xff0c;点击下方链接报名&#xff1a; 量化投资速成营&#xff08;入门课程&#xff09; Python股票量化投资 Python期货量化投资 Python数字货币量化投资 C语言CTP期货交易系统开…

数据结构之B树的理解与示例(C#)

文章目录 B树的基本概念与特点B树在C#数据结构中的应用创建一个B树节点的具体代码示例插入、删除和查找操作的示例B树在文件存储与处理中的具体应用示例总结 B树是一种自平衡的树数据结构&#xff0c;它维持数据的有序性&#xff0c;并且允许搜索、顺序访问、插入和删除的操作都…

前后端完整案例-简单模仿点点开黑抽奖

数据库 后台 源码&#xff1a;https://gitee.com/qfp17393120407/game 前台 源码&#xff1a; https://gitee.com/qfp17393120407/game-weeb vue项目打包 注意&#xff1a;打包时将IP改为自己公网IP npm run build公网页面 地址&#xff1a;点点模拟抽奖 进入页面抽奖…

电路笔记 :LM3481MM/NOPB升压模块,升压电路原理

LM3481MM/NOPB LM3481MM/NOPB 是德州仪器&#xff08;Texas Instruments&#xff09;的一款广泛应用的DC-DC控制器&#xff0c;常用于电源管理应用&#xff0c;特别是在需要升压&#xff08;boost&#xff09;、反激&#xff08;flyback&#xff09;、SEPIC或反向配置的场合。…

企业UDP文件传输工具测速的方式(下)

在前一篇文章中&#xff0c;我们深入讨论了UDP传输的基本概念和镭速UDP文件传输工具如何使用命令行快速进行速度测试。现在&#xff0c;让我们进一步探索更为高级和灵活的方法&#xff0c;即通过整合镭速UDP的动态或静态库来实现网络速度的测量&#xff0c;以及如何利用这一过程…

Java零基础之多线程篇:线程的多种创建方式

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

支持向量机 (SVM) 算法详解

支持向量机 (SVM) 算法详解 支持向量机&#xff08;Support Vector Machine, SVM&#xff09;是一种监督学习模型&#xff0c;广泛应用于分类和回归分析。SVM 特别适合高维数据&#xff0c;并且在处理复杂非线性数据时表现出色。本文将详细讲解 SVM 的原理、数学公式、应用场景…

[Qt的学习日常]--窗口

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、窗口的分…

最新!!单目深度估计方向文献综述--Monocular Depth Estimation: A Thorough Review

论文链接&#xff1a;https://ieeexplore.ieee.org/abstract/document/10313067 Abstract 一个是考虑人类深度感知的机制&#xff0c;另一个是包括各种深度学习方法。 这篇论文是关于单目深度估计&#xff08;Monocular Depth Estimation&#xff09;的全面综述&#xff0c;由…

Flutter第十三弹 路由和导航

目标&#xff1a; 1.Flutter怎么创建路由&#xff1f; 2.怎么实现路由跳转&#xff1f;页面返回&#xff1f; 一、路由 1.1 什么是路由&#xff1f; 路由(Route)在移动开发中通常指页面&#xff08;Page&#xff09;&#xff0c;在Android中通常指一个Activity。所谓路由管…

wsl报错在BIOS中启用虚拟化

解决&#xff1a; Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All 以高级管理员身份运行powershell&#xff0c;执行如上命令。

GoldWave软件下载 GoldWave 音频处理软件 v6.80.0 官方版下载附加详细安装步骤

准确来讲GoldWave软件防止GoldWave *原生音频插件被禁用。根据大数据结果显示回声效果&#xff1a;回声&#xff0c;顾名思义是指声音发出后经过一定的时间再返回被我们听到&#xff0c;就象在旷野上面对高山呼喊一样&#xff0c;在很多视频剪辑、配音中广泛采用&#xff0c; G…

最新版本IntelliJ IDEA安装与“坤活”使用

最新版本IntelliJ IDEA安装与“科学”使用 IntelliJ IDEA安装与坤活下载安装坤活idea1.将下面两个压缩文件解压到安装位置&#xff0c;注意路径不要包含中文空格等特殊符号2.双击 install-all-users.vbs &#xff0c;然后点击确定&#xff0c;等到出现 Done的弹窗3. 打开idea复…

【ajax基础04】form-serialize插件

目录 一&#xff1a;form-serialize插件 作用&#xff1a; 语法格式&#xff1a; 一&#xff1a;form-serialize插件 作用&#xff1a; 快速且大量的收集表单元素的值 例如上图对于多表单元素的情形&#xff0c;单靠通过”选择器获取节点.value”值的形式&#xff0c;获取…