华为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在线答疑。

相关推荐
火烧屁屁啦11 分钟前
【JavaEE进阶】初始Spring Web MVC
java·spring·java-ee
w_312345424 分钟前
自定义一个maven骨架 | 最佳实践
java·maven·intellij-idea
岁岁岁平安27 分钟前
spring学习(spring-DI(字符串或对象引用注入、集合注入)(XML配置))
java·学习·spring·依赖注入·集合注入·基本数据类型注入·引用数据类型注入
武昌库里写JAVA30 分钟前
Java成长之路(一)--SpringBoot基础学习--SpringBoot代码测试
java·开发语言·spring boot·学习·课程设计
Q_192849990637 分钟前
基于Spring Boot的九州美食城商户一体化系统
java·spring boot·后端
张国荣家的弟弟1 小时前
【Yonghong 企业日常问题 06】上传的文件不在白名单,修改allow.jar.digest属性添加允许上传的文件SH256值?
java·jar·bi
ZSYP-S1 小时前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring
yuanbenshidiaos1 小时前
C++----------函数的调用机制
java·c++·算法
是小崔啊2 小时前
开源轮子 - EasyExcel01(核心api)
java·开发语言·开源·excel·阿里巴巴
黄公子学安全2 小时前
Java的基础概念(一)
java·开发语言·python