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

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. 输出结果

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WordPress主题仿虎嗅网/雷锋网自媒体主题(两套打包)

主题介绍 这两款wordpress主题是精仿虎嗅网和雷锋网的&#xff0c;这两款主题应该是没有多大BUG&#xff0c;同时这两款主题目前跟现在的虎嗅、雷锋两个网站看上去并没有多大区别&#xff0c;唯一美中不足的就是不支持PHP7.0以上。经常逛虎嗅网与雷锋网的同志应该是喜欢这两款…

Spring框架的核心原则和IoC容器介绍

Spring框架是一个开源的应用程序框架&#xff0c;它遵循以下核心原则&#xff1a; 1.Inversion of Control&#xff08;控制反转&#xff09;: Spring框架通过IoC容器管理对象的生命周期和依赖关系&#xff0c;而不是由程序代码直接创建对象。这样可以降低组件之间的耦合度&…

阅读笔记:明朝那些事儿妖孽横行的宫廷

明朝那些事儿第四部看完了&#xff0c;合上书本给我印象比较深刻的文臣要数王守仁&#xff0c;不愧为明朝的军事家&#xff0c;思想家&#xff0c;文学家&#xff0c;教育家&#xff0c;他经过多年的思索、磨难、追求&#xff0c;终于有一天&#xff0c;在穷乡僻壤&#xff0c;…

UEC++ 虚幻5第三人称射击游戏(一)

UEC 虚幻5第三人称射击游戏&#xff08;一&#xff09; 创建一个空白的C工程 人物角色基本移动 创建一个Character类添加一些虚幻商城中的基础动画 给角色类添加Camera与SPringArm组件 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category "SpringArm")clas…

设计软件有哪些?贴图插件篇(1),渲染100邀请码1a12

设计师经常要处理贴图&#xff0c;这里介绍一些贴图所用到的插件。 1、Substance 3D Painter Substance 3D Painter是Substance 3D软件套件中的一部分&#xff0c;是一款专业的纹理绘制软件。它提供了直观的界面和强大的工具&#xff0c;用于在3D模型上进行高质量的纹理绘制和…

Docker常用命令与实战示例

docker 1. 安装2. 常用命令3. 存储4. 网络5. redis主从复制示例6. wordpress示例7. DockerFile8. 一键安装超多中间件&#xff08;compose&#xff09; 1. 安装 以centOS系统为例 # 移除旧版本docker sudo yum remove docker \docker-client \docker-client-latest \docker-c…

第14章. GPIO简介

目录 0. 《STM32单片机自学教程》专栏 14.1 GPIO基本结构 14.1.1 保护二极管 14.1.2 上拉、下拉电阻 14.1.3 施密特触发器 14.1.4 P-MOS 管和 N-MOS 管 14.1.5 输出数据寄存器 14.1.6 输入数据寄存器 14.2 GPIO工作模式 14.2.1 输入模式 14.2.1.1 输入浮空模式 1…

ubuntu 18.04 server源码编译安装freeswitch 1.10.7支持音视频通话、收发短信——筑梦之路

软件版本说明 ubuntu版本18.04&#xff1a;https://releases.ubuntu.com/18.04.6/ubuntu-18.04.6-live-server-amd64.iso freeswitch 版本1.10.7&#xff1a;https://files.freeswitch.org/freeswitch-releases/freeswitch-1.10.7.-release.tar.gz spandsp包&#xff1a;https:…

【电路笔记】-共发射极放大器

共发射极放大器 文章目录 共发射极放大器1、概述2、完整的CEA配置3、直流等效电路4、交流等效电路5、输入阻抗6、输出阻抗7、电压增益8、微分电容的重要性9、信号源的衰减10、电流增益11、相位反转12、总结1、概述 在本文中,我们将介绍基于双极晶体管的放大器的最后一种拓扑:…

51-52Windows密码安全性测试与Windows提权

目录 Windows密码安全性测试 一、本地管理员密码如何直接提取 1、直接通过mimikatz读取管理员密码 2、使用laZagne工具读取管理员密码 二、利用Hash远程登录系统 window提权 三、远程webshell执行命令解决 不能执行原因&#xff1a; 解决方法&#xff1a;单独上传cmd.e…

