华为OD机试 - 执行任务赚积分 - 动态规划(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中,刷题++点这里++

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷+C卷)》

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

现有 N 个任务需要处理,同一时间只能处理一个任务,处理每个任务所需要的时间固定为 1。

每个任务都有最晚处理时间限制和积分值,在最晚处理时间点之前处理完成任务才可获得对应的积分奖励。

可用于处理任务的时间有限,请问在有限的时间内,可获得的最多积分。

二、输入描述

第一行为一个数 N ,表示有 N 个任务(1 ≤ N ≤ 100 )

第二行为一个数 T ,表示可用于处理任务的时间。(1 ≤ T ≤ 100)

接下来 N 行,每行两个空格分隔的整数(SLA 和 和 V ),SLA 表示任务的最晚处理时间,V 表示任务对应的积分。

1≤SLA≤100 , 0 ≤ V ≤ 100000

三、输出描述

可获得的最多积分。

1、输入

4

3

1 2

1 3

1 4

1 5

2、输出

5

3、说明

虽然有 3 个单位的时间用于处理任务,可是所有任务在时刻1之后都无效。 所以在第 1 个时间单位内,选择处理有 5 个积分的任务。1−3 时无任务处理。

四、解题思路

本题的本质是一个类似于背包问题的动态规划问题,称为"01背包问题"。在这种问题中,我们需要决定在给定的总时间 T 内,应该完成哪些任务以最大化积分。每个任务都可以视为一个物品,任务的处理时间为其"重量"(在此题中恒为1),任务的积分值为其"价值"。

解题思路

  1. 定义动态规划数组:dp[i][t] 表示在前 i 个任务中,使用时间 t 所能获得的最大积分。
  2. 状态转移:对于每个任务,有两种选择:
  3. 不处理这个任务:此时积分为 dp[i-1][t]。
  4. 处理这个任务(前提是我们有足够的时间处理这个任务且在它的最晚处理时间之前):积分为 dp[i-1][t-1] + V[i]。
  5. 边界条件:dp[0][t] = 0 对所有 t,即没有任务可处理时积分为0。
  6. 优化存储:可以使用一维数组滚动更新来减少空间复杂度。

五、Java算法源码

java 复制代码
public class OdTest01 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();  // 读取任务数量
        int T = scanner.nextInt();  // 可用时间

        // 读取每个任务的最晚处理时间和积分值
        int[] SLA = new int[N + 1];
        int[] V = new int[N + 1];
        for (int i = 1; i <= N; i++) {
            SLA[i] = scanner.nextInt();
            V[i] = scanner.nextInt();
        }

        // dp[t] 表示在时间 t 内能获得的最大积分
        int[] dp = new int[T + 1];

        // 动态规划处理
        for (int i = 1; i <= N; i++) {
            // 从后向前更新,以避免一维数组中的值被提前覆盖
            for (int t = T; t >= 1; t--) {
                if (t <= SLA[i]) {  // 只有在允许的时间内处理任务时才考虑
                    dp[t] = Math.max(dp[t], dp[t - 1] + V[i]);
                }
            }
        }

        // 查找可用时间内能获得的最大积分
        int maxScore = 0;
        for (int t = 1; t <= T; t++) {
            maxScore = Math.max(maxScore, dp[t]);
        }

        // 输出结果
        System.out.println(maxScore);
    }
}

六、效果展示

1、输入

4

3

1 2

1 3

1 4

3 5

2、输出

9

3、说明

第 1 个时间单位内,处理任务3,获得 4 个积分

第 2 个时间单位内,处理任务 4,获得 5 个积分

第 3 个时间单位内,无任务可处理。

共获得 9 个积分

🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 C卷 200分)

🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷+C卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

相关推荐
快乐就好ya33 分钟前
Java多线程
java·开发语言
IT学长编程38 分钟前
计算机毕业设计 二手图书交易系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·课程设计·毕业论文·计算机毕业设计选题·二手图书交易系统
CS_GaoMing1 小时前
Centos7 JDK 多版本管理与 Maven 构建问题和注意!
java·开发语言·maven·centos7·java多版本
艾伦~耶格尔2 小时前
Spring Boot 三层架构开发模式入门
java·spring boot·后端·架构·三层架构
man20172 小时前
基于spring boot的篮球论坛系统
java·spring boot·后端
2401_858120532 小时前
Spring Boot框架下的大学生就业招聘平台
java·开发语言
S hh2 小时前
【Linux】进程地址空间
java·linux·运维·服务器·学习
LluckyYH2 小时前
代码随想录Day 58|拓扑排序、dijkstra算法精讲,题目:软件构建、参加科学大会
算法·深度优先·动态规划·软件构建·图论·dfs
Java探秘者2 小时前
Maven下载、安装与环境配置详解:从零开始搭建高效Java开发环境
java·开发语言·数据库·spring boot·spring cloud·maven·idea
攸攸太上2 小时前
Spring Gateway学习
java·后端·学习·spring·微服务·gateway