蓝桥杯 新生舞会 map

问题描述
  新生舞会开始了。n名新生每人有三个属性:姓名、学号、性别。其中,姓名用长度不超过20的仅由大小写字母构成的字符串表示,学号用长度不超过10的仅由数字构成的字符串表示,性别用一个大写字符‘F’或‘M’表示。任意两人的姓名、学号均互不相同。换言之,每个人可被其姓名或学号唯一确定。给出m对两人的信息(姓名或学号),判断他们是否能共舞。两人能共舞的充要条件为两人性别相异。
输入
  第一行一个整数n(2<=n<=1000),表示学生人数。接下来的n行每行依次包含一名新生的姓名、学号、性别,分别用一个空格隔开。
  之后的一行是一个整数m(1<=m<=1000),表示询问的数目。接着的m行每行包含两个信息(姓名或学号),保证两个信息不属于同一人,中间用一个空格隔开。
输出
  对于每个询问输出一行,如果两人可以共舞,输出一个大写字母‘Y’,否则输出一个大写字母‘N’。
样例输入
  4
  John 10 M
  Jack 11 M
  Kate 20 F
  Jim 21 M
  3
  John 11
  20 Jack
  Jim Jack
样例输出
  N
  Y
  N

这道题一开始我定义了一个这样的结构体

1 struct Student{
2     string name;
3     string id;
4     string sex;
5 } std[1010];

然后发现当我想要找到一个姓名为name的人的sex时,或者想找到一个学号为id的人的sex时,只能遍历一遍所有人,而且题目的m个询问,给的是name或id,还需要判断给的是name还是id,然后想到用pair可以直接建立映射关系,然后写了一个这样的pair

1 pair<string, pair<string, string> > p;
2 //first为name, second.first为id, second.second为sex 

在知道name或id的情况下可以不需要遍历所有人,直接找到对应的sex了。但是还是需要判断题目的m个询问里给的是name还是id

然后就是正解了:

定义一个map,把name和id都当作first,sex当作second

比如样例John 10 M

就定义 map[John] = M 和map[10] = M,一个人的信息存储两次。

因为题目保证了两个信息不属于同一个人,所以一个map直接解决

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int main() {
 4     map<string, string> name_id_to_sex; //从name找sex,以及从id找sex 
 5     int n;
 6     cin >> n;
 7     while (n--) {
 8         string name, id, sex;
 9         cin >> name >> id >> sex;
10         name_id_to_sex[name] = name_id_to_sex[id] = sex;
11     }
12     int m;
13     cin >> m;
14     while (m--) {
15         string s1, s2;
16         cin >> s1 >> s2;
17         if (name_id_to_sex[s1] != name_id_to_sex[s2]) {
18             cout << "Y" << endl;
19         } else {
20             cout << "N" << endl;
21         }
22     }
23     return 0;
24 }

那如果题目没有保证两个信息不属于同一个人呢,比如样例John 10 M,如果给了John 和 10,或John 和 John 或 10 和 10怎么办?

那就再开一个map,建立name和id的映射,即map[John] = 10,map[10] = John,然后多加俩判断,代码如下

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int main() {
 4     map<string, string> name_id_to_sex; //从name找sex,以及从id找sex 
 5     map<string, string> id_to_name; //从id找name,以及从name找id 
 6     int n;
 7     cin >> n;
 8     while (n--) {
 9         string name, id, sex;
10         cin >> name >> id >> sex;
11         id_to_name[id] = name;
12         id_to_name[name] = id;
13         name_id_to_sex[name] = name_id_to_sex[id] = sex;
14     }
15     int m;
16     cin >> m;
17     while (m--) {
18         string s1, s2;
19         cin >> s1 >> s2;
20         if (id_to_name[s1] != s2 && s1 != s2 && name_id_to_sex[s1] != name_id_to_sex[s2]) {
21             cout << "Y" << endl;
22         } else {
23             cout << "N" << endl;
24         }
25     }
26     return 0;
27 }

参考自https://blog.csdn.net/caipengbenren/article/details/88620115

猜你喜欢

转载自www.cnblogs.com/fx1998/p/12678087.html