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;
        }
    }
}
相关推荐
C雨后彩虹2 小时前
任务总执行时长
java·数据结构·算法·华为·面试
风筝在晴天搁浅2 小时前
代码随想录 463.岛屿的周长
算法
柒.梧.3 小时前
数据结构:二叉排序树构建与遍历的解析与代码实现
java·开发语言·数据结构
一个不知名程序员www3 小时前
算法学习入门---priority_queue(C++)
c++·算法
zhuzewennamoamtf3 小时前
Linux内核platform抽象、数据结构、内核匹配机制
linux·运维·数据结构
TL滕3 小时前
从0开始学算法——第十八天(分治算法)
笔记·学习·算法
LYFlied3 小时前
【每日算法】LeetCode 84. 柱状图中最大的矩形
前端·算法·leetcode·面试·职场和发展
CoderCodingNo4 小时前
【GESP】C++三级真题 luogu-B4414 [GESP202509 三级] 日历制作
开发语言·c++·算法