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

1059 C语言竞赛 (20 分)

时间:2019-08-24 20:41:41      阅读:90      评论:0      收藏:0      [点我收藏+]

标签:实现   处理   min   竞赛   访问   std   不能   cst   ++   

题目: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 分)

标签:实现   处理   min   竞赛   访问   std   不能   cst   ++   

原文地址:https://www.cnblogs.com/Anber82/p/11405624.html

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