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;
        }
    }
}
相关推荐
无限码力17 小时前
华为OD技术面真题 - 计算机网络 - 3
计算机网络·华为od·面试·华为od技术面真题·华为od面试八股文·华为od技术面计算机网络相关
一条大祥脚17 小时前
26.1.3 快速幂+容斥 树上dp+快速幂 带前缀和的快速幂 正序转倒序 子序列自动机 线段树维护滑窗
数据结构·算法
2301_7806698617 小时前
List(特有方法、遍历方式、ArrayList底层原理、LinkedList底层原理,二者区别)
java·数据结构·后端·list
二狗哈17 小时前
czsc入门5: Tick RawBar(原始k线) NewBar (新K线)
算法·czsc
Tisfy18 小时前
LeetCode 0865.具有所有最深节点的最小子树:深度优先搜索(一次DFS + Python5行)
算法·leetcode·深度优先·dfs·题解
王老师青少年编程18 小时前
信奥赛C++提高组csp-s之二分图
数据结构·c++·二分图·csp·信奥赛·csp-s·提高组
Q741_14718 小时前
C++ 队列 宽度优先搜索 BFS 力扣 429. N 叉树的层序遍历 C++ 每日一题
c++·算法·leetcode·bfs·宽度优先
Yzzz-F18 小时前
P4145 上帝造题的七分钟 2 / 花神游历各国[线段树 区间开方(剪枝) + 区间求和]
算法·机器学习·剪枝
Zzz不能停18 小时前
堆排序算法及大小堆区别
数据结构·算法
冰冰菜的扣jio18 小时前
Redis高级数据结构
数据结构·redis·bootstrap