码迷,mamicode.com
首页 > 编程语言 > 详细

P1059 C语言竞赛

时间:2020-02-10 22:49:00      阅读:73      评论:0      收藏:0      [点我收藏+]

标签:最好   规则   ++   scan   竞赛   就是   lse   输入格式   比赛   

P1059 C语言竞赛

转跳点:??

1059 C语言竞赛 (20分)

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

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

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

输入格式:

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

输出格式:

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

这道题就是道水题,计数就行了,把ID作为索引,索引上存着排名,去重的话取过之后数组排名置-1,如果没有这个ID,那么因为数组一开始被初始化为0,检测到0,在输出之后直接continue即可。素数前面写过好几次了,不细说了,可以点击这里进行转跳U•ェ•*U

AC代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int IsPrime(int num);

int arr[10000];

int main(void)
{
    int size, index;
    scanf("%d", &size);

    for (size_t i = 0; i < size; i++)
    {
        scanf("%d", &index);
        arr[index] = i + 1;
    }

    int num;
    scanf("%d", &num);
    for (size_t i = 0; i < num; i++)
    {
        scanf("%d", &index);

        if (-1 == arr[index])
        {
            printf("%04d: Checked\n", index);
            continue;
        }
        if (0 == arr[index])
        {
            printf("%04d: Are you kidding?\n", index);
            continue;
        }
        if (1 == arr[index])
        {
            printf("%04d: Mystery Award\n", index);
        }
        else
        {
            if (IsPrime(arr[index]))
            {
                printf("%04d: Minion\n", index);
            }
            else
            {
                printf("%04d: Chocolate\n", index);
            }
        }
        arr[index] = -1;
    }

    return 0;
}

int IsPrime(int num)
{
    // 0, 1特判
    if (num < 2)
    {
        return 0;
    }

    //两个较小数另外处理
    if (num == 2 || num == 3)
    {
        return 1;
    }

    //不在6的倍数两侧的一定不是质数
    if (num % 6 != 1 && num % 6 != 5)
    {
        return 0;
    }

    int tmp = sqrt(num);
    //在6的倍数两侧的也可能不是质数
    for (int i = 5; i <= tmp; i += 6)
    {
        if (num % i == 0 || num % (i + 2) == 0)
        {
            return 0;
        }
    }
    //排除所有,剩余的是质数
    return 1;
}

 

PTA不易,诸君共勉!

P1059 C语言竞赛

标签:最好   规则   ++   scan   竞赛   就是   lse   输入格式   比赛   

原文地址:https://www.cnblogs.com/daker-code/p/12292781.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!