CCF(消息传递口:80分):字符串相关+队列

消息传递口

201903-4

本题主要是利用队列进行模拟,因为一开始我没有注意到要按照顺序,所以一开始的解法错误。

#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<cstdio>
#include<queue>
#include<sstream>
using namespace std;
const int maxn=10004;
int t,n;
struct node{
    int flag;//flag=0表示s,flag=1表示r
    int to;
    node(string s){
        char c=s[0];
        if(c=='S')
            flag=0;
        else if(c=='R')
            flag=1;
        int ans=0;
        for(int i=1;i<s.length();i++){
            ans=ans*10+s[i]-'0';
        }
        to=ans%n;
    }
    node(){}
};
int main(){
    // ios::sync_with_stdio(false);
    // cin.tie(0);
    cin>>t>>n;
    getchar();//------------------------------------这个很重要
    while(t--){ 
        queue<node> que[maxn];
        stringstream gs;
        for(int i=0;i<n;i++){
            string s;
            getline(cin,s);
            gs<<s;
            while(gs>>s){
                //cout<<s<<endl;3 2
                que[i].push(node(s));
            }
            gs.clear();
        }
        while(true){
            bool flag=false;
            for(int i=0;i<n;i++){
                if(que[i].empty())
                    continue;
                node t=que[i].front();
                int j=t.to;
                //cout<<j<<endl;
                if(que[j].empty())//只要一个有匹配而另一个已经空了,就退出,这时候答案就是1死锁
                    break;
                node t1=que[j].front();
                int j1=t1.to;
                //cout<<j1<<endl;
                if(j1!=i)
                    continue;
                if(t1.flag+t.flag!=1)
                    continue;
                //cout<<que[i].front().flag<<que[j].front().flag<<endl;
                que[i].pop();
                que[j].pop();
                flag=true;
                i--;
                //cout<<"yes"<<endl;
            }
            if(!flag)
                break;
        }
        bool flag=true;
        for(int i=0;i<n;i++){
            if(!que[i].empty()){
                flag=false;
                break;
            }
        }
        if(flag){
            //puts("0");
            cout<<0<<endl;
        }else
        {
            //puts("1");
            cout<<1<<endl;
        }
        gs.str("");
    }
    //system("pause");
    return 0;
}
posted @   Garrett_Wale  阅读(207)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示