您的代码逻辑看起来是正确的,但是在处理 "start" 操作时,您需要确保在开始新一轮比赛之前清空队列。这是因为在新一轮比赛开始时,所有之前的选手都应该重新加入队列。为了解决这个问题,您可以在 "start" 操作的开始处清空队列。以下是修改后的代码:
#include <iostream>
#include <string>
#include <queue>
#include <map>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
queue<string> q;
map<string,bool> m;
string str,op,playing[2];
int n,playing_len=0;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>op;
if(op=="start")
{
// 清空队列
while (!q.empty()) {
q.pop();
}
for(int j=0;j<playing_len;j++)
{
q.push(playing[j]);
}
playing_len=0;
while(playing_len<2 and !q.empty())
{
if(m.find(q.front())==m.end())// element doesn't exist
{
q.pop();
continue;
}
playing[playing_len]=q.front();
cout<<q.front()<<' ';
playing_len++;
q.pop();
}
if(playing_len==0)
{
cout<<"Error\n";
}
else
{
cout<<endl;
}
}
else if(op=="arrive")
{
cin>>str;
if(m.find(str)!=m.end())
{
cout<<"Error\n";
}
else
{
m[str]=true;
q.push(str);
cout<<"OK\n";
}
}
else// leave
{
cin>>str;
bool flag=false;
for(int i=0;i<playing_len;i++)
{
if(playing[i]==str)
{
flag=true;
break;
}
}
您的代码逻辑看起来是正确的,但是在处理 "start" 操作时,您需要确保在开始新一轮比赛之前清空队列。这是因为在新一轮比赛开始时,所有之前的选手都应该重新加入队列。为了解决这个问题,您可以在 "start" 操作的开始处清空队列。以下是修改后的代码:
#include <iostream>
#include <string>
#include <queue>
#include <map>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
queue<string> q;
map<string,bool> m;
string str,op,playing[2];
int n,playing_len=0;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>op;
if(op=="start")
{
// 清空队列
while (!q.empty()) {
q.pop();
}
for(int j=0;j<playing_len;j++)
{
q.push(playing[j]);
}
playing_len=0;
while(playing_len<2 and !q.empty())
{
if(m.find(q.front())==m.end())// element doesn't exist
{
q.pop();
continue;
}
playing[playing_len]=q.front();
cout<<q.front()<<' ';
playing_len++;
q.pop();
}
if(playing_len==0)
{
cout<<"Error\n";
}
else
{
cout<<endl;
}
}
else if(op=="arrive")
{
cin>>str;
if(m.find(str)!=m.end())
{
cout<<"Error\n";
}
else
{
m[str]=true;
q.push(str);
cout<<"OK\n";
}
}
else// leave
{
cin>>str;
bool flag=false;
for(int i=0;i<playing_len;i++)
{
if(playing[i]==str)
{
flag=true;
break;
}
}
if(m.find(str)==m.end() or flag)
{
cout<<"Error\n";
}
else
{
m.erase(m.find(str));
cout<<"OK\n";
}
}
}
}
这个修改应该可以解决您遇到的问题。如果您在运行修改后的代码时仍然遇到问题,请随时告诉我。 |