1059 C语言竞赛(PAT乙级 C++)
生活随笔
收集整理的這篇文章主要介紹了
1059 C语言竞赛(PAT乙级 C++)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目
C 語言競賽是浙江大學計算機學院主持的一個歡樂的競賽。既然競賽主旨是為了好玩,頒獎規則也就制定得很滑稽:
- 0、冠軍將贏得一份“神秘大獎”(比如很巨大的一本學生研究論文集……)。
- 1、排名為素數的學生將贏得最好的獎品 —— 小黃人玩偶!
- 2、其他人將得到巧克力。
給定比賽的最終排名以及一系列參賽者的 ID,你要給出這些參賽者應該獲得的獎品。
輸入格式:
輸入第一行給出一個正整數 N(≤10?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?分析
- 直觀方法:就是使用結構體存參賽者的信息,包括id、名次(應得獎項)、是否領過獎。然后遍歷輸出。但這種情況很可能超時。
- 改進思路:超時在于多次重復訪問不必要的結構體變量,改進方法是把id作為結構體數組的下標。而id是固定的4位數字(0000-9999),只需把字符串類型轉為對應的數即可(使用ASCII碼)。查詢的時候只需要把待查詢id轉為數字再輸出相應信息即可。
- 例如0000轉為0,0001轉為1.
AC代碼
第一版
#include<iostream> #include<string> #include<cmath> using namespace std; struct Player {int id,award,status; };int main() {bool is_prime(int i);Player p[10000];int i,k,n,temp=0;string id;cin>>n;for(i=0; i<10000; i++){p[i].award=-1;p[i].status=0;}for(i=1; i<=n; i++){cin>>id;temp=(id[0]-'0')*1000+(id[1]-'0')*100+(id[2]-'0')*10+id[3]-'0';if(i==1)p[temp].award=0;else if(is_prime(i)==true){p[temp].award=1;}else{p[temp].award=2;}p[temp].id=temp;}cin>>k;for(i=0; i<k; i++){cin>>id;temp=(id[0]-'0')*1000+(id[1]-'0')*100+(id[2]-'0')*10+id[3]-'0';if(p[temp].status==1){cout<<id<<": Checked"<<endl;continue;}if(p[temp].award==0)cout<<id<<": Mystery Award";else if(p[temp].award==1)cout<<id<<": Minion";else if(p[temp].award==2)cout<<id<<": Chocolate";else{cout<<id<<": Are you kidding?"<<endl;continue; }p[temp].status=1;cout<<endl;}return 0; } bool is_prime(int n) {if(n==2||n==3) return true;int temp=ceil(sqrt((double)n));for(int i=2; i<=temp; i++){if(n%i==0) return false;}return true; }第二版(去掉id)
#include<iostream> #include<string> #include<cmath> using namespace std; struct Player {int award,status; };int main() {bool is_prime(int i);Player p[10000];int i,k,n,temp=0;string id;cin>>n;for(i=0; i<10000; i++){p[i].award=-1;p[i].status=0;}for(i=1; i<=n; i++){cin>>id;temp=(id[0]-'0')*1000+(id[1]-'0')*100+(id[2]-'0')*10+id[3]-'0';if(i==1)p[temp].award=0;else if(is_prime(i)==true){p[temp].award=1;}else{p[temp].award=2;}}cin>>k;for(i=0; i<k; i++){cin>>id;temp=(id[0]-'0')*1000+(id[1]-'0')*100+(id[2]-'0')*10+id[3]-'0';if(p[temp].status==1){cout<<id<<": Checked"<<endl;continue;}if(p[temp].award==0)cout<<id<<": Mystery Award";else if(p[temp].award==1)cout<<id<<": Minion";else if(p[temp].award==2)cout<<id<<": Chocolate";else{cout<<id<<": Are you kidding?"<<endl;continue; }p[temp].status=1;cout<<endl;}return 0; } bool is_prime(int n) {if(n==2||n==3) return true;int temp=ceil(sqrt((double)n));for(int i=2; i<=temp; i++){if(n%i==0) return false;}return true; }更多題解
PAT 乙級(Basic Level) 題解匯總(持續更新)(C++)
總結
以上是生活随笔為你收集整理的1059 C语言竞赛(PAT乙级 C++)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 温柔干净的网名,干净好听的昵称473个
- 下一篇: 1061 判断题(PAT乙级 C++)