原题链接:PTA | 程序设计类实验辅助教学平台
Tips:以下Python代码仅个人理解,非最优算法,仅供参考!多学习其他大佬的AC代码!
import sys
def read_input():
input_data = sys.stdin.read().splitlines() # 使用splitlines以行的形式读取输入
n, m = map(int, input_data[0].split()) # 读取不相容对数N和货品清单单数M
_bans = []
# 解析不相容物品对
for i in range(1, n + 1):
item1, item2 = input_data[i].strip().split()
_bans.append((item1, item2))
# 解析货品清单
cargo_lists = []
for i in range(n + 1, n + 1 + m):
goods = input_data[i].strip().split()
k = int(goods[0]) # 第一个元素为数量
cargo_lists.append(goods) # 直接将货品列表添加,不需再构建一次
return _bans, cargo_lists
def can_transport_safely(_bans, cargo_lists):
# 构建一个字典,用于快速查找每个物品的不相容物品
bans = {}
for item1, item2 in _bans:
if item1 not in bans:
bans[item1] = set()
bans[item1].add(item2)
if item2 not in bans:
bans[item2] = set()
bans[item2].add(item1)
results = []
for cargo in cargo_lists:
current_goods_set = set(cargo[1:]) # 使用一个集合来存储当前集装箱中的物品
is_safe = True
# 检查物品与不相容物品对的关系
for good in cargo[1:]:
if good in bans and any(item in current_goods_set for item in bans[good]):
results.append("No")
is_safe = False
break
if is_safe:
results.append("Yes")
return results
# 调用函数并输出结果
_bans, cargo_lists = read_input() # 读取并解析输入
results = can_transport_safely(_bans, cargo_lists)
for result in results:
print(result)


6453

被折叠的 条评论
为什么被折叠?



