所有题目均有五种语言实现。C++ 实现目录、Python实现目录、Java实现目录、JavaScript实现目录
题目
题目描述:
当小区通信设备上报告警时,系统会自动生成待处理的工单,华为工单调度系统需要根据不同的策略,调度外线工程师(FME)上站去修复工单对应的问题。 根据与运营商签订的合同,不同严重程度的工单被处理并修复的时长要求不同,这个要求被修复的时长我们称之为SLA时间。
假设华为和运营商A签订了运维合同,部署了一套调度系统,只有1个外线工程师(FME),每个工单根据问题严重程度会给一个评分,在SLA时间内完成修复的工单,华为获得工单评分对应的积分,超过SLA完成的工单不获得积分,但必须完成该工单。运营商最终会根据积分进行付款。
请你设计一种调度策略,根据现状得到调度结果完成所有工单,让这个外线工程师处理的工单获得的总积分最多。假设从某个调度时刻开始,当前工单数量为N,不会产生新的工单,每个工单处理修复耗时为1小时,请设计你的调度策略,完成业务目标。不考虑外线工程师在小区之间行驶的耗时。 假设有7个工单的SLA时间(小时)和积分如下:
输入描述:
第一行为一个整数N,表示工单的数量。
接下来N行,每行包括两个整数。第一个整数表示工单的SLA时间(小时),第二个数表示该工单的积分。
输出描述:
输出一个整数表示可以获得的最大积分。
备注:
工单数量N ≤ 10
SLA时间 ≤ 7×10
答案的最大积分不会超过2147483647。
示例1: 输入输出示例仅供调试,后台判题数据一般不包含示例
输入:
7
1 6
1 7
3 2
3 1
2 4
2 5
6 1
输出:
15
思路
1:题目长的很,要挖掘出有用的信息,认真读题。
2:每个任务有SLA时间和积分两个属性,在SLA内完成可以获得积分,在SLA外完成不得积分,但是也必须完成。每个任务耗时为固定1小时,求最大可获得积分。
3:看到网上有一个比较tricky的方法,对应代码中的maxScore,表示每一个SLA时间点可以获得的积分大小。遍历所有的任务去给每一个时间点赋值。
4:代码逻辑如下:
读取输入数据
n
表示有n
个任务,每个任务有两个数值:a
(SLA 可接受时间)和b
(该任务的积分)。- 读取
n
个任务,存入二维数组tasks
。按任务积分降序排序
- 任务按照 积分
b
从大到小 排序,优先处理高积分任务。安排任务
- 使用
maxScore
数组存储每个 SLA 时间段所能获得的最大积分。- 遍历
tasks
,按照 SLA 可接受时间a
贪心分配任务:
- 若
maxScore[a]
为空,则直接放入该 SLA 时限。- 否则,尝试往前找可用的 SLA 时限
t
并填充积分。计算总积分
- 统计
maxScore
数组中的积分之和并输出。
考点
1:逻辑思维能力
Code
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int a; // SLA 时间
int b; // 任务积分
} Task;
// 比较函数,按积分从大到小排序
int cmp(const void *x, const void *y) {
return ((Task*)y)->b - ((Task*)x)->b;
}
int main() {
int n;
scanf("%d", &n);
Task tasks[n];
for (int i = 0; i < n; i++) {
scanf("%d %d", &tasks[i].a, &tasks[i].b);
}
// 按照积分降序排序
qsort(tasks, n, sizeof(Task), cmp);
// 记录每个 SLA 时间的最大积分
int maxSLA = 0;
for (int i = 0; i < n; i++) {
if (tasks[i].a > maxSLA) {
maxSLA = tasks[i].a; // 记录最大 SLA
}
}
int maxScore[maxSLA + 1]; // 记录每个 SLA 任务的最高积分
for (int i = 0; i <= maxSLA; i++) {
maxScore[i] = 0;
}
// 贪心分配任务
for (int i = 0; i < n; i++) {
int t = tasks[i].a;
while (t > 0 && maxScore[t] != 0) {
t--; // 找到最接近的可用时间槽
}
if (t > 0) {
maxScore[t] = tasks[i].b;
}
}
// 计算最大积分和
int totalScore = 0;
for (int i = 0; i <= maxSLA; i++) {
totalScore += maxScore[i];
}
printf("%d\n", totalScore);
return 0;
}
要求
时间限制:C/C++ 1秒,其他语言 2秒
空间限制:C/C++262144K,其他语言524288K
64bit IO Format:%lld
语言限定:
C(clang11), C++(clang++11), Pascal(fpc 3.0.2), Java(javac 1.8), Python2(2.7.3),
PHP(7.4.7), C#(mcs5.4), ObjC(gcc 5.4), Pythen3(3.9), JavaScript Node(12.18.2), JavaScript V8(6.0.0),
Sqlite(3.7.9), R(4.0.3), Go(1.14.4), Ruby(2.7.1), Swift(5.3), matlab(Octave 5.2), Pypy2(pypy2.7.13),
Pypy3(pypy3.6.1), Rust(1.44), Scala(2.11.12), Kotlin(1.4.10), Groovy(3.0.6), TypeScript(4.1.2), Mysql(8.0)
要求
时间限制:C/C++ 1秒,其他语言 2秒
空间限制:C/C++262144K,其他语言524288K
64bit IO Format:%lld
语言限定:
C(clang11), C++(clang++11), Pascal(fpc 3.0.2), Java(javac 1.8), Python2(2.7.3),
PHP(7.4.7), C#(mcs5.4), ObjC(gcc 5.4), Pythen3(3.9), JavaScript Node(12.18.2), JavaScript V8(6.0.0),
Sqlite(3.7.9), R(4.0.3), Go(1.14.4), Ruby(2.7.1), Swift(5.3), matlab(Octave 5.2), Pypy2(pypy2.7.13),
Pypy3(pypy3.6.1), Rust(1.44), Scala(2.11.12), Kotlin(1.4.10), Groovy(3.0.6), TypeScript(4.1.2), Mysql(8.0)
更多题目链接:
华为OD 2025 最新最全机试题库及讲解,A+B+C+D+E卷题库大全。
Java题库: 2024华为OD机试(JAVA)真题【E卷+A卷+B卷+C卷+D卷】目录_华为od机试真题-CSDN博客
Python题库: 2024华为OD机试(Python)真题【E卷+A卷+B卷+C卷+D卷】目录_华为od机试好过吗-CSDN博客
C++题库: 2024华为OD机试(C++)真题【E卷+A卷+B卷+C卷+D卷】目录_华为od怎么知道考的是a卷还是b卷-CSDN博客
Js题库: 2024 华为OD机试(JavaScript)真题【E卷+A卷+B卷+C卷+D卷】目录_华为od 2023 q2b卷-CSDN博客