試題 算法訓練 新生舞會
題目描述
資源限制
時間限制:1.0s 內存限制:512.0MB
問題描述
新生舞會開始了。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
思路:
定義一個結構體,輸入每個人的信息,然後每輸入兩個字符串,首先判斷字符串是姓名還是學號(通過字符串的首字母來判斷),然後找到該姓名或者學號這個人對應的性別。兩個字符串的最終性別結果相反,則可以共舞,否則,不然。
AC代碼:
#include <stdlib.h>
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <math.h>
using namespace std;
struct node//每個學生的信息
{
char name[20];
char id[10];
char sex;
}stu[1000];
int main()
{
int n,i;
cin>>n;
for(i=0;i<n;i++)
cin>>stu[i].name>>stu[i].id>>stu[i].sex;
int m;
cin>>m;
char str1[20],str2[20];//姓名或者學號
while(m--)
{
cin>>str1>>str2;
char ans1,ans2;//輸入的姓名或者學號所對應的性別
if(str1[0]>='0'&&str1[0]<='9')//是學號
for(i=0;i<n;i++)
{
if(strcmp(str1,stu[i].id)==0)
{
ans1=stu[i].sex;//找到該學號對應的人的性別
break;
}
}
else //是姓名
for(i=0;i<n;i++)
{
if(strcmp(str1,stu[i].name)==0)
{
ans1=stu[i].sex;//找到該姓名對應的人的性別
break;
}
}
if(str2[0]>='0'&&str2[0]<='9')//是學號
for(i=0;i<n;i++)
{
if(strcmp(str2,stu[i].id)==0)
{
ans2=stu[i].sex;//找到該學號對應的人的性別
break;
}
}
else //是姓名
for(i=0;i<n;i++)
{
if(strcmp(str2,stu[i].name)==0)
{
ans2=stu[i].sex;//找到該姓名對應的人的性別
break;
}
}
if(ans1==ans2)//性別相同,不能共舞
cout<<"N"<<endl;
else
cout<<"Y"<<endl;
}
return 0;
}