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 }
默默地一点点变强,细节决定成败