华为OD机试真题e卷 C语言 实现【工单调度策略】

    所有题目均有五种语言实现。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:代码逻辑如下:

  1. 读取输入数据

    • n 表示有 n 个任务,每个任务有两个数值:a(SLA 可接受时间)和 b(该任务的积分)。
    • 读取 n 个任务,存入二维数组 tasks
  2. 按任务积分降序排序

    • 任务按照 积分 b 从大到小 排序,优先处理高积分任务。
  3. 安排任务

    • 使用 maxScore 数组存储每个 SLA 时间段所能获得的最大积分。
    • 遍历 tasks,按照 SLA 可接受时间 a 贪心分配任务
      • maxScore[a] 为空,则直接放入该 SLA 时限。
      • 否则,尝试往前找可用的 SLA 时限 t 并填充积分。
  4. 计算总积分

    • 统计 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博客

C语言题库: 2024 华为OD机试(C语言)真题【E卷+A卷+B卷+C卷+D卷】目录-CSDN博客

面试手撕题库: 2024华为OD面试手撕代码真题目录_华为od手撕代码-CSDN博客