问题描述
新生舞会开始了。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