蓝桥杯 第2945题 课程抢购 C++ Java Python

目录

题目

思路和解题方法

c++ 代码

Java 版本(仅供参考)

Python 版本(仅供参考)

代码细节:

C++ 代码细节解释:

Python 代码细节解释:


lenyan算法笔记 · 语雀 《lenyan算法笔记》

个人笔记日常更新。含金量不高。/(ㄒoㄒ)/~~

题目

思路和解题方法

  1. 首先,定义了一个结构体 Course 来表示每门课程的截止时间、等待时间和含金量。
  2. main 函数中,首先读入课程数量 n,然后读入每门课程的信息,并将它们按照截止时间升序排序。
  3. 接下来,定义了一个二维数组 dp,其中 dp[i][j] 表示在前 i 门课程中,截止时间为 j 时能够获得的最大含金量。
  4. 初始化 dp 数组,将所有元素置为 0。
  5. 接着,进行动态规划的状态转移。对于每一门课程 i,遍历所有可能的截止时间 j,更新 dp[i][j]
    • 如果当前时间 j 大于等于课程 i 的截止时间,并且从当前时间往前推等待时间仍然在有效范围内,则尝试将课程 i 加入购买考虑,并更新 dp[i][j]
    • 在更新 dp[i][j] 时,可以选择将课程 i 加入购买考虑或不加入,取两者中含金量更高的那个。
  6. 最终,输出 dp[n][a[n].jie],表示在考虑了所有课程后,在截止时间为最后一门课程的截止时间时能够获得的最大含金量。

c++ 代码

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 1e5+10;

struct Course {
    int de, jie, jia; // 截止时间、等待时间、含金量
};

bool cmp(Course a, Course b) {
    return a.jie < b.jie; // 按照截止时间升序排序
}

Course a[55]; // 定义课程数组

int main() {
    int n;
    cin >> n; // 读入课程数量

    // 读入每门课程的信息
    for (int i = 1; i <= n; i++) {
        cin >> a[i].de >> a[i].jie >> a[i].jia;
    }

    sort(a + 1, a + n + 1, cmp); // 按照截止时间排序课程

    long long dp[55][N]; // 定义动态规划数组

    // 动态规划过程
    for (int i = 0; i <= n; i++) {
        for (int j = 0; j < N; j++) {
            dp[i][j] = 0;
        }
    }

    for (int i = 1; i <= n; i++) {
        for (int j = 0; j < N; j++) {
            dp[i][j] = dp[i - 1][j]; // 初始化当前状态为前一个状态
            if (j >= a[i].jie && j - a[i].de >= 0) {
                dp[i][j] = max(dp[i][j], dp[i - 1][j - a[i].de] + a[i].jia); // 状态转移方程
            }
        }
    }

    cout << dp[n][a[n].jie] << endl; // 输出结果

    return 0;
}

Java 版本(仅供参考)

import java.util.*;

public class Main {
    static class Course {
        int de, jie, jia; // 截止时间、等待时间、含金量

        public Course(int de, int jie, int jia) {
            this.de = de;
            this.jie = jie;
            this.jia = jia;
        }
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt(); // 读入课程数量

        Course[] courses = new Course[n + 1]; // 定义课程数组

        // 读入每门课程的信息
        for (int i = 1; i <= n; i++) {
            int de = scanner.nextInt();
            int jie = scanner.nextInt();
            int jia = scanner.nextInt();
            courses[i] = new Course(de, jie, jia);
        }

        Arrays.sort(courses, 1, n + 1, new Comparator<Course>() {
            @Override
            public int compare(Course a, Course b) {
                return a.jie - b.jie; // 按照截止时间升序排序
            }
        });

        long[][] dp = new long[n + 1][N]; // 定义动态规划数组

        // 动态规划过程
        for (int i = 0; i <= n; i++) {
            Arrays.fill(dp[i], 0);
        }

        for (int i = 1; i <= n; i++) {
            for (int j = 0; j < N; j++) {
                dp[i][j] = dp[i - 1][j]; // 初始化当前状态为前一个状态
                if (j >= courses[i].jie && j - courses[i].de >= 0) {
                    dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - courses[i].de] + courses[i].jia); // 状态转移方程
                }
            }
        }

        System.out.println(dp[n][courses[n].jie]); // 输出结果
    }

    static final int N = 100004; // 数组大小
}

Python 版本(仅供参考)

N = 100005

class Course:
    def __init__(self, de, jie, jia):
        self.de = de
        self.jie = jie
        self.jia = jia

