1. 程式人生 > 實用技巧 >PTA 乙級 1069 微博轉發抽獎 (20分) C++

PTA 乙級 1069 微博轉發抽獎 (20分) C++

剛開始沒用map,想利用陣列容器儲存獲過獎的暱稱,關於如何判斷是否已經獲過獎,直接用的遍歷的方法,跟陣列的每一個元素進行比較(很繁瑣,也很費時)

原本的想法,測試點3怎麼也無法通過(測試點3:順延之後要從該獲獎序號開始取下一個間隔為N的序號為中獎號。

後來看了看別人的程式碼,用一個map來儲存每一個暱稱獲獎次數即可

原本的程式碼:

 1 #include<iostream>
 2 #include<vector>
 3 
 4 using namespace std;
 5 
 6 int main() {
 7     int m = 0, n = 0, s = 0
; 8 cin >> m >> n >> s; 9 if (s > m) { cout << "Keep going..."; return 0; } 10 vector<string> win(m + 1); 11 int j = 0; 12 int flag = 0; 13 for (int i = 1; i <= m; ++i) { 14 string tmp; 15 cin >> tmp; 16 if (flag) {
17 win[j] = tmp; 18 j++; 19 flag = 0; 20 } 21 if (i == s) { 22 for (int k = 0; k <= j; ++k) { 23 if (win[k] == tmp) 24 flag = 1; 25 } 26 if (flag) { s++; continue; } 27 win[j] = tmp;
28 j++; 29 s += n; 30 } 31 } 32 for (int i = 0; i < j; ++i) cout << win[i] << endl; 33 return 0; 34 }

真是令人崩潰

改進後的:

 1 #include<iostream>
 2 #include<map>
 3 
 4 using namespace std;
 5 
 6 int main() {
 7     int m = 0, n = 0, s = 0;
 8     cin >> m >> n >> s;
 9     if (s > m) { cout << "Keep going..."; return 0; }        //沒有人中獎
10     map<string, int> gain;                                    //以每個人的暱稱為鍵,判斷是否中過獎
11     for (int i = 1; i <= m; ++i) {
12         string tmp;
13         cin >> tmp;
14         if (gain[tmp] == 1) s++;                            //此人中過獎,之後依次順延
15         if (i == s && gain[tmp] == 0) {                        
16             gain[tmp] = 1;                                    //標記此暱稱已中過獎
17             cout << tmp << endl;
18             s += n;
19         }
20      }
21     return 0;
22 }