前言

传送门

正文


参考题解

#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;
}