方法1(用集合set处理):注意那个while循环是防止出现连续多个相同字符串的情况,所以不能用if条件语句
#include<bits/stdc++.h>
using namespace std;
int main(){
int M,N,S;
scanf("%d%d%d",&M,&N,&S);
vector<string>v(M+1);//存储输入的字符串
for(int i=1;i<=M;i++){
cin>>v[i];
}
set<string>s;//保存已中奖的字符串
for(int i=S;i<=M;i+=N){
while(i<=M&&s.find(v[i])!=s.end())//不能用if语句,防止后面几个都是已经中奖过的
i++;
if(i<=M){
cout<<v[i]<<endl;
s.insert(v[i]);
}
}
if(s.empty())
cout<<"Keep going..."<<endl;
return 0;
}
方法2(用映射map处理)
#include<bits/stdc++.h>
using namespace std;
int main(){
int m,n,s;
bool flag=false;//标志变量,用于判断最后是否有中奖的
cin>>m>>n>>s;
string str;
map<string,int> a;//存储已经中奖过的字符串
for(int i=1;i<=m;i++){
cin>>str;//输入字符串信息
if(a[str]==1)
s=s+1;//如果当前字符串已中奖过,则跳至下一个
if(i==s&&a[str]==0){
a[str]=1;//映射中为1表示已中奖过
cout<<str<<endl;
flag=true;
s+=n;//应该中奖的索引进行更新
}
}
if(flag==false)
cout<<"Keep going...";
return 0;
}