15.华为OD机考 - 执行任务赚积分

一、题目描述

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

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

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

二、输入描述

第一行为一个数 N,表示有 N 个任务

1≤N≤100

第二行为一个数 T,表示可用于处理任务的时间

。1≤T≤100

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

。1≤SLA≤ 100

。0≤V≤100000

三、输出描述

可获得的最多积分

四、用例1

输入

4

3

1 2

1 3

1 4

1 5

输出

java 复制代码
5

五、用例2

输入

4

3

1 2

1 3

1 4

3 5

输出

java 复制代码
9

六、代码实现

java 复制代码
package com.study.algorithm.huaweiOrOD.huaweiOD202509082334.华为OD机试真题执行任务赚积分;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

/**
 * @ProjectName: algorithm
 * @ClassName: EarnMaxScore
 * @Description: 华为OD机试真题 - 执行任务赚积分
 * @Author: Tony_Yi
 * @Date: 2025/12/14 16:26
 * @Version 1.0
 **/
public class EarnMaxScore {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        // 读取任务数量N
        int N = scanner.nextInt();
        // 读取可用处理时间T
        int T = scanner.nextInt();
        // 记录所有任务的最大SLA
        int maxSla = 0;
        List<Task> tasks = new ArrayList<>();
        // 读取每个任务的SLA和积分
        for (int i = 0; i < N; i++) {
            int sla = scanner.nextInt();
            int value = scanner.nextInt();
            // 积分为0的任务无意义,直接跳过
            if (value > 0) {
                tasks.add(new Task(sla, value));
                maxSla = Math.max(maxSla, sla);
            }
        }
        // 按贪心策略排序任务(积分高的优先)
        Collections.sort(tasks);
        int maxTime = Math.min(T, maxSla);
        // 时间槽数组,标记每个时间点是否被占用(索引1~maxTime对应时间1~maxTime)
        boolean[] timeSlot = new boolean[maxSla + 1];
        // 总积分
        int totalScore = 0;
        // 遍历每个任务,尝试安排到最晚的空闲时间槽
        for (Task task : tasks) {
            // 该任务能安排的最晚时间(不超过自身SLA和最大可用时间)
            int availableTime = Math.min(task.sla, maxTime);
            // 从后往前找空闲时间槽
            for (int t = availableTime; t >= 1; t--) {
                if (!timeSlot[availableTime]) {
                    // 占用该时间槽
                    timeSlot[availableTime] = true;
                    // 累加积分
                    totalScore += task.value;
                    // 找到槽位后跳出循环
                    break;
                }
            }
        }
        // 输出最大积分
        System.out.println(totalScore);
        scanner.close();
    }

    // 定义任务类,包含最晚处理时间和积分,实现比较器按积分降序、SLA降序排序
    static class Task implements Comparable<Task> {
        int sla;// 最晚处理时间
        int value;// 积分

        @Override
        public int compareTo(Task o) {
            if (this.value != o.value) {
                return o.value - this.value;
            } else {
                return o.sla - this.value;
            }
        }

        public Task(int sla, int value) {
            this.sla = sla;
            this.value = value;
        }
    }
}
相关推荐
海清河晏1111 小时前
数据结构 | 单循环链表
数据结构·算法·链表
wuweijianlove5 小时前
算法性能的渐近与非渐近行为对比的技术4
算法
_dindong5 小时前
cf1091div2 C.Grid Covering(数论)
c++·算法
AI成长日志5 小时前
【Agentic RL】1.1 什么是Agentic RL:从传统RL到智能体学习
人工智能·学习·算法
黎阳之光6 小时前
黎阳之光:视频孪生领跑者,铸就中国数字科技全球竞争力
大数据·人工智能·算法·安全·数字孪生
skywalker_116 小时前
力扣hot100-3(最长连续序列),4(移动零)
数据结构·算法·leetcode
6Hzlia6 小时前
【Hot 100 刷题计划】 LeetCode 17. 电话号码的字母组合 | C++ 回溯算法经典模板
c++·算法·leetcode
wfbcg6 小时前
每日算法练习:LeetCode 209. 长度最小的子数组 ✅
算法·leetcode·职场和发展
_日拱一卒6 小时前
LeetCode:除了自身以外数组的乘积
数据结构·算法·leetcode
计算机安禾7 小时前
【数据结构与算法】第36篇:排序大总结:稳定性、时间复杂度与适用场景
c语言·数据结构·c++·算法·链表·线性回归·visual studio