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