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;
        }
    }
}
相关推荐
BirdenT4 小时前
20260424紫题训练
c++·算法
还是阿落呀4 小时前
基本控制结构
开发语言·c++·算法
样例过了就是过了4 小时前
LeetCode热题100 最长有效括号
c++·算法·leetcode·动态规划
wayz114 小时前
Day 18:Keras深度学习框架入门
人工智能·深度学习·神经网络·算法·机器学习·keras
一行代码一行诗++4 小时前
C语言中if的使用
c语言·c++·算法
AI科技星4 小时前
《基于 1 的 N 维分形与对称统一理论》
人工智能·算法·机器学习·数学建模·数据挖掘
wljy15 小时前
牛客每日一题(2026.4.30) 整数域二分
c语言·c++·算法·蓝桥杯·二分
水蓝烟雨5 小时前
3335. 字符串转换后的长度 I
算法·leetcode
Dxy12393102165 小时前
HTML 如何使用 SVG 画曲线
前端·算法·html
westdata-Tm5 小时前
洛谷P1219 [USACO1.5] 八皇后 Checker Challenge
算法·深度优先·dfs