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 }

原文地址:https://www.cnblogs.com/SCP-514/p/13631947.html