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

  • 相关阅读:
    SP笔记:交叉实现七行并成一行
    HTML tag 学习
    操作哈希表
    Efficient bipedal robots based on passivedynamic walkers
    Pushing People Around
    ZEROMOMENT PONTTHIRTY FIVE YEARS OF ITS LIFE

    Active Learning for RealTime Motion Controllers
    Accelerometerbased User Interfaces for the Control of a Physically Simulated Character
    Dynamic Response for Motion Capture Animation
  • 原文地址:https://www.cnblogs.com/fx1998/p/12678087.html
Copyright © 2011-2022 走看看