京东算法笔试题 模拟linux 内核任务 (2021-9-12)
两个字典
"""
题目:当服务 a 引入了服务 b作为依赖之后,服务 a 启动时 b 会随之启动,b 停止时 a 会随之停止。给你 n 个服务和它们之间的依赖关系,一开始所有服务都处于停止状态,然后进行若干次启动和停止操作,
你需要在每一次操作后输出当前正在运行的服务数量。假设所有服务都能稳定运行、正常启动和退出。为了简化输入,所有服务名使用序号(1~n)代替。可
ps:以启动正在运行的程序,也可以停止已经停止的程序,这样的操作将不会造成任何变化。
输入:
3 2 第一行两个空格隔开的整数 n, q,表示服务的数量和询问的数量,1 <= n, q <= 500。
1 2 下面 n 行,其中的第 i 行第一个整数 c 表示第 i 个服务所依赖的服务数量,后面 c 个整数表示它所依赖的各个服务,保证这 c 个整数在 1~n 范围内,互不相等且都不等于 i。
1 3
0
1 1 下面 q 行,每行两个空格隔开的整数 x, y。x 为 1 或 0,1 表示启动服务,0 表示停止服务。y 表示启动或停止的服务的序号。
0 2
输出 3
1
分析:
建立start字典 和 quit字典
start字典:key代表服务 value代表该服务的依赖 以及 依赖的祖先依赖
quit字典: key代表依赖 value代表所有依赖key的服务
我的复杂一点的例子(仅有服务信息):
5 2
2 2 3
1 4
1 4
1 5
0
对应所建字典:
输入记录{1: [2, 3], 2: [4], 3: [4], 4: [5]}
START {1: [2, 3, 4, 5], 2: [4, 5], 3: [4, 5], 4: [5]}
quit {2: [1], 3: [1], 4: [1, 2, 3], 5: [1, 2, 3, 4]}
设置一个数组为服务状态,根据动作信息更改状态
"""
def calRelys(service, i):
if service not in start:
return
layerRelys = start[service]
if service != i:
start[i].extend(layerRelys)
for rely in layerRelys:
calRelys(rely, i)
# 输入
lines = input().strip().split(' ')
n, q = int(lines[0]), int(lines[1])
# {1: [2, 3], 2: [4], 3: [4], 4: [5]}
start, quit = {}, {}
for i in range(1, n + 1):
lines = list(map(int, input().strip().split()))
if lines[0] != 0:
start[i] = lines[1:]
# 记录动作
acts = []
for i in range(q):
act = list(map(int, input().strip().split()))
acts.append(act)
# print(start)
# 建立START字典
for i in range(1, n+1):
if i in start:
calRelys(i, i)
for star in start:
start[star] = list(set(start[star]))
# 建立quit字典
for item in start:
templist = start[item]
for x in templist:
if x not in quit:
quit[x] = [item]
else:
quit[x].append(item)
# print(start)
# print(quit)
# 根据输入更改状态
state = [0]*(n+1)
for act in acts:
# 启动
if act[0] == 1:
state[act[1]] = 1
sts = start[act[1]]
for x in sts:
state[x] = 1
# 停止
else:
state[act[1]] = 0
sts = quit[act[1]]
for x in sts:
state[x] = 0
print(sum(state))