201903-4 消息传递接口 (80')

最后一个点T,不知道怎么优化比较好。

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
#define pb(x) push_back(x)
#define cls(x, val) memset(x, val, sizeof(x))
#define fi first
#define se second
#define mp(x, y) make_pair(x, y)
#define inc(i, l, r) for(int i=l; i<=r; i++)
const int inf = 0x3f3f3f3f;
const int maxn = 2000+10;
int t, n;
vector<string> op[10000+10];
int id[10000+10];
int sz[10000+10];

bool check(){
    for(int i=0; i<n; i++){
        if(id[i]<sz[i]) return false;
    }
    return  true;
}

int get(string s){
    int num = 0;
    for(int i=1; i<s.length(); i++){
        num  = num*10 + s[i]-'0';
    }
    return num;
}

int main(){
    string temp;
    getline(cin, temp);
    stringstream s1(temp);
    s1>>t;
    s1>>n;
    for(int i=0; i<n; i++) op[i].resize(10);
    while(t--){
        for(int i=0; i<n; i++) {
            getline(cin, temp);
            stringstream ss(temp);
            int idx = 0;
            while(ss>>op[i][idx++]){
                //cout<<"-"<<op[i][idx-1]<<">";
            }
            sz[i] = idx-1;
        }

//        for(int i=0; i<n; i++){
//            for(int j=0; j<sz[i]; j++){
//                cout<<op[i][j]<<" ";
//            }
//            cout<<endl;
//        }

        for(int i=0 ;i<n; i++) id[i] = 0;
        bool can = false;
        while(true){
            if(check()) {
                can = true;
                break;
            }
            bool you = false;
            for(int i=0; i<n; i++){
                if(id[i]>=sz[i]) continue;
                if(op[i][id[i]][0] == 'S'){
                    int dst = get(op[i][id[i]]);
                    if(id[dst]>=sz[dst]) continue;
                    int temp1 = get(op[dst][id[dst]]);
                    if(op[dst][id[dst]][0] == 'R'&&temp1 == i){
                        id[i]++;
                        id[dst]++;
                        you = true;
                        break;
                    }
                }
            }
            if(!you){
                break;
            }
        }
        if(can) cout<<0<<endl;
        else cout<<1<<endl;
    }

    return 0;
}
/*
3 2
R1 S1
S0 R0
R1 S1
R0 S0
R1 R1 R1 R1 S1 S1 S1 S1
S0 S0 S0 S0 R0 R0 R0 R0

2 3
R1 S1
R2 S0 R0 S2
S1 R1
R1
R2 S0 R0
S1 R1
*/

201903-4 消息传递接口 (80')

原文地址:https://www.cnblogs.com/babydragon/p/11495104.html

时间: 2024-10-21 16:08:31

201903-4 消息传递接口 (80')的相关文章

ccf 201903-4 消息传递接口 100

思路:我们发现每个进程的代码都由空格隔开,代码都有两部分组成:标识符:‘R' or ’S';目的进程:一组数字字符串. 成功接受或发送,那么这份代码便消失了,开始该进程下一份代码的比较.这让我们很容易想到队列. 我们为每个进程都创建一个队列,队列中放代码,成功匹配代码,我们便将其从队列中pop掉,那么判断进程是否阻塞便变为了判断终态的队列是否为空. 剩下的就是比对了,直接比对显然很困难,我们可以定义一个结构体,这个结构体便相当于我们的代码,标识符‘R' or ’S'我们可以转化为0,1:数字字符

201903-4 消息传递接口

样例1 输入: 3 2R1 S1S0 R0R1 S1R0 S0R1 R1 R1 R1 S1 S1 S1 S1S0 S0 S0 S0 R0 R0 R0 R0 输出: 0 1 0 样例二: 输入: 2 3R1 S1R2 S0 R0 S2S1 R1R1R2 S0 R0S1 R1 输出: 0 1 思路: 1.建一个结构体,存x S/R y  ,注意,x 可能不止一位数.用队列顺序存储每个进程. 2.用getchar()来取字符串后面的字符,如果取到的是换行,那么该进程结束,去取下一个进程. 3.如果顺序

【学习笔记】C# 接口

使用interface关键字定义接口 接口定义一组成员但不直接实现它们 实现接口 实现接口的任何类都必须实现其所有的成员方法 接口不能直接实例化 接口可以包含方法和属性声明,不能包含字段 接口中所有属性和方法默认为public 一个子类可以继承一个父类的同时,实现多个接口 1 using System; 2 3 namespace InterfaceDemo 4 { 5 //食物接口 6 public interface Food 7 { 8 //在接口中定义属性,属性也不能实现 9 float

并行编程入门

目录 1. 并行编程简介 2. MapReduce 2.1 MapReduce简介 2.2 MapReduce框架 2.3 Hadoop介绍 2.4 Hadoop基本类 2.5 Hadoop编程实例 1.并行编程简介 1.1.并行编程作用,用途 商业用途,科学计算,大数据分析 1.2.并行编程兴起原因 目前的串行编程的局限性 使用的流水线等隐式并行模式的局限性 硬件的发展 1.3.并行算法设计原则步骤 a.分析问题 b.分解问题 其中分解方法有: 数据分解 递归分解 探测性分解 推测性分解 混合

分布式系统

Distributed systems: for fun and profit (http://book.mixu.net/distsys/index.html) 链接:https://www.zhihu.com/question/23645117/answer/124708083 这篇文章主要试图回答以下两个个问题:1. 近些年分布式系统领域都在做些什么.2. 为什么现在投入分布式系统的学习和研究是值得的.我会尽可能多的去介绍更 "实用" 的分布式系统知识. 什么是实用?例如:Pax

[译][并行计算] 1. 并行计算简介

原文地址:https://blog.csdn.net/magicbean2/article/details/75174859 并行计算简介 (本人刚刚完成这篇长文章的翻译,尚未认真校对.若里面有翻译错误和打字错误敬请谅解,并请参考原贴) 1 摘要 最近项目需要实现程序的并行化,刚好借着翻译这篇帖子的机会,了解和熟悉并行计算的基本概念和程序设计.帖子的原文见这里. 这篇帖子旨在为并行计算这一广泛而宏大的话题提供一个非常快速的概述,作为随后教程的先导.因此,它只涵盖了并行计算的基础知识,实用于刚刚开

C#并行编程

一.基于任务的程序设计 共享内存多核OS和分布式内存OS 共享内存多核OS-一个微处理器由多个内核组成,且每个内核共享一段私有内存: 分布式内存OS-- 由多个微处理器组成,每个微处理器可以有自己的私有内存,微处理器可以位于不同的计算机上,每个计算机可以有不同的通信信道 消息传递接口(MPI):运行在分布式内存计算机系统上的并行应用程序所使用的最流行的通信协议: 并行程序设计和多核程序设计 并行程序是指同一时刻运行多条指令,编写的代码能够充分利用底层硬件提供的并行执行能力:多核程序设计能够充分利

分布式机器学习的集群方案介绍之HPC实现

机器学习的基本概念 机器学习方法是计算机利用已有的数据(经验),得出了某种模型(迟到的规律),并利用此模型预测未来(是否迟到)的一种方法.目前机器学习广泛应用于广告投放.趋势预测.图像识别.语音识别.自动驾驶和产品推荐等众多领域. 在确定了问题模型之后,根据已知数据寻找模型参数的过程就是训练,训练过程就是不断依据训练数据来调整参数的迭代,从而使依据模型作出的预测结果更加准确. HPC的基本概念 HPC就是高性能计算或高性能计算集群的简写.为了追求高性能,HPC的工作负载一般直接运行在Linux系

网络渗透技术1

1.进程,端口 和 服务 a.一个进程对应着一个程序:当运行一个程序就启动了一个进程:程序是静态的,进程是动态的:完成操作系统功能的是系统进程,由用户启动的就是用户进程: b.一个端口对应着一个服务:可以认为其是计算机和外界通讯交流的出口:端口可以分为硬件端口,软件端口和协议端口.其中 硬件端口:包括USB端口,串行端口等: 软件端口一般指网络中面向连接服务和无连接服务的通信协议接口,包括一些数据结构和I/o(基本输入输出设备)缓冲区等: 协议端口范围为0-65535,如:网页服务接口80,用于