题目描述:
告警抑制,是指高优先级抑制低优先级告警的规则 。高优先级告警产生后,低优先级告警不再产生。请根据原始告警列表和告警抑制关系,给出实际产生的告警列表。
注意: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()