PAT 乙級 1059 C語言競賽
阿新 • • 發佈:2019-01-11
1059 C語言競賽 (20 point(s))
C 語言競賽是浙江大學計算機學院主持的一個歡樂的競賽。既然競賽主旨是為了好玩,頒獎規則也就制定得很滑稽:
- 0、冠軍將贏得一份“神祕大獎”(比如很巨大的一本學生研究論文集……)。
- 1、排名為素數的學生將贏得最好的獎品 —— 小黃人玩偶!
- 2、其他人將得到巧克力。
給定比賽的最終排名以及一系列參賽者的 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表就可以了,感覺還可以,就是判斷有些複雜啦~(..•˘_˘•..)
AC程式碼
#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; }