1059 C语言竞赛 (ID映射编号映射字符串)
C 语言竞赛是浙江大学计算机学院主持的一个欢乐的竞赛。既然竞赛主旨是为了好玩,颁奖规则也就制定得很滑稽:
- 0、冠军将赢得一份“神秘大奖”(比如很巨大的一本学生研究论文集……)。
- 1、排名为素数的学生将赢得最好的奖品 —— 小黄人玩偶!
- 2、其他人将得到巧克力。
给定比赛的最终排名以及一系列参赛者的 ID,你要给出这些参赛者应该获得的奖品。
输入格式:
输入第一行给出一个正整数 N(≤10e+4),是参赛者人数。随后 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?
看着N=10^4的大小想尝试用O(N^2)的暴力解法:
#include<cstdio> #include<cstring> const int max=10010; int prime[max],num=0; bool pp[max]={0}; struct person{ char *prize; int check=0; char id[5]; }p[10010]; void init(int n){ for(int i=2;;i++){ if(!pp[i]){ prime[num++]=i; if(num>=n) break; for(int j=i+i;j<max;j+=i){ pp[j]=1; } } } } int main(){ int n,nn,j; scanf("%d",&n); getchar(); init(n); for(int i=1;i<=n;i++){ scanf("%s",&p[i].id); if(i==1) p[i].prize="Mystery Award"; else if(pp[i]) p[i].prize="Chocolate"; else p[i].prize="Minion"; } char temp[5]; scanf("%d",&nn); for(int i=1;i<=nn;i++){ scanf("%s",temp); printf("%s: ",temp); for(j=1;j<=n;j++){ if(strcmp(temp,p[j].id)==0){ if(p[j].check==0){ p[j].check=1; printf("%s\n",p[j].prize); }else{ printf("Checked\n"); } break; } } if(j==n+1)printf("Are you kidding?\n"); } return 0; }
提交时间 | 状态 | 分数 | 题目 | 编译器 | 耗时 | 用户 |
---|---|---|---|---|---|---|
2019/2/2 00:49:37 |
部分正确
|
14 | 1059 | C++ (g++) | 3 ms | Argentina_WU LEI |
测试点 | 结果 | 耗时 | 内存 |
---|---|---|---|
0 | 答案正确 | 3 ms | 512 KB |
1 | 运行超时 | 0 ms | 0 KB |
2 | 运行超时 | 0 ms | 0 KB |
3 | 答案正确 | 3 ms | 512 KB |
只得了14/20分,所以此类题还是不能抱有侥幸,需要哈希映射的思路:
#include<cstdio> const int maxn=10010; int I[maxn]={0};//chushihuawei0 char a[5][20]={"Are you kidding?","Mystery Award","Minion","Chocolate","Checked"}; bool isPrime(int x){ if(x<=1) return false; for(int i=2;i*i<=x;i++) if(x%i==0) return false; return true; } int main(){ int n,ID; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&ID); if(i==1) I[ID]=1; else if(isPrime(i)) I[ID]=2; else I[ID]=3; } int m,query; scanf("%d",&m); for(int i=1;i<=m;i++){ scanf("%d",&query); printf("%04d: %s\n",query,a[I[query]]); if(I[query]) I[query]=4; } return 0; }
书中给出的上述代码既简短,思路也很好(默认为“Are you kidding?”)