zoukankan      html  css  js  c++  java
  • 蓝桥杯 新生舞会 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

  • 相关阅读:
    报错apachectl restart
    报错apachectl -t
    LAMP 1.6 Discuz安装
    LAMP 1.4 PHP编译安装
    LAMP 1.2 Apache编译安装
    java时间操作
    URL参数中文乱码解决
    python | mongodb 常用命令
    python | Linux的上的MongoDB的安装与卸载
    python | 对 Flask 蓝图(Blueprint)的理解
  • 原文地址:https://www.cnblogs.com/fx1998/p/12678087.html
Copyright © 2011-2022 走看看