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

相关推荐
熊大如如4 小时前
Java 反射
java·开发语言
猿来入此小猿5 小时前
基于SSM实现的健身房系统功能实现十六
java·毕业设计·ssm·毕业源码·免费学习·猿来入此·健身平台
goTsHgo5 小时前
Spring Boot 自动装配原理详解
java·spring boot
卑微的Coder5 小时前
JMeter同步定时器 模拟多用户并发访问场景
java·jmeter·压力测试
pjx9876 小时前
微服务的“导航系统”:使用Spring Cloud Eureka实现服务注册与发现
java·spring cloud·微服务·eureka
多多*6 小时前
算法竞赛相关 Java 二分模版
java·开发语言·数据结构·数据库·sql·算法·oracle
爱喝酸奶的桃酥6 小时前
MYSQL数据库集群高可用和数据监控平台
java·数据库·mysql
唐僧洗头爱飘柔95277 小时前
【SSM-SSM整合】将Spring、SpringMVC、Mybatis三者进行整合;本文阐述了几个核心原理知识点,附带对应的源码以及描述解析
java·spring·mybatis·springmvc·动态代理·ioc容器·视图控制器
骑牛小道士7 小时前
Java基础 集合框架 Collection接口和抽象类AbstractCollection
java
alden_ygq7 小时前
当java进程内存使用超过jvm设置大小会发生什么?
java·开发语言·jvm