东方博宜OJ 1953:新生舞会 ← STL map / 结构体

​【题目来源】
https://oj.czos.cn/p/1953

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

【数据范围】
2≤n≤1000,
1≤m≤1000

【算法分析】
isdigit(x) 函数用于判断字符 x 是否为十进制数字字符(即 '0' 到 '9')。

【算法代码:STL map

#include <bits/stdc++.h>
using namespace std;

map<string,char> nameToSex;
map<string,char> idxToSex;
string name,idx;
char sex;
int n,m;

int main() {
    cin>>n;
    while(n--) {
        cin>>name>>idx>>sex;
        nameToSex[name]=sex;
        idxToSex[idx]=sex;
    }

    cin>>m;
    while(m--) {
        string s,t;
        cin>>s>>t;
        char sexA, sexB;

        if(isdigit(s[0])) sexA=idxToSex[s];
        else sexA=nameToSex[s];

        if(isdigit(t[0])) sexB=idxToSex[t];
        else sexB=nameToSex[t];

        if(sexA!=sexB) cout<<"Y"<<endl;
        else cout<<"N"<<endl;
    }

    return 0;
}

/*
in:
4
John 10 M
Jack 11 M
Kate 20 F
Jim 21 M
3
John 11
20 Jack
Jim Jack

out:
N
Y
N
*/


【算法代码二:结构体 + STL map

#include <bits/stdc++.h>
using namespace std;

const int maxn=1e3+5;
map<string,char> nameToSex;
map<string,char> idxToSex;

struct Person {
    string name;
    string idx;
    char sex;
} p[maxn];

int main() {
    int n,m;
    cin>>n;
    for(int i=1; i<=n; i++) {
        cin>>p[i].name>>p[i].idx>>p[i].sex;
        nameToSex[p[i].name]=p[i].sex;
        idxToSex[p[i].idx]=p[i].sex;
    }

    cin>>m;
    while(m--) {
        string s,t;
        cin>>s>>t;
        char sexA,sexB;

        if(isdigit(s[0])) sexA=idxToSex[s];
        else sexA=nameToSex[s];

        if(isdigit(t[0])) sexB=idxToSex[t];
        else sexB=nameToSex[t];

        if(sexA!=sexB) cout<<"Y"<<endl;
        else cout<<"N"<<endl;
    }

    return 0;
}

/*
in:
4
John 10 M
Jack 11 M
Kate 20 F
Jim 21 M
3
John 11
20 Jack
Jim Jack

out:
N
Y
N
*/

 


【参考文献】
https://oj.czos.cn/p/1953

 

 

 

 

posted @ 2026-01-01 21:01  Triwa  阅读(3)  评论(0)    收藏  举报