15分答案+测试点3未过分析
可以看到,如果中奖的名字重复的话,应该输出下一个。但如果下一个也已输出过的话,应该再再输出下一个。而我的程序并没有对这种情况进行判断。考虑了一下,如果在此基础上修改的话,逻辑有点麻烦,于是重构了另一种思路。
#include <bits/stdc++.h>
using namespace std;
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int m,n,s;
cin>>m>>n>>s;
string name[m];
for(int i=0; i<m; i++)
{
cin>>name[i];
}
vector<string> win;
if(s<=m){
cout<<name[s-1]<<endl;
win.push_back(name[s-1]);
}
int cnt=0;
for(int i=s; i<m; i++)
{
cnt++;
if(cnt==n)
{
cnt=0;
vector<string>::iterator it = find(win.begin(), win.end(), name[i]);
if (it == win.end())
{
cout<<name[i]<<endl;
win.push_back(name[i]);
}else
{
cout<<name[i+1]<<endl;
win.push_back(name[i+1]);
}
}
}
if(win.size()==0)
cout<<"Keep going..."<<endl;
return 0;
}
测试点
输入
11 3 2
Imgonnawin!
PickMe
PickMeMeMeee
LookHere
Imgonnawin!
TryAgainAgain
TryAgainAgain
PickMe
Imgonnawin!
PickMe
TryAgainAgain
错误输出
PickMe
Imgonnawin!
Imgonnawin!
TryAgainAgain
正确输出
PickMe
Imgonnawin!
TryAgainAgain
正确题解
在循环条件中遍历时,顺便判断当前应当中奖(或是间隔n或是下一个)的项是否在win这个中奖池里。
有的博主用的unordered_set,其实win中奖池不去重也OK,所以我没用。
#include <bits/stdc++.h>
using namespace std;
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int m,n,s;
cin>>m>>n>>s;
string name[m];
for(int i=0; i<m; i++)
{
cin>>name[i];
}
vector<string> win;
bool flag=false;
for(int i=s-1; i<m; )
{
vector<string>::iterator it = find(win.begin(), win.end(), name[i]);
if (it == win.end())
{
flag=true;
cout<<name[i]<<endl;
win.push_back(name[i]);
i+=n;
}
else i++;
}
if(!flag)
cout<<"Keep going..."<<endl;
return 0;
}