这道题改了好几天了还是段错误(运行错误),看了很多遍都觉得没有什么问题,但官网上只能拿50分,
最后感觉是q.front()这个访问有问题,但在访问队首元素之前我已经判断队列是否为空了,但还是段错误,输出了一些中间过程,竟然发现有的q[i].size()竟然等于-1!!!我不理解呜呜呜,搜遍全网都没有这方面的问题。
代码在下面:希望各位大佬帮忙看看~~~·
#include <iostream>
#include <queue>
#include <stdlib.h>
#include <sstream>
#include <map>
using namespace std;
const int N=1e4+10;
string ss[N];
map<string,int>mp;
int t,n,num;
string func(int id)
{
string str;
stringstream ss;
ss<<id;
ss>>str;
return str;
}
int main()
{
cin>>t>>n;
while(t--)
{
queue <string> q[n];
num=0;
string s;
for(int i=0;i<n;i++)
{
while(cin>>s)
{
q[i].push(s);
//cout<<s<<" ";
num++;
if(cin.get()=='\n') break;
}
}
for(int i=0;i<n;i++)
{
if(q[i].empty()) continue;
//cout<<q[i].size()<<endl;
ss[i]=func(i); //转成整数
mp[ss[i]+q[i].front()]=1;//将队首元素用map存储,方便后面来发送和接受来消除
}
int ans=0;
while(1)
{
if(ans==num) break;//全部销完
int an=0;
for(int i=0;i<n;i++)
{
if(q[i].empty()) continue;
string u =q[i].front();
string temp;
if(u[0]=='R') temp="S";
else temp="R";
string s1=u.substr(1)+temp+ss[i];
if(mp.count(s1))//找到了与它想匹配的
{
an+=2;//记录消掉的元素
q[i].pop();//出队
mp[s1]=0;//消除
mp[ss[i]+u]=0;//消除
string s2=u.substr(1);
int nu=atoi(s2.c_str());
q[nu].pop();//消除
if(!q[i].empty())
{
string sss=ss[i]+q[i].front();
//cout<<q[i].size()<<endl;
mp[sss]=1;//新的队首元素
}
if(!q[nu].empty())
{
string sss=ss[nu]+q[nu].front();
//cout<<sss<<endl;
mp[sss]=1;//新的队首元素
}
}
}
if(!an) break;//本次循环一个都没有消除,证明死锁
ans+=an;
}
if(ans<num)cout<<1<<endl;
else cout<<0<<endl;
mp.clear();
}
return 0;
}
越想越不甘心的我又重新看了代码,发现map貌似不需要,就把map去掉了,然后有运行错误变成了运行时间过长!!!从50分变成了80分,
但之前那个代码为什么错还是不知道~~~~
新代码如下,不知道还有优化的手段没有
#pragma GCC optimize(2)
#include <iostream>
#include <queue>
#include <stdlib.h>
#include <sstream>
using namespace std;
const int N=1e4+10;
string ss[N];
int t,n,num;
string func(int id)
{
string str;
stringstream ss;
ss<<id;
ss>>str;
return str;
}
int main()
{
cin>>t>>n;
while(t--)
{
queue <string> q[n];
num=0;
string s;
for(int i=0;i<n;i++)
{
while(cin>>s)
{
q[i].push(s);
//cout<<s<<" ";
num++;
if(cin.get()=='\n') break;
}
}
for(int i=0;i<n;i++)
{
if(q[i].empty()) continue;
//cout<<q[i].size()<<endl;
ss[i]=func(i);
}
int ans=0;
while(1)
{
if(ans==num) break;
int an=0;
for(int i=0;i<n;i++)
{
if(q[i].empty()) continue;
string u =q[i].front();
string temp;
if(u[0]=='R') temp="S";
else temp="R";
string s1=temp+ss[i];
string s2=u.substr(1);
int nu=atoi(s2.c_str());
if(q[nu].size()&&q[nu].front()==s1)
{
an+=2;
q[i].pop();
q[nu].pop();
}
}
if(!an) break;
ans+=an;
}
if(ans<num)cout<<1<<endl;
else cout<<0<<endl;
}
return 0;
}
于是乎我又一次不甘心了~~~然后·我又优化了一下,刚开始就把输入的字符串分成类型和发送编号保存在结构体中,一次减少后面对substr()函数的使用次数,结果就过了!!!
但上面那个段错误还是好难受,不知道什么原因,希望各位大佬帮帮忙
新满分代码如下
#pragma GCC optimize(2)
#include <iostream>
#include <queue>
#include <stdlib.h>
#include <sstream>
using namespace std;
const int N=1e4+10;
struct node{
char ki;
int id;
};
int t,n,num;
string func(int id)
{
string str;
stringstream ss;
ss<<id;
ss>>str;
return str;
}
int main()
{
cin>>t>>n;
while(t--)
{
queue <node> q[n];
num=0;
string s;
for(int i=0;i<n;i++)
{
while(cin>>s)
{
char b=s[0];
string s2=s.substr(1);
int id=atoi(s2.c_str());
q[i].push({b,id});
num++;
if(cin.get()=='\n') break;
}
}
int ans=0;
while(1)
{
if(ans==num) break;
int an=0;
for(int i=0;i<n;i++)
{
if(q[i].empty()) continue;
node u =q[i].front();
char temp;
if(u.ki=='R') temp='S';
else temp='R';
int nu=u.id;
if(q[nu].empty()) break;
if(q[nu].front().ki!=temp||q[nu].front().id!=i) continue;
an+=2;
q[i].pop();
q[nu].pop();
}
if(!an) break;
ans+=an;
}
if(ans<num)cout<<1<<endl;
else cout<<0<<endl;
}
return 0;
}