1124 Raffle for Weibo Followers(20 分)
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.
Input Specification:
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.
Output Specification:
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.
Sample Input 1:
9 3 2
Imgonnawin!
PickMe
PickMeMeMeee
LookHere
Imgonnawin!
TryAgainAgain
TryAgainAgain
Imgonnawin!
TryAgainAgain
Sample Output 1:
PickMe
Imgonnawin!
TryAgainAgain
Sample Input 2:
2 3 5
Imgonnawin!
PickMe
Sample Output 2:
Keep going...
题目大意:输出m,n,s分别表示转发微博的人数,寻找的跳数,初始winner,并且要求如果已经获过奖的就不能再获奖,下次遍历到它时就应该跳过。
//第一次我是这么想的,对所有重复转发的只记录第一次的转发,但是后来发现,这样:
因为初始获奖者跳过了Imgonnawin!用户,下一次再出现时我没有将其记录,就顺次到了下一位用户。这就出现了错误。
AC代码:
#include <iostream> #include <map> #include <cstdio> #include <vector> using namespace std; map<string,int> mp; vector<string> vt; int main() { int m,n,s; cin>>m>>n>>s; string name; for(int i=1;i<=m;i++){ cin>>name; vt.push_back(name);//存都是要存起来的。 } // cout<<endl; int len=vt.size(); bool flag=false; for(int i=s-1;i<len;i+=n){ while(mp.count(vt[i])!=0){ i++; } if(mp.count(vt[i])==0){//如果它没有出现过 flag=true; cout<<vt[i]<<'\n'; mp[vt[i]]=1;//出现过。 } } if(!flag)cout<<"Keep going..."; return 0; }
//这个题目真的是比较简单的,如果当前已经领过奖了,那么就一直跳过,如果没有出现过就输出并且标记,算是一星的难度吧。