PAT-B1059 C語言競賽(20 分)
阿新 • • 發佈:2019-02-12
1059 C語言競賽(20 分)
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?
分析:
先計算出N以內(包括N)的素數,這裡使用線性篩法。儲存ID的陣列下標加1就是某個ID的排名。
程式碼:
#include <cstdio> #include <string> #include <vector> using namespace std; int main() { int N, K, i, j; scanf("%d", &N); vector<int> prime; bool isNotPrime[N + 2] = {false};//將所有的數設定為是素數 for(i = 2; i < N + 2; i++)// { //計算N以內的素數 if(isNotPrime[i] == false) prime.push_back(i); //篩去以i為最大因數的合數 for(j = 0; j < prime.size() && i * prime[j] <= N + 2; j++) { isNotPrime[i * prime[j]] = true; if(i % prime[j] == 0)//找到了i的最小素因數 break; } } //printf("%d以內的素數個數:%d\n", N, prime.size()); int id[N], target; bool check[N] = {false}; for(i = 0; i < N; i++) scanf("%d", &id[i]); scanf("%d", &K); for(i = 0; i < K; i++) { scanf("%d", &target); bool flag = false; for(j = 0; j < N; j++) { if(target == id[j]) { flag = true;//匹配成功 if(check[j] == true) printf("%04d: Checked\n", target); else if(j == 0) printf("%04d: Mystery Award\n", target); else if(!isNotPrime[j + 1])//排名為素數 printf("%04d: Minion\n", target); else printf("%04d: Chocolate\n", target); check[j] = true; break; } } if(flag == false) printf("%04d: Are you kidding?\n", target); } return 0; }