whenever

  • Home

  • Tags21

  • Categories6

  • Archives122

  • About

PAT乙级1090 || 危险品装箱(详解,C/C++示例,测试点分析)

Posted on 2019-12-30 In PAT

危险品装箱

题目描述

集装箱运输货物时,我们必须特别小心,不能把不相容的货物装在一只箱子里。比如氧化剂绝对不能跟易燃液体同箱,否则很容易造成爆炸。

本题给定一张不相容物品的清单,需要你检查每一张集装箱货品清单,判断它们是否能装在同一只箱子里。

输入格式

输入第一行给出两个正整数:N (≤$10^4$) 是成对的不相容物品的对数;M (≤100) 是集装箱货品清单的单数。

随后数据分两大块给出。第一块有 N 行,每行给出一对不相容的物品。第二块有 M 行,每行给出一箱货物的清单,格式如下:

1
K G[1] G[2] ... G[K]

其中 K (≤1000) 是物品件数,G[i] 是物品的编号。简单起见,每件物品用一个 5 位数的编号代表。两个数字之间用空格分隔。

输出格式

对每箱货物清单,判断是否可以安全运输。如果没有不相容物品,则在一行中输出 Yes,否则输出 No。

输入样例

1
2
3
4
5
6
7
8
9
10
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

输出样例

1
2
3
No
Yes
Yes

问题解决

解题思想

注意不相容的物品虽然是成对给出的,但是不相容物品并不是一定就是成对的,可能有两个或两个以上的物品之间不相容,或者是某物品与另外两个物品不相容,但这两个物品是相容的,等等情况。因此,这里使用map容器,物品的编号作为键,与之不相容的物品的编号用set存储作为值。对每箱货物清单,对每个货物,检查它的不相容的物品在该箱货物中是否出现过,出现过的话直接输出No,退出循环,然后把余下的物品吸收掉即可(输入进去),若没出现过,标记其在该货物清单出现,继续输入该箱余下的物品。

坑点提醒

None

代码示例(C/C++)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <vector>
#include <map>
#include <set>

using namespace std;
map <unsigned int, set <unsigned int> > mp;

int main() {
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++) { //记录不相容的一对物品
unsigned int tmp1, tmp2;
cin >> tmp1 >> tmp2;
mp[tmp1].insert(tmp2);
mp[tmp2].insert(tmp1);
}
for (int i = 0; i < m; i++) {
int k;
unsigned int tmp;
cin >> k;
vector <bool> vi(100000, 0);
while (k--) {
cin >> tmp;
int flag = 0;
for (set <unsigned int> :: iterator it = mp[tmp].begin(); it != mp[tmp].end(); it++) { //tmp的不相容集
if (vi[*it] == 1) {
cout << "No" << endl;
flag = 1;
break;
}
}
if (flag == 0) {
vi[tmp] = 1;
}
else { //有不相容,直接跳出while循环
break;
}
}
if (k != -1) { //当前行数据还未输入完毕
while (k--) {
cin >> tmp;
}
}
else { //当前行检测完毕,即不存在不相容的
cout << "Yes" << endl;
}
}
return 0;
}

题目来源:PAT乙级1090
作者:CHEN, Yue
单位:浙江大学

稀罕作者
Mengzhao Wang WeChat Pay

WeChat Pay

Mengzhao Wang Alipay

Alipay

# C/C++ # PAT # 编程
PAT乙级1089 || 狼人杀-简单版(详解,C/C++示例,测试点分析)
PAT乙级1091 || N-自守数(详解,C/C++示例,测试点分析)
  • Table of Contents
  • Overview
Mengzhao Wang

Mengzhao Wang

Try? All the way !
122 posts
6 categories
21 tags
  1. 1. 危险品装箱
    1. 1.1. 题目描述
    2. 1.2. 输入格式
    3. 1.3. 输出格式
    4. 1.4. 输入样例
    5. 1.5. 输出样例
    6. 1.6. 问题解决
      1. 1.6.1. 解题思想
      2. 1.6.2. 坑点提醒
      3. 1.6.3. 代码示例(C/C++)
© 2021 Mengzhao Wang