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;
        }
    }
}
相关推荐
薛定e的猫咪2 分钟前
【大模型量化】使用 llama.cpp 完成量化、本地推理与服务化部署
人工智能·深度学习·算法·llama
薛定e的猫咪7 分钟前
【源码解读版】ContraBAR:用 CPC 对比学习替代变分推断做贝叶斯元 RL
人工智能·深度学习·学习·算法·机器学习
lzx_00210 分钟前
list(全)
数据结构·list
绿算技术1 小时前
大模型本地化的经济账:DeepSeek V4 Flash 部署实测
人工智能·科技·算法·spark
翟天保Steven1 小时前
用于提升CBCT低对比度组织分辨率的三维图像后处理方法
算法·计算机视觉·图像重建·图像后处理
FII工业富联科技服务1 小时前
GW级AI数据中心怎么建?Omniverse、CFD、液冷与BMS技术路径拆解
服务器·人工智能·算法·能源·制造
roman_日积跬步-终至千里1 小时前
【算法五】从斐波那契到动态规划:自顶向下、自底向上与状态压缩
算法·动态规划
wuyk5552 小时前
9.冒泡排序:像鱼缸泡泡一样的简单排序算法
开发语言·stm32·单片机·算法·排序算法
无限码力3 小时前
8.26华为OD机试真题 新系统【字符串回文判断】
算法·华为od·华为od机考·华为od机试·华为od上机考试真题·华为od最新机试真题题解·华为od机试真题题库
玖玥拾5 小时前
LeetCode 125 验证回文串
算法·leetcode