PAT 乙级 1069 微博转发抽奖(20) C++版

1069. 微博转发抽奖(20)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue

小明PAT考了满分,高兴之余决定发起微博转发抽奖活动,从转发的网友中按顺序每隔N个人就发出一个红包。请你编写程序帮助他确定中奖名单。

输入格式:

输入第一行给出三个正整数M(<= 1000)、N和S,分别是转发的总量、小明决定的中奖间隔、以及第一位中奖者的序号(编号从1开始)。随后M行,顺序给出转发微博的网友的昵称(不超过20个字符、不包含空格回车的非空字符串)。

注意:可能有人转发多次,但不能中奖多次。所以如果处于当前中奖位置的网友已经中过奖,则跳过他顺次取下一位。

输出格式:

按照输入的顺序输出中奖名单,每个昵称占一行。如果没有人中奖,则输出“Keep going...”。

输入样例1:
9 3 2
Imgonnawin!
PickMe
PickMeMeMeee
LookHere
Imgonnawin!
TryAgainAgain
TryAgainAgain
Imgonnawin!
TryAgainAgain
输出样例1:
PickMe
Imgonnawin!
TryAgainAgain
输入样例2:
2 3 5
Imgonnawin!
PickMe
输出样例2:
Keep going...


 1 // 1069.cpp : 定义控制台应用程序的入口点。
 2 //
 3 
 4 #include "stdafx.h"
 5 #include<iostream>
 6 #include<vector>
 7 #include<algorithm>
 8 #include<string>
 9 
10 using namespace std;
11 
12 bool judge(string str, const vector<string>& v);//判断该名称中奖与否,中奖返回真
13 void get_win_name(vector<string>& v, vector<string>& win, int M, int N, int S);//获取获奖名称并存入win中
14 void show_win_name(const vector<string>& win);//打印获奖名称
15 
16 int main()
17 {
18     int M, N, S;
19     vector<string> v,win;//v存储输入的名称,win存储获奖的名称
20     string name;
21 
22     cin >> M >> N >> S;
23     getchar();//读取缓冲区中的回车
24 
25     if (M >= S)
26     {
27         //读取并存入容器
28         for (int i = 1; i <= M; ++i)
29         {
30             getline(cin, name);
31 
32             v.push_back(name);
33         }
34 
35         get_win_name(v, win, M, N, S);//获取获奖名称并存入win中
36 
37         show_win_name(win);//打印获奖名称
38     }
39     else//无人获奖
40         cout << "Keep going..." << endl;
41 
42     return 0;
43 }
44 
45 //判断该名称中奖与否,中奖返回真
46 bool judge(string str,const vector<string>& v)
47 {
48     if (find(v.begin(), v.end(), str) != v.end())
49         return 1;
50 
51     return 0;
52 }
53 
54 //获取获奖名称并存入win中
55 void get_win_name(vector<string>& v,vector<string>& win,int M,int N,int S)
56 {
57     vector<string>::iterator x = v.begin(), end = v.end();
58 
59     //指向起始中奖名称
60     for (int i = 1; i < S; ++i)
61         ++x;
62 
63     for (int i = S; i <= M; ++x, ++i)
64     {
65         //如果该名称之前没中奖
66         if (!judge(*x, win))
67         {
68             win.push_back(*x);//将名称存入中奖名单
69 
70             //中奖后跳过中间的人数直达下一个中奖名称
71             for (int j = 1; j < N && x != end; ++j)
72                 ++x, ++i;
73         }
74 
75         if (x == end)//如果一直出现的都为中过奖的,一直循环到最后,就终止
76             break;
77     }
78 }
79 
80 //打印获奖名称
81 void show_win_name(const vector<string>& win)
82 {
83     vector<string>::const_iterator begin1 = win.cbegin(), end1 = win.cend();
84 
85     for (; begin1 != end1; ++begin1)
86         cout << *begin1 << endl;
87 }
原文地址:https://www.cnblogs.com/cdp1591652208/p/7247741.html