傳送門
https://pintia.cn/problem-sets/994805260223102976/problems/994805265159798784
題目
小明PAT考了滿分丈屹,高興之余決定發(fā)起微博轉發(fā)抽獎活動,從轉發(fā)的網友中按順序每隔N個人就發(fā)出一個紅包。請你編寫程序幫助他確定中獎名單唬血。
輸入格式:
輸入第一行給出三個正整數M(<= 1000)砰识、N和S景埃,分別是轉發(fā)的總量域那、小明決定的中獎間隔活逆、以及第一位中獎者的序號(編號從1開始)铅忿。隨后M行剪决,順序給出轉發(fā)微博的網友的昵稱(不超過20個字符、不包含空格回車的非空字符串)檀训。
注意:可能有人轉發(fā)多次柑潦,但不能中獎多次。所以如果處于當前中獎位置的網友已經中過獎峻凫,則跳過他順次取下一位渗鬼。
輸出格式:
按照輸入的順序輸出中獎名單,每個昵稱占一行荧琼。如果沒有人中獎譬胎,則輸出“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...
分析
首先用一個變量指定下一次中獎的序號命锄,默認S為第一個中獎的序號堰乔,所以該變量初始化為S。
接著用map集合記錄用戶中獎的次數脐恩,如果為0镐侯,即沒中獎過,才可以中獎驶冒,若中獎后苟翻,使其自增1韵卤,作為標記。同時讓中獎的序號增加N袜瞬,為下一名中獎者的序號怜俐。
遇到已中過獎的人,則給中獎序號增加1邓尤,順次取下一人為中獎者拍鲤。
用布爾類型變量標記是否出現過中獎者,若未出現過汞扎,輸出“Keep going...”
源代碼
//C/C++實現
#include <iostream>
#include <string>
#include <map>
using namespace std;
int main(){
int m, n, s;
string tmp;
bool flag = true; // 判斷是否中獎
map<string, int> map;
scanf("%d %d %d", &m, &n, &s);
int nextIndex = s;
for(int i = 1; i <= m; ++i){
cin >> tmp;
if(i == nextIndex){
if(map[tmp] == 0){ // 中獎
cout << tmp << endl;
++map[tmp];
flag = false;
nextIndex += n;
}
else{
++nextIndex;
}
}
}
if(flag){
printf("Keep going...\n");
}
return 0;
}