用vis标记出现过的id,checked标记询问过的id。至于如何判断排名为素数,用素数筛选法预处理一下即可,水题。
#include <iostream> #include <cstdio> #include <algorithm> #include <string.h> using namespace std; /* 素数筛选法 */ const int maxn=10000+5; int isPrime[maxn]; int vis[maxn]; int checked[maxn]; int ranklist[maxn]; void init(){ for(int i=0;i<maxn;i++) isPrime[i]=1; isPrime[1]=0; for(int i=2;i<maxn;i++){ if(isPrime[i]){ for(int j=i*2;j<maxn;j+=i){ isPrime[j]=0; } } } } int main() { init(); int n,k; int a; memset(vis,0,sizeof(vis)); memset(checked,0,sizeof(checked)); scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a); ranklist[a]=i; vis[a]=1; } scanf("%d",&k); for(int i=0;i<k;i++){ scanf("%d",&a); if(!vis[a]){ printf("%04d: Are you kidding?\n",a); } else if(!checked[a]){ if(ranklist[a]==1){ printf("%04d: Mystery Award\n",a); } else if(isPrime[ranklist[a]]){ printf("%04d: Minion\n",a); } else{ printf("%04d: Chocolate\n",a); } checked[a]=1; } else{ printf("%04d: Checked\n",a); } } return 0; }