ccf-csp:201903-4 消息传递接口 运行错误求助~

原题链接

这道题改了好几天了还是段错误(运行错误),看了很多遍都觉得没有什么问题,但官网上只能拿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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值