华为OD机试 - 告警抑制(C & Python)

文章描述了一个告警抑制的问题,其中高优先级告警会抑制低优先级告警。给定输入包括告警抑制关系和告警列表,输出为实际产生的告警列表。提供了C语言和Python的解题代码示例,通过遍历和比较来处理告警抑制关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

告警抑制,是指高优先级抑制低优先级告警的规则 。高优先级告警产生后,低优先级告警不再产生。请根据原始告警列表和告警抑制关系,给出实际产生的告警列表。

注意:1、不会出现循环抑制的情况。

            2、告警不会传递,比如 A>B,B>C 这种情况下A不会直接抑制C。  但被抑制的告警仍然可以抑制其他低优先级的告警。

输入描述:

第一行位数字N,表示告警抑制关系个数,0<=N<=120

接下来N行,每行是由空格分隔的两个告警ID,例如:id1 id2,表示id1抑制id2,告警ID的格式为大写字母+0个或者1个数字。 最后一行为告警产生列表,列表长度[1,100]。

输出描述:

真实产生的告警列表

输入举例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

A0 A

A B C D E

输出为:

A C D E

F抑制了G,C抑制了B,A抑制了G,A0抑制A。遍历告警产生列表,遍历到B,因为被C抑制了需要去掉。

解题思路:

1、记录告警抑制关系;

2、遍历告警产生列表,判断每个元素是否是id1,坐上标记位,记录label,形成列表。

3、再次遍历告警产生列表,对每个元素,遍历上条产生列表label的id2是否相等,如果不相等打印出来,相等就不打印。

C代码源码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_M   100
#define MAX_N   100
#define MAX_STR 10005

int main(){
    int i,j,num;
    scanf("%d\n",&num);
    char id1[MAX_M][MAX_N],id2[MAX_M][MAX_N];
    for(i = 0;i < num;i++){
        scanf("%s %s",id1[i],id2[i]);
    }
    //fgets会把换行符输入进入,如果采用scanf把换行符写掉
    scanf("\n");
    char str[MAX_M];
    fgets(str,10000,stdin);
    int len = strlen(str);
    //把最后一个换行符去掉
    str[len - 1] = '\0';
    //申请双指针内存,储存全部字符串.担心输入不止一个字符,例如用例2中A0
    char **alterlist = (char **)malloc(sizeof(char*)*MAX_M);
    int alter_cnt = 0;
    alterlist[alter_cnt] = (char *)malloc(sizeof(char)*MAX_N);
    alterlist[alter_cnt] = strtok(str," ");
    while(alterlist[alter_cnt] != NULL){
        alter_cnt++;
        alterlist[alter_cnt] = (char *)malloc(sizeof(char)*MAX_N);
        alterlist[alter_cnt] = strtok(NULL," ");
    }
    int arr[MAX_M] = {0};
    int arr_cnt = 0;
    //遍历告警列表中与id1是否相等,若相等,记录label,形成列表.
    for(i = 0;i < alter_cnt;i++){
        for(j = 0;j < num;j++){
            if(strcmp(alterlist[i],id1[j]) == 0){
                arr[arr_cnt++] = j;
            }
        }
    }
    //再次遍历告警列表,判断每个元素与遍历上一个形成label的id2是否相等,若不存在相等打印出来,若存在不打印.
    for(i = 0;i < alter_cnt;i++){
        int flag = 0;
        for(j = 0;j < arr_cnt;j++){
            if(strcmp(alterlist[i],id2[arr[j]]) == 0){
                //若相等,设置标志位为1
                flag = 1;
            }
        }
        //若没有相等,打印出来
        if(flag == 0){
            printf("%s ",alterlist[i]);
        }

    }
    // for(i = 0;i < alter_cnt;i++){
    //     free(alterlist[i]);
    // }
    free(alterlist);
}

Python代码

num = eval(input())
relations = [input().split() for _ in range(num)]
list = input().split()
#新建列表记录被抑制的ID
rec_list = []
def getresults():
    for i in list:
        for j in relations:
            if i == j[0]:
                rec_list.append(j[1])
    for i in rec_list:
        if i in list:
            list.remove(i)
    print(list)
getresults()

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

书书公子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值