if __name__ == "__main__":
    n = int(input()) # 读入课程数量
    courses = [None] * (n + 1) # 定义课程数组

    # 读入每门课程的信息
    for i in range(1, n + 1):
        de, jie, jia = map(int, input().split())
        courses[i] = Course(de, jie, jia)

    courses.sort(key=lambda x: x.jie) # 按照截止时间升序排序

    dp = [[0] * N for _ in range(n + 1)] # 定义动态规划数组

    # 动态规划过程
    for i in range(1, n + 1):
        for j in range(N):
            dp[i][j] = dp[i - 1][j] # 初始化当前状态为前一个状态
            if j >= courses[i].jie and j - courses[i].de >= 0:
                dp[i][j] = max(dp[i][j], dp[i - 1][j - courses[i].de] + courses[i].jia) # 状态转移方程

    print(dp[n][courses[n].jie]) # 输出结果

代码细节:

C++ 代码细节解释:

1. const int N = 1e5+10;
   定义了常量 N,用于表示数组的大小。
2. struct Course { int de, jie, jia; };
   定义了一个结构体 Course,用于表示课程的截止时间、等待时间和含金量。
3. bool cmp(Course a, Course b) { return a.jie < b.jie; }
   自定义了一个比较函数 cmp,用于对课程按照截止时间升序排序。
4. Course a[55];
   定义了课程数组,数组大小为 55。
5. cin >> n;
   从标准输入流读入课程数量。
6. cin >> a[i].de >> a[i].jie >> a[i].jia;
   依次读入每门课程的截止时间、等待时间和含金量。
7. sort(a + 1, a + n + 1, cmp);
   对课程数组按照截止时间进行排序。
8. long long dp[55][N];
   定义了动态规划数组 dp,用于存储动态规划过程中的状态。
9. for (int i = 0; i <= n; i++) { for (int j = 0; j < N; j++) { dp[i][j] = 0; } }
   初始化动态规划数组,将所有元素初始化为 0。
10. dp[i][j] = max(dp[i][j], dp[i - 1][j - a[i].de] + a[i].jia);
   状态转移方程,表示当前状态下的最大含金量。

Java 代码细节解释:

1. class Course { int de, jie, jia; }: 
    这定义了一个名为`Course`的普通类,其中包含三个整数成员变量,表示课程的截止时间、等待时间和含金量。

2. static class Course { int de, jie, jia; ... }: 
    这定义了一个名为`Course`的静态嵌套类,与上述普通类类似。

3. Comparator<Course> cmp = new Comparator<Course>() { @Override public int compare(Course a, Course b) { return a.jie - b.jie; } };: 
    这创建了一个名为`cmp`的`Comparator`实例,用于按截止时间升序比较`Course`对象。

4. Course[] courses = new Course[n + 1];: 
    这声明了一个类型为`Course`的数组`courses`,大小为`n + 1`,用于存储每门课程的信息。

5. courses[i] = new Course(de, jie, jia);: 
    这初始化了一个新的`Course`对象,其截止时间、等待时间和含金量分别为给定的`de`、`jie`和`jia`值,并将其赋值给数组`courses`的第`i`个元素。

6. Arrays.sort(courses, 1, n + 1, cmp);: 
    这使用比较器`cmp`对从索引`1`到`n`的`courses`数组进行排序,排序依据是课程的截止时间`jie`,按升序排列。

7. long[][] dp = new long[n + 1][N];: 
    这声明了一个二维数组`dp`,用于存储动态规划过程中的状态,其中`dp[i][j]`表示考虑前`i`门课程且截止时间为`j`时的最大含金量。

8. for (int i = 0; i <= n; i++) { Arrays.fill(dp[i], 0); }: 
    这将数组`dp`中所有元素初始化为`0`,确保所有状态正确初始化。

9. dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - courses[i].de] + courses[i].jia);: 
    这是动态规划的状态转移方程,计算考虑第`i`门课程时的最大含金量,其中`j`为截止时间。它将当前最大含金量`dp[i][j]`与考虑截止时间为`j - courses[i].de`时的前`i - 1`门课程的最大含金量加上第`i`门课程的含金量`courses[i].jia`进行比较,选择较大者。

Python 代码细节解释:

1. N = 100005:
    这行代码定义了一个常量 N,用于表示数组的大小。

2. class Course::
    这行代码定义了一个名为 Course 的类。

3. def __init__(self, de, jie, jia)::
    这行代码定义了类的构造函数,初始化课程的截止时间、等待时间和含金量。

4. courses = [None] * (n + 1):
    这行代码定义了一个列表,用于存储课程对象。

5. courses.sort(key=lambda x: x.jie):
    这行代码对课程列表按照截止时间升序排序。

6. dp = [[0] * N for _ in range(n + 1)]:
    这行代码初始化了动态规划数组,将所有元素初始化为 0。

