前言
正文
参考题解
#include<iostream>
#include<algorithm>
#include<string>
#include<cmath>
#include<map>
using namespace std;
/* 题意: 给出n个参赛者的排名列表。随后进行k次查询,每次查询输入一个id,若该id不在排名列表中 则输出"Are you kidding?",若该id在之前的查询中已经查询过,则输出id:Checked,否根据该id的排名, 输出对应的奖项。 思路: 使用map<string,pair<int,bool>> 来保存每个用户的排名以及是否第一次被查询 */
map<string,pair<int,bool>> mp;
bool isPrime(int n){
if(n<=1)return false;
for(int i=2,j=(int)sqrt(n*1.0);i<=j;i++){
if(n%i==0)return false;
}
return true;
}
int main(){
int n,k;
string str;
cin>>n;
for(int i=1;i<=n;i++){
cin>>str;
mp[str].first=i;
mp[str].second=false;
}
cin>>k;
while(k--){
cin>>str;
auto it=mp.find(str);//查找该str
if(it==mp.end()){//没查到
printf("%s: Are you kidding?\n",str.c_str());
}else{
if(it->first==str){
if(it->second.second==false){//首次查询str
if(it->second.first==1){//第一名
printf("%s: Mystery Award\n",str.c_str());
}else if(isPrime(it->second.first)){//排名是素数
printf("%s: Minion\n",str.c_str());
}else{//其他
printf("%s: Chocolate\n",str.c_str());
}
it->second.second=true;
}else{
printf("%s: Checked\n",str.c_str());
}
}
}
}
return 0;
}