PAT(Advanced Level)A1116. Come on! Let's C

题意

举行了比赛,冠军有神秘奖,名次是素数的人会收到小黄人,其他的任何人会收到巧克力,不在名单里的人也要检查出来,还要识别出已经检查过的人

思路

  • 分别用2个unordered_map<int, int>来记住排名和是否有在名单里
  • 接下来依次判断即可

代码

#include <iostream>
#include <vector>
#include <queue>
#include <map>
#include <string.h>
#include <set>
#include <unordered_map>
#include <algorithm>
using namespace std;
unordered_map<int, int> ranklist;
unordered_map<int, int> namelist;
bool is_prime(int x) {
    if(x <= 1)  return false;
    for(int i = 2; i * i <= x; i++) {
        if(x % i == 0)   return false;
    }
    return true;
}
int main() {
    int N, K, tmp;
    cin >> N;
    for(int i = 1; i <= N; i++) {
        cin >> tmp;
        ranklist[tmp] = i;
        namelist[tmp] = 1;
    }
    cin >> K;
    bool checked[10001] = {0};
    for(int i = 0; i < K; i++) {
        cin >> tmp;
        if(namelist[tmp] == 0)                          // 不在名单上
            printf("%04d: Are you kidding?\n", tmp);
        else if(checked[tmp])                           // 已经检查过了
            printf("%04d: Checked\n", tmp);
        else {
            checked[tmp] = true;
            if(ranklist[tmp] == 1)                      // 第一名
                printf("%04d: Mystery Award\n", tmp);
            else if(is_prime(ranklist[tmp]))            // 名次为素数
                printf("%04d: Minion\n", tmp);
            else
                printf("%04d: Chocolate\n", tmp);       // 巧克力
        }
    }
    return 0;
}
posted @ 2021-03-14 15:55  MartinLwx  阅读(19)  评论(0编辑  收藏  举报