Leetcode84 柱状图中最大的矩形

题目描述 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积 解题思路 思路一&#xff1a;暴力寻找&#xff0c;从每个位置出发&#xff0c;向左右两边扩…

Android View点击事件分发原理,源码解读

View点击事件分发原理&#xff0c;源码解读 前言1. 原理总结2.1 时序图总结2.2 流程图总结 2. 源码解读2.1 Activity到ViewGroup2.2 ViewGroup事件中断逆序搜索自己处理点击事件ViewGroup总结 2.3 ViewOnTouchListeneronTouchEvent 3. 附录&#xff1a;时序图uml代码 前言 两年…

Windows Api如何创建一个快捷方式并且在开始菜单搜索到自己的应用

原文链接&#xff1a;http://cshelloworld.com/home/detail/1804473083243925504 当我们点击win10系统搜索框的时候&#xff0c;输入名称 &#xff0c;win10会帮助我们匹配到对应的应用。这里搜索框实际上就是windows系统的开始菜单。 接下来我们随便找一个应用&#xff0c;右…

Adobe XD最新2023资源百度云盘下载(附教程)

如大家所了解的&#xff0c;Adobe XD是一种基于矢量的UI和UX设计工具&#xff0c;可用于设计从智能手表应用程序到成熟网站的任何内容&#xff0c;功能非常强大且操作便捷。目前最新已推出2023版本。 Adobe XD解决了Photoshop和其他图形应用程序无法解决的两个主要问题&#xf…

LSSS算法实现,基于eigen和pbc密码库【一文搞懂LSSS,原理+代码】

文章目录 一. LSSS简介1.1 概述1.2 线性秘密分享方案&#xff08;LSSS&#xff09;与 Shamir的秘密分享方案对比LSSS1.2.1 Shamir的秘密分享方案1.2.2 线性秘密分享方案&#xff08;LSSS&#xff09;1.2.3 主要区别 二. 基于矩阵的LSSS加解密原理分析2.1 LSSS矩阵构造2.1.1 定义…

Bytebase 对接本地部署的 llama3 开启ChatSQL功能

Bytebase 是为开发人员、测试、DBA和运维工程师构建的数据库 DevOps 领域的&#xff0c;类 GitLab/GitHub 平台。 这篇文章主要关注 Bytebase SQL 编辑器中的 AI 增强功能。使用此功能您可以使用自然语言在 Bytebase SQL 编辑器中查询数据库。同时还能给出针对查询的索引建议&…

WSL+Anconda(pytorch深度学习)环境配置

动机 最近在读point cloud相关论文&#xff0c;准备拉github上相应的code跑一下&#xff0c;但是之前没有深度学习的经验&#xff0c;在配置环境方面踩了超级多的坑&#xff0c;依次来记录一下。 一开始我直接将code拉到了windows本地来运行&#xff0c;遇到了数不清的问题&a…

骑马与砍杀-战团mod制作-基础篇-武器模型入骑砍(二)

骑马与砍杀战团mod制作-基础-武器模型入骑砍笔记&#xff08;二&#xff09; 资料来源 学习的资料来源&#xff1a; b站【三啸解说】手把手教你做【骑砍】MOD&#xff0c;基础篇&#xff0c;链接为&#xff1a; https://www.bilibili.com/video/BV19x411Q7No?p4&vd_sour…

【Python】已解决:安装python-Levenshtein包时遇到的subprocess-exited-with-error问题

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例及解决方案五、注意事项 已解决&#xff1a;安装python-Levenshtein包时遇到的subprocess-exited-with-error问题 一、分析问题背景 在安装python-Levenshtein这个Python包时&#xff0c;有时会…

Applied Spatial Statistics(七):Python 中的空间回归

Applied Spatial Statistics&#xff08;七&#xff09;&#xff1a;Python 中的空间回归 本笔记本演示了如何使用 pysal 的 spreg 库拟合空间滞后模型和空间误差模型。 OLS空间误差模型空间滞后模型三种模型的比较探索滞后模型中的直接和间接影响 import numpy as np impor…