John got a full mark on PAT. He was so happy that he decided to hold a raffle(抽奖) for his followers on Weibo -- that is, he would select winners from every N followers who forwarded his post, and give away gifts. Now you are supposed to help him generate the list of winners.
Each input file contains one test case. For each case, the first line gives three positive integers M (≤ 1000), N and S, being the total number of forwards, the skip number of winners, and the index of the first winner (the indices start from 1). Then M lines follow, each gives the nickname (a nonempty string of no more than 20 characters, with no white space or return) of a follower who has forwarded John's post.
Note: it is possible that someone would forward more than once, but no one can win more than once. Hence if the current candidate of a winner has won before, we must skip him/her and consider the next one.
For each case, print the list of winners in the same order as in the input, each nickname occupies a line. If there is no winner yet, print Keep going...
instead.
9 3 2 Imgonnawin! PickMe PickMeMeMeee LookHere Imgonnawin! TryAgainAgain TryAgainAgain Imgonnawin! TryAgainAgain
PickMe Imgonnawin! TryAgainAgain
2 3 5 Imgonnawin! PickMe
Keep going...
John进行转发抽奖活动,给出三位正整数M,N,S,分别表示转发的总人数、小明决定的中奖间隔、以及第一名中奖者的序号(编号从1开始)。每位网友可能多次转发,但只能中一次奖。如果处于当前位置的网友中过奖,则一直顺延到下一位没有中奖的网友。
#include <iostream> #include <map> #include <string> using namespace std; int main() { int m, n, s; cin >> m >> n >> s; map<string, int> res; string names[m + 1]; for (int i = 1; i <= m; ++i) cin >> names[i]; if (s > m) // 如果第一位获胜者的位数大于转发总数,说明没有获胜者 cout << "Keep going..." << endl; // 从第一位获胜者s开始,每间隔n位产生一名获胜者 for (int i = s; i <= m; i += n) { if (res[names[i]] == 1) // 如果这位获胜者已经拿过一次奖了 { i++; // 那么开始顺延给下一位 while (i <= m) // 一直顺延,直到没有获奖过之前都没获奖过的那一位 { if (res[names[i]] == 0) { cout << names[i] << endl; res[names[i]] = 1; break; } i++; } } else // 如果这位获胜者未获过奖,则输出 { cout << names[i] << endl; res[names[i]] = 1; } } return 0; }