1090 危险品装箱 (25 分)

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

易错点:

  • 一个物品可能与多个物品都无法共存。

总结:

  • split( )
  • dict( )

1090 危险品装箱 (25 分)_第1张图片
1090 危险品装箱 (25 分)_第2张图片

你可能感兴趣的:(PAT游乐园)