赞
踩
C 语言竞赛是浙江大学计算机学院主持的一个欢乐的竞赛。既然竞赛主旨是为了好玩,颁奖规则也就制定得很滑稽:
给定比赛的最终排名以及一系列参赛者的 ID,你要给出这些参赛者应该获得的奖品。
输入第一行给出一个正整数 N(≤104),是参赛者人数。随后 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?
代码长度限制
16 KB
时间限制
200 ms
内存限制
64 MB
解题思路:把所有人的ID存在一个数组中,然后查询时判断属于哪种获奖情况,然后进行一一对应,用flag数组来记录是否已经颁过奖 。
然后提交完我发现测试点2没过,看了好久才发现自己有一个部分忘记改flag数组的值了,还是粗心。看了网上很多博客,发现测试点2没过可能有几种原因:
①判断素数出错
②没记录是否已经颁过奖
③输出的ID中没有控制%04d,在输出0001类似的情况时会出错
……
- #include<iostream>
- #include<string>
- #include<cmath>
- using namespace std;
- int isSushu(int n) //判断n是否是素数
- {
- for(int i=2;i<=sqrt(n);i++)
- {
- if(n%i==0)
- return 0;
- }
-
- return 1;
- }
- int main()
- {
- int n,index;
- scanf("%d",&n);
- int ID[100000],flag[100000]={0};
- int id[100000];
- for(int i = 0;i<n;i++) //排名ID序列
- {
- scanf("%d",&ID[i]);
- }
- int k;
- scanf("%d",&k);
- for(int j=0;j<k;j++) //要查询的ID序列
- {
-
- scanf("%d",&id[j]);
- }
- for(int x=0;x<k;x++)
- {
- for(index=0;index<n;index++)
- {
- if(id[x]==ID[index]) //在排名序列中
- {
- if(index==0&&flag[index]==0)
- {
- printf("%04d: Mystery Award\n",id[x]);
- flag[index]=1;
- break;
- }
- else if(flag[index]==0&&isSushu(index+1)==1)
- {
- printf("%04d: Minion\n",id[x]);
- flag[index]=1;
- break;
- }
- else if(flag[index]==1)
- {
- printf("%04d: Checked\n",id[x]);
- break;
- }
- else
- {
- printf("%04d: Chocolate\n",id[x]);
- flag[index]=1;
- break;
- }
- }
-
- }
- if(index==n) //查询不到该ID序号
- printf("%04d: Are you kidding?\n",id[x]);
-
- }
- }
-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。