PAT_A1116
PAT甲级1116.
目录
A1116
题目
样例
输入:
6
1111
6666
8888
1234
5555
0001
6
8888
0001
1111
2222
8888
2222
输出:
8888: Minion
0001: Chocolate
1111: Mystery Award
2222: Are you kidding?
8888: Checked
2222: Are you kidding?
思路和坑点
思路:
最主要的思路是需要考虑标记每个人的奖品类型,然后需要标记是否领过奖品。这里使用map进行标记每个人的奖品类型和是否领过奖品,然后按照查询结果进行输出。
AC代码
#include<bits/stdc++.h>
using namespace std;
#define MAXN 10004
bool Prime[MAXN];
void getPrime();
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
map<string,int> rank; //0为冠军奖品,1为MInions,2为ch
map<string,bool> check; //核查是否领奖
int n;
getPrime();
scanf("%d",&n);
string temp;
for(int i=1;i<=n;i++){ //读入数据并按照要求对其奖品进行标记
cin>>temp;
if(i==1)
rank[temp]=0;
else if(Prime[i])
rank[temp]=1;
else
rank[temp]=2;
}
scanf("%d",&n);
for(int i=0;i<n;i++){
cin>>temp;
cout<<temp<<": ";
if(rank.find(temp)!=rank.end()){ //如果在排名中
if(check.find(temp)==check.end()){ //如果未领奖
check[temp]=true; //标记领奖
switch(rank[temp]){ //根据奖品类型打印奖品内容
case 0 : puts("Mystery Award");break;
case 1 : puts("Minion");break;
case 2 : puts("Chocolate");break;
default :break;
}
}
else
puts("Checked"); //如果已经领过了,输出领取信息
}
else{
puts("Are you kidding?"); //如果不在排名中,输出错误信息
}
}
return 0;
}
void getPrime() //筛选法获取素数表
{
fill(Prime,Prime+MAXN,true);
Prime[0]=Prime[1]=false;
for(int i=2;i*i<=MAXN;i++){
if(Prime[i]){
for(int j=i+i;j<MAXN;j+=i){
Prime[j]=false;
}
}
}
}