甲题题解-1116. Come on! Let’s C (20)-(素数筛选法)

时间:2022-08-12 18:45:31

用vis标记出现过的id,checked标记询问过的id。至于如何判断排名为素数,用素数筛选法预处理一下即可,水题。

甲题题解-1116. Come on! Let’s C (20)-(素数筛选法)甲题题解-1116. Come on! Let’s C (20)-(素数筛选法)
#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;
}
View Code