我的PAT-BASIC代码仓:https://github.com/617076674/PAT-BASIC
我的PAT-ADVANCED代码仓:https://github.com/617076674/PAT-ADVANCED
原题链接:
PAT-BASIC1069:https://pintia.cn/problem-sets/994805260223102976/problems/994805265159798784
PAT-ADVANCED1124:https://pintia.cn/problem-sets/994805342720868352/problems/994805350803292160
题目描述:
PAT-BASIC1069:
PAT-ADVANCED1124:
知识点:循环、双指针
思路:按题述编程即可
注意点:
题目里说了——“可能有人转发多次,但不能中奖多次,所以如果处于当前中奖位置的网友已经中过奖,则跳过他顺次取下一位”。因此,中奖的索引不一定等于离第S位差N的整数倍。
时间复杂度是O((M - S) / N)。空间复杂度是O(1)。
C++代码:
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
int main(){
int M, N, S;
scanf("%d %d %d", &M, &N, &S);
if(M < S){
cout << "Keep going..." << endl;
return 0;
}
vector<string> winners;
int pre = M;
string name;
for(int i = 1; i <= M; i++){
cin >> name;
if(i == S){
winners.push_back(name);
pre = S;
continue;
}
if(i - pre == N){
while(i <= M && find(winners.begin(), winners.end(), name) != winners.end()){
cin >> name;
i++;
}
if(i <= M){
winners.push_back(name);
pre = i;
}
}
}
for(int i = 0; i < winners.size(); i++){
cout << winners[i] << endl;
}
return 0;
}
C++解题报告: