• 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 }
  • 相关阅读:
    P4665 [BalticOI 2015]Network 题解
    NOIp2020游记
    独立集(bubble) 题解
    密码(substring) 题解
    8.20被题虐
    开通博客了!
    CSP-S2021 记
    「CSP-S 2020」函数调用(拓扑排序+DP)
    OI生涯回忆录
    [UOJ79]一般图最大匹配(带花树)
  • 原文地址:https://www.cnblogs.com/cdp1591652208/p/7247741.html
Copyright © 2020-2023  润新知