赞
踩
1059 C语言竞赛 (20 point(s))
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?
这一题,不是很难,主要是要把思路理清,注意点有以下几个:
1. 未记录的id,输出相应的结果。
2. 查询过一次的ID,输出指定结果
3. 第一名,特判
4. 质数名,特判
5. 不满足3和4的排名,输出相应结果。
方法就是利用hash表就可以了,感觉还可以,就是判断有些复杂啦~(..•˘_˘•..)
- #include <cstdio>
- #include <cstring>
- #include <cmath>
- using namespace std;
- const int maxn=100010;
- bool f[maxn]={false};
- bool isprime(int x)
- {
- if(x<=1) return false;
- int sqr=(int)sqrt(x*1.0);
- for(int i=2;i<=sqr;++i)
- if(x%i==0)
- return false;
- return true;
- }
- int main()
- {
- int n,m,flag[maxn];
- while(~scanf("%d",&n))
- {
- memset(flag,0,sizeof(flag));
- for(int i=1;i<=n;++i)
- {
- scanf("%d",&m);
- flag[m]=i;
- }
- scanf("%d",&n);
- for(int i=0;i<n;++i)
- {
- scanf("%d",&m);
- if(flag[m]==0)
- printf("%04d: Are you kidding?\n",m);
- else if(flag[m]==1)
- {
- printf("%04d: Mystery Award\n",m);
- flag[m]=-1;
- }
- else if(flag[m]==-1)
- {
- printf("%04d: Checked\n",m);
- }
- else if(flag[m]!=0&&isprime(flag[m])==true)
- {
- printf("%04d: Minion\n",m);
- flag[m]=-1;
- }
- else if(flag[m]!=0)
- {
- printf("%04d: Chocolate\n",m);
- flag[m]=-1;
- }
- }
- }
- return 0;
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。