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

题目描述:

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

注意: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 
#include 
#include 

#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()

你可能感兴趣的:(华为od,c语言,华为)