7. dp[i][j] = max(dp[i][j], dp[i - 1][j - courses[i].de] + courses[i].jia):
    这行代码是状态转移方程,表示当前状态下的最大含金量。它将当前最大含金量 dp[i][j] 与考虑截止时间为 j - courses[i].de 时的前 i - 1 门课程的最大含金量加上第 i 门课程的含金量 courses[i].jia 进行比较,选择较大者。

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。



笔记可能有点浅薄,误喷。

📚 《lenyan算法笔记》——探索算法的乐趣

🌟 欢迎来到《lenyan算法笔记》!这是我日常记录和分享算法学习心得的地方,无论你是初学者还是已经有一定经验的程序员,都能在这里找到有趣的内容。

🧠 记录学习心得:我用通俗易懂的语言记录了自己学习算法的过程和体会,希望能够帮助到更多有相同兴趣的朋友。

💻 分享实用代码:每篇笔记都附带了一些实用的代码示例,这些示例不仅是我学习的成果,也可以作为你学习的参考。

📈 持续学习进步:算法学习是一条持续的道路,我会不断地更新笔记内容,记录自己的学习进步,与你一起成长。

🔍 分享交流:如果你对我的笔记有任何疑问或建议,都欢迎在评论区与我交流,让我们一起探讨算法的乐趣!

🚀 如果你也对算法感兴趣,不妨点击链接,一起来探索《lenyan算法笔记》吧:《lenyan算法笔记》 🔥

lenyan算法笔记 · 语雀 《lenyan算法笔记》

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

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

相关文章

ZNC3罗德与施瓦茨ZNC3网络分析仪

181/2461/8938产品概述&#xff1a; 罗德与施瓦茨 ZNC3 网络分析仪的工作频率范围为 9 kHz 至 3 GHz&#xff0c;面向移动无线电和电子产品行业的应用。它具有双向测试装置&#xff0c;用于测量有源和无源 DUT 的所有四个 S 参数。此外&#xff0c;它还提供适合开发和生产中各…

2023年第十四届蓝桥杯大赛软件类省赛C/C++研究生组真题(代码完整题解)

C题-翻转⭐ 标签:贪心 简述:如果 S 中存在子串 101 或者 010,就可以将其分别变为 111 和 000,操作可以无限重复。最少翻转多少次可以把 S 变成和 T 一样。 链接: 翻转 思路:要求步骤最少->S每个位置最多修改一次->从头开始遍历不匹配就翻转->翻转不了就-1 …

esp32中vscode的开发环境

vscode中安装esp32开发环境请参考&#xff1a;CSDN 1、调出esp32的控制面板View ->Command Paletter&#xff0c;或者快捷键&#xff08;ctrshitp&#xff09; 调出esp-idf的样例工程 选择ESP-IDF所在的安装路径 选择一个样例工程&#xff0c;作为工程模板 创建的新工程如…

基于springboot实现课程作业管理系统项目【项目源码+论文说明】

基于springboot实现课程作业管理系统演示 摘要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;课程作业管理系统当然也不能排除在外。课程作业管理系统是以实际运用为开发背景…

swift中的autoreleasepool(自动释放池)有用么?

