1. 程式人生 > 實用技巧 >1069 微博轉發抽獎 (20分)

1069 微博轉發抽獎 (20分)

題目

小明 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...

解析

  用a儲存轉發的順序,mapp儲存某網友是否中過獎,S表示第一位中獎的網友,N表示中將間隔
  從S-1開始遍歷a,用k表示間隔,若k%N == 0,表示i這位網友獲獎,while迴圈直到遇到沒獲獎的網友,將map置為true,flag置1
  若flag == 0 ,表示無人獲獎,輸出"Keep going"

答案

#include<iostream>
#include<string>
#include<vector>
#include<map>

using namespace std;

int main(){
    int M,N,S,k = 0,flag = 0;
    string s;
    map<string,bool> mapp;
    cin >> M >> N >> S;
    vector<string>a(M);

    for(int i = 0 ; i < M ; i++){
        cin >> a[i];
        mapp[a[i]] = false;
    } 

    for(int i = S - 1 ; i < M ; i++,k++){
        if(k % N == 0){
            while(mapp[a[i]] != false && i < M) i++;
            if(i < M){
                mapp[a[i]] = true;
                cout << a[i] << endl; 
                flag = 1;
            }
        }
    }
    if(!flag) cout << "Keep going..." << endl;
}