1. 题目

PAT (Basic Level) Practice (中文): 1059

C 语言竞赛是浙江大学计算机学院主持的一个欢乐的竞赛。既然竞赛主旨是为了好玩,颁奖规则也就制定得很滑稽:

  • 0、冠军将赢得一份“神秘大奖”(比如很巨大的一本学生研究论文集……)。
  • 1、排名为素数的学生将赢得最好的奖品 —— 小黄人玩偶!
  • 2、其他人将得到巧克力。

给定比赛的最终排名以及一系列参赛者的 ID,你要给出这些参赛者应该获得的奖品。

1.1. 输入格式:

输入第一行给出一个正整数 N(≤104),是参赛者人数。随后 N 行给出最终排名,每行按排名顺序给出一位参赛者的 ID(4 位数字组成)。接下来给出一个正整数 K 以及 K 个需要查询的 ID。

1.2. 输出格式:

对每个要查询的 ID,在一行中输出 ID: 奖品,其中奖品或者是 Mystery Award(神秘大奖)、或者是 Minion(小黄人)、或者是 Chocolate(巧克力)。如果所查 ID 根本不在排名里,打印 Are you kidding?(耍我呢?)。如果该 ID 已经查过了(即奖品已经领过了),打印 ID: Checked(不能多吃多占)。

1.3. 输入样例:

6
1111
6666
8888
1234
5555
0001
6
8888
0001
1111
2222
8888
2222

1.4. 输出样例:

8888: Minion
0001: Chocolate
1111: Mystery Award
2222: Are you kidding?
8888: Checked
2222: Are you kidding?

2. 作答

2.1. 代码

# include "stdio.h"
# include "math.h"

int rank[10100] = {0};

// 检查n是否为素数
// return 是(1)/否(0)
int checkPrime(int n) {
    int i;
    if (n == 2) return 1;
    for (i = 2; i <= sqrt(n); ++i){
        if (n % i == 0) return 0;
    }
    return 1;
}

int main(int argc, char const *argv[]) {

    int i, n, k, id;
    // 读入排名信息
    scanf("%d", &n);
    for (i = 1 ; i <= n; ++i) { // 涉及排名信息,因此从1开始循环
        scanf("%d", &id);
        rank[id] = i;
    }

    // 读入查询信息
    scanf("%d", &k);
    for (i = 0; i < k; ++i) {
        scanf("%d", &id);
        printf("%04d: ", id);
        if (rank[id] > 0) {
            if (rank[id] == 1) printf("Mystery Award\n");
            else if (checkPrime(rank[id])) printf("Minion\n");
            else printf("Chocolate\n");
            rank[id] = -1; // 标记颁奖
        }else if (rank[id] < 0) printf("Checked\n");
        else printf("Are you kidding?\n");
    }

    return 0;
}

2.2. 评测结果

提交时间 状态 分数 题目 编译器 耗时 用户
2019/2/24 13:10:35 答案正确 20 1059 C (gcc) 9 ms soulans
测试点 结果 耗时 内存
0 答案正确 1 ms 376 KB
1 答案正确 8 ms 396 KB
2 答案正确 9 ms 500 KB
3 答案正确 2 ms 256 KB

3. 标答

#include <cstdio>
#include <cmath>
#include <set>
using namespace std;
//灰灰考研@一航代码
int ran[10000];
bool isprime( int a )
{
    if ( a <= 1 )
        return(false);
    int Sqrt = sqrt( (double) a );
    for ( int i = 2; i <= Sqrt; i++ )
    {
        if ( a % i == 0 )
            return(false);
    }
    return(true);
}


int main()
{
        freopen("input.txt", "r", stdin);       
    int n, k;
    scanf( "%d", &n );
    for ( int i = 0; i < n; i++ )
    {
        int id;
        scanf( "%d", &id );
        ran[id] = i + 1;
    }
    scanf( "%d", &k );
    set<int> ss;
    for ( int i = 0; i < k; i++ )
    {
        int id;
        scanf( "%d", &id );
        printf( "%04d: ", id );
        if ( ran[id] == 0 )
        {
            printf( "Are you kidding?\n" );
            continue;
        }
        if ( ss.find( id ) == ss.end() )
        {
            ss.insert( id );
        } else {
            printf( "Checked\n" );
            continue;
        }
        if ( ran[id] == 1 )
        {
            printf( "Mystery Award\n" );
        }else if ( isprime( ran[id] ) )
        {
            printf( "Minion\n" );
        }else {
            printf( "Chocolate\n" );
        }
    }
    fclose(stdin);
    return(0);
}