想到一个问题 swift中的autoreleasepool(自动释放池)有用么? 我们进行验证一下 首先我们写一个加载图片的方法,保证会真正用到真实的IMP内存func loadBigData(string: String?) {if let path Bundle.main.path(forResource: "big", ofType: "png") {for…

[数据库]windows环境安装mysql数据库服务

mysql介绍 MySQL是一个流行的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它是由瑞典的MySQL AB公司开发&#xff0c;后来被Sun Microsystems收购&#xff0c;再后来Sun被Oracle收购。MySQL以其稳定性、可靠性、高性能和开放源代码的特性而闻名&#xff0c…

完整部署一套k8s-v.1.28.0版本的集群

一、系统情况 虚拟机版本&#xff1a;esxi 6.7 系统版本&#xff1a;centos7.9_2009_x86 配置&#xff1a;4核8G&#xff08;官网最低要求2核2G&#xff09; 192.168.0.137 master节点 192.168.0.139 node2节点 192.168.0.138 node1节点&#xff08;节点扩容练习&#xf…

剑指Offer题目笔记21(计数排序)

面试题74&#xff1a; 问题&#xff1a; ​ 输入一个区间的集合&#xff0c;将重叠的区间合并。 解决方案&#xff1a; ​ 先将所有区间按照起始位置排序&#xff0c;然后比较相邻两个区间的结束位置就能知道它们是否重叠。如果它们重叠就将它们合并&#xff0c;然后判断合并…

C++ namespace 使用梳理

前言 发现 namespace 这个小细节在工作项目中处理的有一点点小混乱&#xff0c;于是稍微梳理了一下关于 C namespace 使用相关的使用内容&#xff0c;为日后项目的重构做准备&#xff0c;虽然是很小的点&#xff0c;但是也是值得注意的&#xff0c;毕竟代码的质量体现在每一个…

Java项目实战笔记--基于SpringBoot3.0开发仿12306高并发售票系统--(二)项目实现-第五篇-核心功能车票预定开发及nacos集成

本文参考自 Springboot3微服务实战12306高性能售票系统 - 慕课网 (imooc.com) 本文是仿12306项目实战第&#xff08;二&#xff09;章——项目实现 的第五篇&#xff0c;本篇讲解该项目的核心功能——余票查询、车票预定功能的基础版开发&#xff0c;以及讲解项目与Nacos的集成…

linux 下固定摄像头的设备名字

为什么写着一篇文章 在做基于ARM-Linux的垃圾分类垃圾桶的时候&#xff0c;在不小心松动usb摄像头的或者是重新连接的时候&#xff0c;摄像头的编号会改变。有时候etc/udev/video2 &#xff0c;有时etc/udev/video3这样使得每次运行的时候都需要修改编号。 什么是udev规则 u…

Pillow教程03:图像处理的基本步骤+分离split+合并merge+混合blend+composite遮罩

--------------Pillow教程集合--------------- Python项目18&#xff1a;使用Pillow模块&#xff0c;随机生成4位数的图片验证码 Python教程93&#xff1a;初识Pillow模块&#xff08;创建Image对象查看属性图片的保存与缩放&#xff09; Pillow教程02&#xff1a;图片的裁剪…

mysql进阶知识总结

1.存储引擎 1.1MySQL体系结构 1).连接层 最上层是一些客户端和链接服务&#xff0c;包含本地sock通信和大多数基于客户端/服务端工具实现的类似于TCP/IP的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念&#xff0c;为通过认证…

关于v114之后的chromedriver及存放路径

使用selenium调用浏览器时&#xff0c;我一直调用谷歌浏览器&#xff0c;可浏览器升级后&#xff0c;就会再次遇到以前遇到过的各种问题&#xff0c;诸如&#xff1a;1、怎么关闭浏览器更新&#xff1b;2、去哪儿下载chromedriver&#xff1b;3、114版本之后的驱动去哪儿下载&a…

面试题:JVM的垃圾回收

一、GC概念 为了让程序员更专注于代码的实现&#xff0c;而不用过多的考虑内存释放的问题&#xff0c;所以&#xff0c;在Java语言中&#xff0c;有了自动的垃圾回收机制&#xff0c;也就是我们熟悉的GC(Garbage Collection)。 有了垃圾回收机制后&#xff0c;程序员只需要关…

力扣2. 两数相加

Problem: 2. 两数相加 文章目录 题目描述思路复杂度Code 题目描述 思路 1.创建虚拟头节点dummy&#xff0c;用于存储相加的结果数字&#xff1b; 2.让指针p1、p2、tail分别指向l1、l2、dummy&#xff0c;定义int变量carry记录每次相加的进位值&#xff1b; 3.当p1不为空或者p2不…

双非计算机考研目标211,选11408还是22408更稳?

求稳得话&#xff0c;11408比22408要稳&#xff01; 很多同学只知道&#xff0c;11408和22408在考察的科目上有区别&#xff0c;比如&#xff1a; 11408考的是考研数学一和英语一&#xff0c;22408考察的是考研数学二和英语二&#xff1a; 考研数学一和考研数学二的区别大吗…

会话跟踪技术(Session 以及Cookie)

一: 前提概要 1>会话: 会话指的是用户打开浏览器, 访问某些web服务器资源的时候, 会话就会进行建立, 直到有一方断开, 那么会话才会结束, 需要注意的一点是, 一次的会话可以有多次的请求以及响应 2>会话跟踪: 是一种用于维护浏览器状态的方法, 服务器需要识别多次的请求,…

与鲸同行,智领未来!和鲸科技“人工智能+X”学科建设合作交流会(北京站)圆满结束!

在国家加快发展新质生产力的大背景下&#xff0c;3月25日下午&#xff0c;和鲸科技 2024 年“人工智能X”学科建设合作交流会&#xff08;北京站&#xff09;暨“AIX”实验室建设与供应商选型座谈会顺利召开。为提供更为集中和专业的讨论环境&#xff0c;本次会议特别采取闭门审…

Flink on Kubernetes (flink-operator) 部署Flink

flink on k8s 官网 https://nightlies.apache.org/flink/flink-kubernetes-operator-docs-release-1.1/docs/try-flink-kubernetes-operator/quick-start/ 我的部署脚本和官网不一样&#xff0c;有些地方官网不够详细 部署k8s集群 注意&#xff0c;按照默认配置至少有两台wo…