CCF-CSP201903-4-消息传递接口

2023-10-30

  1. 首先应当思考的是如何对输入数据进行存储?

    通过样例输入可以看出,每一个进程执行的操作数量都是不定的,因此可以采用**vectorg[N]进行存储,其中g[i]表示i号进程应执行操作,也可以采用queueq[N]**进行存储q[i]表示i号进程应执行的操作,**q[i].size()**为i号进程应执行的操作的数量

  2. 应该如何读取?

    1. 可以一整行一整行的读用fgets或者getline,读取到str当中

      1. char str[100];
        fgets(str,100,stdin);
        //同时在使用fgets之前,如果前面有过输入应当使用getchar()读掉缓冲区中的回车符
        
      2. string str;
        getline(cin,str);
        
    2. 再使用stringstream进行一个拆分各操作,并将其push到队列或者push_back()到vector里面

  3. 学完了存储,应该如何求解呢?

先举一个例子说明(先用不带死锁的例子进行举例)

进程号 操作1 操作2 操作3
1 S2
2 R3 R1 S3
3 S2 R2

上面这个例子我们应该如何判断每一个进程是否都能全部执行完自己的操作呢


用dfs思路进行考虑,首先我们从1号进程开始执行,发现"S2",表示1号进程向2号进程发送了数据,那么接下来应该看看2号进程是否有“R1”,在递归到2号进程时发现有一个“R3”,那么应该从3号进程找看看有没”S2“,递归到3号进程时,发现有”S2“,因此递归返回到2号进程,2号进程”R3“可以执行,接下来该2号进程的"R1"操作了,这时正好满足1号进程对”R1“的需要,因此递归返回到1号进程,那么这样的话就完成了从1号进程开始的一次递归


细心的朋友会注意到上面的执行过程是从1号进程开始递归的,且只关注1号进程是否执行完,而不管你其他进程执行完没,因此要判断n个进程是否都能执行完毕,就得依次递归这n个进程了。


  1. 再来讲解如何判断死锁,同样看下面例子
进程号 操作1 操作2 操作3
1 S2
2 S1

同样我从1号进程开始递归,发现是”S2“,那么就要递归从2号进程中找”R1“,递归到2号进程时,发现是‘S1”,因此要递归到1号进程找"R2",这种情况下就发生了死锁,那么应该如何判断呢,可以用一个st[N]数组来标记前面已经递归过得进程,在往下递归求解时发现有一个进程已经标记过,则说明发生了死锁

#include <iostream>
#include <sstream>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
const int N = 100010;
struct Node{
    int t; //S时为0
    int id;
};
bool st[N];
queue<Node>q[N];

bool dfs(int sid,int rid,int type,int p){ //哪个进程发的,要找哪个进程,要找得进程类型
    if(st[rid])return false;
    st[rid] = true;
    while (!q[rid].empty()){ //接收不为空
        auto t = q[rid].front(); //出队列
        q[rid].pop(); //
        //cout << t.t << t.id <<"  "<<type<<sid<<endl;
        if(t.t==type&&t.id==sid){ //
            st[rid] = false;
            return true;
        }else if(!dfs(rid,t.id,t.t^1,p)){ //不匹配
            //cout<<"---" <<endl;
            return false;
        }
    }
    
    return sid == p;
}

