PAT A1124 Raffle for Weibo Followers (20 分)——数学题

本文介绍了一个抽奖算法的实现过程,该算法用于从微博转发者中抽取幸运儿,避免重复获奖,并详细展示了C++代码实现,包括如何使用set进行数据处理。

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...
 
 1 #include <stdio.h>
 2 #include <string>
 3 #include <iostream>
 4 #include <set>
 5 using namespace std;
 6 const int maxn=1010;
 7 string res[maxn];
 8 set<string> st;
 9 int main(){
10     string s;
11     int m,n,p;
12     cin>>m>>n>>p;
13     for(int i=1;i<=m;i++){
14         cin>>res[i];
15     }
16     if(m<p){
17         printf("Keep going...");
18         return 0;
19     }
20     for(int i=p;i<=m;i+=n){
21         if(st.find(res[i])==st.end()){
22             st.insert(res[i]);
23             printf("%s\n",res[i].c_str());
24         }
25         else{
26             while(st.find(res[i])!=st.end() && i<=m){
27                 i++;
28             }
29             if(i<=m){
30                 st.insert(res[i]);
31                 printf("%s\n",res[i].c_str());
32             }
33         }
34     }
35 }
View Code

注意点:题目要看清楚,把n和s搞反了一直答案错误。题目其实没有说清楚的一点是已经中奖的人跳到下一个以后,再下一个中奖的人是按照原来的顺序加间隔,还是新的那个人加间隔。

ps:用set好像不太好,大佬都是用的map直接可以判断是否为0,map创建int时默认为0。也有一边输入一边处理的,在线处理很棒。

转载于:https://www.cnblogs.com/tccbj/p/10431141.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值