1059 C语言竞赛 (20 分)

Posted anber82

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1059 C语言竞赛 (20 分)相关的知识,希望对你有一定的参考价值。

题目:1059 C语言竞赛 (20 分)

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

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

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

输入格式:

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

输出格式:

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

输入样例:

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

输出样例:

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

思路:

  • 开个数组rate【MAXN】整型数组,初始化为0后,记录输入的对应id排名。接下来按题目要求打印查询结果,但是要记住,只要id存在,访问后就要做上访问过的标记,可以另外开个标记数组,也可以直接将其排名置为-1,表示已经领过。id是四位数字,定义成整形后输出是要确保四位数,不足补零,采用 %04d 的格式。因为系统会在输入后自动保留有效数字,而把前面的多余的0掉。
  • 判断素数可以使用素数筛进行预处理(先存储好,可直接用),或者直接使用能被1和本身之外的数整除来判断是不是素数(边输入边判断)。

代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cctype>
 4 #include <iostream>
 5 #include <sstream>
 6 #include <cmath>
 7 #include <algorithm>
 8 #include <string>
 9 #include <stack>
10 #include <queue>
11 #include <vector>
12 #include <map>
13 using namespace std;
14 #define MAXN 10005
15 
16 int prime[MAXN];     
17 
18 void isprime()    //素数筛 
19 
20     memset(prime, 1, sizeof(prime));    //初始化默认都是素数再逐一排除 
21     prime[0] = prime[1] = 0;
22     for(int i = 2; i < MAXN; i++)
23     
24         for(int j = i * 2; j < MAXN; j += i)
25             prime[j] = 0; 
26     
27 
28 
29 int main()
30 
31     isprime();
32     int n, k, id, idlast;
33     scanf("%d", &n);
34     int rate[MAXN];
35     memset(rate, 0, sizeof(rate));
36     for(int i = 1; i <= n; i++)
37     
38         scanf("%d", &id);    //id的排名 
39         rate[id] = i; 
40     
41     scanf("%d", &k);
42     for(int i = 0; i < k; i++)    //领奖品 
43     
44         scanf("%d", &idlast);
45         if(rate[idlast] == -1)    //id存在且查过了 
46             printf("%04d: Checked\n", idlast);
47         else if(rate[idlast] == 1)    //排名第一
48         
49             printf("%04d: Mystery Award\n", idlast); 
50             rate[idlast] = -1; 
51                     
52         else if(prime[rate[idlast]])    //排名是素数
53         
54             printf("%04d: Minion\n", idlast);
55             rate[idlast] = -1;    
56                          
57         else if(rate[idlast] == 0)    //id不存在
58             printf("%04d: Are you kidding?\n", idlast);            
59         else    //其他排名情况 
60         
61             printf("%04d: Chocolate\n", idlast);
62             rate[idlast] = -1;
63         
64     
65     return 0;
66   

 

总结:

  在main函数外面定义的全局整型数组,初值会默认为0 。也就是系统会自动将数组初始化为0 。
  一道看似容易实现简单的题,一开始使用素数筛后忘记在主函数中调用……很久才发现。但是也因为这样经过调试后发现,定义在主函数外部的数组系统好像会自动将其初始化为0,难怪调试时,发现全部判断成合数了。发现错误和补漏的能力太欠缺了,其次奖品是chocolate的忘记标记访问了导致测试点2错误……

以上是关于1059 C语言竞赛 (20 分)的主要内容,如果未能解决你的问题,请参考以下文章

PAT乙级1059 C语言竞赛 (20 分)

1059 C语言竞赛

PAT1059

1116 c语言竞赛 (20 分)难度: 一般 / 知识点: 模拟

基于visual Studio2013解决C语言竞赛题之1020订票

悬赏50分 求C语言高级编程视频教程