一、题目描述
现有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;
}
}
}