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 分)的主要内容,如果未能解决你的问题,请参考以下文章
1116 c语言竞赛 (20 分)难度: 一般 / 知识点: 模拟