2023年华为OD机试(python)B卷-告警抑制

一、题目

题目描述:

告警抑制,是指高优先级告警抑制低优先级告警的规则。高优先级告警产生后,低优先级告警不再产生。请根据原始告警列表和告警抑制关系,给出实际产生的告警列表。不会出现循环抑制的情况。告警不会传递,比如A->B.B->C,这种情况下A不会直接抑制C。但被抑制的告警仍然可以抑制其他低优先级告警。

二、输入输出

输入描述:
第一行为数字N,表示告警抑制关系个数,0<=N <=120 
接下来N行,每行是由空格分隔的两个告警ID,例如: id1 id2,表示id1抑制id2,告警ID的格式为: 
大写字母+0个或者1个数字 最后一行为告警产生列表,列表长度[1,100]
输出描述:
真实产生的告警列表
备注:
告警ID之间以单个空格分隔

三、示例

示例1: 
输入:
2
A B
B C
A B C D E
输出:
A D E 
说明:
A抑制了B,B抑制了C,最后实际的告警为A D E
示例2:
输入:
4
F G
C B
A G
A O A
A B C D E
输出:
A C D E  

2023年华为OD机试(python)B卷-告警抑制_第1张图片

四、要求

时间限制:C/C++ 1秒,其他语言 2秒
空间限制:C/C++262144K,其他语言524288K

五、解题思路

根据题目描述,我们需要构造出告谨之间的抑制关系,就可以直接遍历每一个id2,获得实际的告警列表信息。

六、参考代码 

# -*- coding: utf-8 -*-
'''
@File    :   2023-B-告警抑制.py
@Time    :   2023/12/28 02:02:06
@Author  :   mgc 
@Version :   1.0
@Desc    :   None
'''

# import os
# import re
# import sys
# import copy
# import math
# import queue
# import functools
# from queue import Queue
# from collections import Counter, defaultdict

def generateActualAlerts():
    count = int(input())  # 告警抑制关系个数

    alter_relations = {}  # 告警之间的关系字典

    # 处理告警抑制关系
    for i in range(count):
        arr = input().split()  # 输入告警抑制关系
        if arr[1] not in alter_relations:
            alter_relations[arr[1]] = []
        alter_relations[arr[1]].append(arr[0])

    all_alerts = input().split()  # 告警产生列表
    alter_set = set(all_alerts)

    result = ""
    for id2 in all_alerts:
        if id2 not in alter_relations or alter_set.isdisjoint(alter_relations.get(id2)):
            result += id2 + " "

    return result[:-1]  # 去除最后一个空格


# 调用主函数
if __name__ == '__main__':
    actual_alerts = generateActualAlerts()
    print(actual_alerts)

你可能感兴趣的:(华为机试,华为od,python,算法,华为机试,告警抑制)