1069 微博轉發抽獎 (20分)
阿新 • • 發佈:2020-08-07
題目
小明 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; }