1090 危险品装箱 (25 分)
题意描述:
集装箱运输货物时,我们必须特别小心,不能把不相容的货物装在一只箱子里。比如氧化剂绝对不能跟易燃液体同箱,否则很容易造成爆炸。
本题给定一张不相容物品的清单,需要你检查每一张集装箱货品清单,判断它们是否能装在同一只箱子里。
输入格式:
输入第一行给出两个正整数:N (≤10^4 ) 是成对的不相容物品的对数;M (≤100) 是集装箱货品清单的单数。
随后数据分两大块给出。第一块有 N 行,每行给出一对不相容的物品。第二块有 M 行,每行给出一箱货物的清单,格式如下:
K G[1] G[2] ... G[K]
其中 K (≤1000) 是物品件数,G[i] 是物品的编号。简单起见,每件物品用一个 5 位数的编号代表。两个数字之间用空格分隔。
输出格式:
对每箱货物清单,判断是否可以安全运输。如果没有不相容物品,则在一行中输出 Yes,否则输出 No。
输入样例:
6 3
20001 20002
20003 20004
20005 20006
20003 20001
20005 20004
20004 20006
4 00001 20004 00002 20003
5 98823 20002 20003 20006 10010
3 12345 67890 23333
输出样例:
No
Yes
Yes
解题思路:
Alice: 这道题目好熟悉啊。好像前面那个单身狗的题目。
Bob: 嗯嗯,都是关于查询的,不过上次的是一对一的,这次的可以是一对多的。如果用C/C++语言,估计不太好写。
Alice: 用Python 好写吗?
Bob: 好写啊,就是检查每行中是否有两个元素不能共存。和一个元素A不能共存的所有元素是一个列表list, 只要在一行中有其他元素B在这个list中就说明这一行元素中有两个元素 A 和 B 不能共存。
代码:
def main():
N, M = (int(x) for x in input().split())
# 接收输入的正整数 N 和 M, 元组拆包
forbidden = {}
# 用来存储 不能 共存的物品,仔细观察样例会发现,有的物品和多个其他物品都无法共存。如20004 和 20003 20005 20006 都无法共存。
for x in range(N):
alice, bob = (x for x in input().split())
# 依次读入一对不能共存的物品名称
forbidden.setdefault(alice, [])
# 注意,由于一个物品可能与多个物品都无法共存,所以每个物品的无法共存的物品为一
# 个列表
forbidden[alice].append(bob)
# 向这个列表中添加值
forbidden.setdefault(bob, [])
forbidden[bob].append(alice)
for x in range(M):
temp = [z for z in input().split()]
# 接受带检测的集装箱中的物品
answer = 'Yes'
# 先假设是 没问题的
for alice in temp[1:]:
# 注意第一个元素是物品的个数
if alice in forbidden:
# 如果 该物品在 名单中
for bob in forbidden[alice]:
# 检查与 alice 不能共存的物品是不是也在这个集装箱里
if bob in temp:
answer = 'No'
# 如果是的话,该集装箱的货物有问题。
#print(alice, bob)
break
# 记得break 出去,一个集装箱里有一对不可共存的物品就够了。
if answer == 'No':
break
# 记得break 出去,一个集装箱里有一对不可共存的物品就够了。
print(answer)
# 输出答案
if __name__ == '__main__':
main()
易错点:
- 一个物品可能与多个物品都无法共存。
总结:
注意:本文归作者所有,未经作者允许,不得转载