int main(){
    int T,n;
    cin >> T >> n;
    getchar();
    while (T--){
        for (int i = 0; i < n; ++i) {
            string str;
            getline(cin,str);
            stringstream ssin(str);
            q[i] = queue<Node>();
            while (ssin>>str){
                int t=1,id;
                if(str[0]=='S'){
                    t = 0;
                }
                id = stoi(str.substr(1));
                q[i].push({t,id});
            }
        }
        int ans=0;
        for (int i = 0; i < n; ++i) {
            memset(st,0, sizeof(st));
            if(!dfs(-1,i,-1,-1)) {
                ans = 1;
                break;
            }
        }
        printf("%d\n",ans);
    }

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CCF-CSP201903-4-消息传递接口 的相关文章

  • 计算机图形学期刊影响因子,计算机图形学 | CCF推荐期刊专刊信息2条

    原标题 xff1a 计算机图形学 CCF推荐期刊专刊信息2条 图形学与多媒体 Computers amp Graphics Call for papers Shape Modelling International SMI 2019 全文截
  • day37 445 数字反转 (字符串处理、模拟)

    445 数字反转 给定一个整数 请将该数各个位上数字反转得到一个新数 新数也应满足整数的常见形式 即除非给定的原数为零 否则反转后得到的新数的最高位数字不应为零 输入格式 输入共1行 1个整数N 输出格式 输出共1行 1个整数表示反转后的新
  • 模拟CMOS集成电路设计中的电流基准源及用Cadence Virtuoso IC617设计并仿真有关电路

    前言 本文为我自己的学习笔记 属于Cadence Virtuoso系列的进阶部分 采用的软件版本是Cadence Virtuoso IC617 其他文章请点击上方 看我制作的Cadence Virtuoso专栏内容 在前面的文章中 记录了电
  • Acwing-4699. 如此编码

    我们可以直接把c代入 然后将m的表达式展开 问题转化成已知m和a序列 求b序列 类似于进制位转化 把ai都看成10 m就是十进制数的表达式了 就更像了hh 这个过程很像求某进制下 各个数位上的数是多少 比如 1679各个位置上的数依次是9
  • Basic Level 1053 住房空置率 (20分)

    题目 在不打扰居民的前提下 统计住房空置率的一种方法是根据每户用电量的连续变化规律进行判断 判断方法如下 在观察期内 若存在超过一半的日子用电量低于某给定的阈值 e 则该住房为 可能空置 若观察期超过某给定阈值 D 天 且满足上一个条件 则
  • Happiness【2019EC Final G题】【模拟】

    题目链接 题意很长 先翻译一下 由N个参赛队伍 给出其余N 1只参赛队伍 另外一支队伍是我们 本次ICPC一共有10道题 我们知道其余N支队伍每道题的通过时间和错误次数 如果是 则为没有在300分钟内解决该问题 最后给出我们队伍 做出每道题
  • Shuffle'm Up【模拟】

    题目链接 POJ 3087 题意 给你两刀牌 第一刀是s1 第二刀是s2 然后有目标的理牌的最终形态S12 现在给出理牌的规则 理牌规则 假设s1 123 s2 456 则第一次理牌之后 S 415263 然后新的s1 415 新的s2 2
  • 2021Robocom决赛---账户安全预警

    拼题 A 系统为提高用户账户的安全性 打算开发一个自动安全预警的功能 对每个账户的每次登录 系统会记录其登录的 IP 地址 每隔一段时间 系统将统计每个账户从多少不同的 IP 地址分别登录了多少次 如果某个账户的登录 IP 超过了 TIP
  • L1-046 整除光棍

    这里所谓的 光棍 并不是指单身汪啦 说的是全部由1组成的数字 比如1 11 111 1111等 传说任何一个光棍都能被一个不以5结尾的奇数整除 比如 111111就可以被13整除 现在 你的程序要读入一个整数x 这个整数一定是奇数并且不以5
  • CCF-CSP真题《202305-1 重复局面》思路+python,c++满分题解

    想查看其他题的真题及题解的同学可以前往查看 CCF CSP真题附题解大全 试题编号 202305 1 试题名称 重复局面 时间限制 1 0s 内存限制 512 0MB 问题描述 题目背景 国际象棋在对局时 同一局面连续或间断出现3次或3次以
  • AcWing 422. 校门外的树

    题目 某校大门外长度为L的马路上有一排树 每两棵相邻的树之间的间隔都是1米 我们可以把马路看成一个数轴 马路的一端在数轴0的位置 另一端在L的位置 数轴上的每个整数点 即0 1 2 L 都种有一棵树 由于马路上有一些区域要用来建地铁 这些区
  • [leetcode] 球会落何处 模拟

    给出一个矩阵 里面的值为 1 or 1 1的时候是从左上到右下 1的时候是从左下到右上 当一个球从上方x 0 lt x lt m 放入之后 从哪个出口掉落还是无法从出口掉落 能通过的情况为 即某条线为 其左边的线也是 箭头所指为当前斜线 即
  • ahut 月赛1

    心得 一点一点理解 对于一段要学习的代码 跟着写下来 理解一点写一点 对于一道题目 用记事本 看题目 看一句题目 用自己的话概括一句 写在记事本上 并将自己的 想法一并写下来 这样做下来 心会很平静 你会发现 理解一段代码并不费力 解决一道
  • Acwing-包含min函数的栈

    stk表示存入这些数据的栈 stk min表示栈里面前i数中的最小值是多少 class MinStack public stack
  • 1222. 可以攻击国王的皇后

    文章目录 Tag 题目来源 题目解读 解题思路 方法一 从白国王出发 方法二 从黑皇后出发 写在最后 Tag 模拟 数组 题目来源 1222 可以攻击国王的皇后 题目解读 在一个 8 8 8 times 8 8 8 的棋盘上 有若干个
  • 猜数字小游戏(JAVA)

    猜数字小游戏 题目描述 代码 运行效果 新增功能 思路 代码 运行效果 题目描述 猜数字 又称 Bulls and Cows 是一种古老的的密码破译类益智类小游戏 起源于20世纪中期 一般由两个人或多人玩 也可以由一个人和电脑玩 通常由两个
  • What time is it?【模拟】

    题目链接 POJ 1676 题意 给你两个时间点 前一个时间点比后一个时间点快了15分钟 当然 也有可能是隔天的 现在要问是否唯一确定第一个时间 输入坑点 两个时间之间用一个空格隔开 所以一行一共可以有25个字符 我们可以枚举00 00 2
  • Ansys workbench 云图如何不显示边框

    由于对workbench不熟悉 走了很多弯路 云图上有边框总是不好看 但是又不知道在哪里关掉它 经过一番摸索终于找到了 关闭前 关闭方法 工具栏 WireFrame 按钮 点一下即可 希望对有需要的朋友有用
  • 第十六次CCF认证模拟试题(201903-2):二十四点(Java完整版)

    最近在练习算法 觉得CCF的算法题都还不错 就做了一下子 试卷原题 Java版解法 import java util ArrayList import java util Scanner public class Main public s
  • VMware 中搭建 SylixOS 环境

    1 制作 x86 平台 U 盘启动盘 详细步骤见 RealEvo IDE 使用手册 第八章 制作成功后插入 U 盘 2 创建 VMware 虚拟机设备 打开 VMware 这里使用版本为 15 5 6 点击 创建新的虚拟机 按如下步骤创建虚

随机推荐

  • 小型校园网的设计与组建

    小型校园网的设计与组建 1 实验说明 2 设计思路 原文链接 1 实验说明 某大学分为总校和分校 为该校设计校园网 总校有一个局域网共20台计算机 分校由VLAN划分为两个局域网 分别有10台计算机 该校被分配了一个C类网段210 100
  • 解决 React + TS 项目移动端 vw 适配

    解决 React TS 项目移动端 vw 适配 前提 通过 creat react app 搭建项目 使用 craco 配置项目 第一步 yarn add D postcss px to viewport 第二步 在 craco confi
  • firefly mysql_【官方帖】Firefly入门教程+ 介绍文档+ 配置说明+WIKI

    官方教程 Firefly入门教程 firefly MySQL和Memcached共同使用 示例 官方教程 Firefly入门教程 firefly MySQL和Memcached共同使用 官方教程 Firefly入门教程 firefly将me
  • 多线程01:《疯狂Java讲义》学习笔记——线程概述

    注 此文为学习 疯狂Java讲义 的笔记 因此内容全部来自于该书中 1 线程和进程 当一个程序进入内存运行时 变成一个进程 进程是处于运行过程中的程序 并且是具有一定的独立功能 进程是系统进行资源分配和调度的一个独立单位 进程的特征 1 独
  • 程序员是怎么约会的?

    程序员 在多数心目印象当中 程序员大多数是宅男 程序员的世界是由代码构建的 代码之外还是代码 程序员的世界是 格子衫 牛仔裤 其实 在程序员眼里衣服就是块布 避体不贵 经济实惠 省下的钱用来买个一万多的耳机 香的不要不要的呢 而且一般的衣服
  • vscode初次远程连接服务器报错解决

    1 错误 vscode初次远程连接服务器无法连接成功报错 并弹框提示 关闭 更多操作 重试 这说明网络无法安装vscode server服务 2 解决办法 1 查看自己vscode的commit id 2 按照输出中的wget 命令在可以联
  • 云计算 第六章 云平台应用(2)

    Hadoop核心组件介绍 分布式存储系统HDFS Hadoop Distributed File System 分布式存储系统 提供了高可靠性 高扩展性和高吞吐率的数据存储服务 资源管理系统YARN Yet Another Resource
  • Typora导出word

    Typora导出word Typora导出word 第一步 安装Pandoc软件 国内访问很慢 我已经下好了 地址见https download csdn net download weixin 45092432 86402193 第二步
  • redis_代码实现

    1 创建工程 创建一个maven项目mavenRedis pom xml中添加redis配置
  • STM32中断号与中断优先级

    中断号 以COTEX M3内核来举例 中断号对应下图中断编号 应该是芯片或者内核厂家定义好的 与中断向量表成对应关系 这个应该 O O 是不可变动的 相当于中断标识 比如MCU发生了一个相应的中断 则直接根据这个的中断号或者中断向量表去执行
  • 【满分】【华为OD机试真题2023 JAVA&JS】预定酒店

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 预定酒店 知识点排序 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 放暑假了 小明决定到某旅游景点游玩 他在网上搜索到了各种价位的酒店 长度为n的数组A 他的心
  • OpenAI-ChatGPT最新官方接口《审核机制》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(七)(附源码)

    Moderation 审核机制 前言 Introduction 导言 Quickstart 快速开始 其它资料下载 ChatGPT 作为一个大型人工智能语言模型 在提供用户便捷交流的同时也承担着内容审核的责任 为了保护用户和社会免受不良信息
  • 演讲:文档什么鬼分享会

    作为一个初创技术公司 我司的信息管理水平 基本还停留在茹毛饮血的原始水平 领导让我给全公司的同事做一个分享 说是要提升一下文档意识的水位 作为一只热爱解决具体问题的攻城狮 竟然勉强我去讲 哲学 瞬间化身嘤嘤怪 不过转念回想起当年挥斥方遒 写
  • Learning Ceph

    Author 海峰 http weibo com 344736086 参考章宇兄的开源项目学习ABC的方法来对ceph进行简单的学习与分析 下面是分析过程中画的图片
  • RBF神经网络对iris鸢尾花数据集进行分类识别

    RBF神经网络对iris鸢尾花数据集进行分类 http blog csdn net fubin0000 设计要求 iris以鸢尾花的特征作为数据来源 数据集包含150个数据集 分为3类 setosa versicolor virginica
  • Qt 界面加载卡顿或刷新问题

    主要有以下几个解决方案可以去尝试下 一 设置WA Mapped属性 让界面可以及时更新 void CMainStaticsWindows showEvent QShowEvent event 这句话解决第二次打开窗口没有刷新情况 窗口一片空
  • java fx数据库,Java FX中的数据库连接最佳实践

    目前我也在使用数据库连接的JavaFX应用程序 我选择的方式如下 创建一个SQL Controller Class 这个类应该包含处理你的SQL数据的所有东西 例如 一个连接方法来打开一个连接 一个close方法也没有错 在所有控制器类中使
  • Button 点击没有反应

    原因 检查一下你是不是把button TargetGraphic目标翻转了180度 因为UGUI的射线检测默认只检测正面 解决办法 在你的button检测目标也就是 TargetGraphic目标上加个GraphicRayCaster组件
  • 关于Java环境变量配置之后在CMD中键入JavaC、Java -version无反应

    本机装的是jdk 11 安装后配置环境 在cmd中键入JavaC Java version均无反应 如下图 上网查阅多方资料 终于在知乎大佬的分享贴下解决此问题 鸣谢 步骤如下 右键点击此电脑 gt 属性 gt 高级系统设置 gt 环境配置
  • CCF-CSP201903-4-消息传递接口

    首先应当思考的是如何对输入数据进行存储 通过样例输入可以看出 每一个进程执行的操作数量都是不定的 因此可以采用 vectorg N 进行存储 其中g i 表示i号进程应执行操作 也可以采用queueq N 进行存储q i 表示i号进程应执行