一:前言

停更一周了,在这一周里,我每时每刻都在 想这我这 29个粉丝,庆幸教师资格证终于结束了,贴心杰又可以天天更新博客了
哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈,I am come back;

二:题目:

输入N个进程(N<=100),以及M类资源(M<=100),初始化各种资源的总数,T0时刻资源的分配情况。判断T0时刻是否安全。例如: 假定系统中有5个进程{P0,P1,P2,P3,P4}和三类资源{A,B,C},各种资源的数量分别为10、5、7,在T0时刻的资源分配图如下:

输入格式:
第一行输入进程数量N,第二行输入资源类数M,第三行输入M类资源个类资源的总数,以下N行分别输入每个进程的名字,该进程对M类资源的最大需求以及已分配资源。

输出格式:
输出T0时刻系统的状态。若安全,输出“找到安全序列,处于安全状态。”否则,输出“找不到安全序列,处于不安全状态。”

输入样例:
在这里给出一组输入。例如:

5
3
10 5 7
P0 7 5 3 0 1 0
P1 3 2 2 2 0 0
P2 9 0 2 3 0 2
P3 2 2 2 2 1 1
P4 4 3 2 0 0 2

输出样例:
在这里给出相应的输出。例如:

name max allocation need available
P0 7 5 3 | 0 1 0 | 7 4 3 | 3 3 2
P1 3 2 2 | 2 0 0 | 1 2 2 |
P2 9 0 2 | 3 0 2 | 6 0 0 |
P3 2 2 2 | 2 1 1 | 0 1 1 |
P4 4 3 2 | 0 0 2 | 4 3 0 |
找到安全序列,处于安全状态。

三:思路

思路:
1.首先我们进行安全性算法是为了预防死锁,再解释一下死锁 比如
1>:在系统中有两个进程p1,p2 和两个资源r1(扫描仪),r2(刻录机)
p1和p2都需要将扫描的文档通过刻录机刻录到CD盘上,
2>:进程p1先请求资源r1成功,进程p2请求资源r2成功,那么接下来,
p1又申请了r2资源 p2申请了r1资源,那么此时p1和p2都在等对方
释放资源那么就会发生死锁,两个进程都无法进行下去
2.那么安全性算法就是使系统在分配资源时候一直处在安全的状态(即不会发生死锁)
那么我们在分配资源的时候就有了算法,即最终分配给各个进程的资源,都不会影响到
整个系统的安全状态,这时会出现一个进程的执行序列
3.具体解释算法过程
1>:几个变量
Max:一个进程所需的最大资源量
Allocation:系统已经给其分配了多少资源
Need:这个进程还需要多少资源
Available:这个系统还剩多少资源
2>:刚开始设置work = Available 将所有进程设置为 finish = false (相当于定义一个flag)

3>:找一个进程满足下列的条件
finish = falseneed <= work(需要的资源得比系统剩余的要少)
4>:如果 3>的条件满足的话,我们就需要
将work += Allocation (每个进程执行完后需要释放资源)
finish = true (代表该进程完成)
返回步骤 3>继续寻找满足上诉条件的进程

5>:思考如何判定此时的系统状态是安全还是不安全的
安全:如果 3>的条件不满足 即此时的所有进程的 finsh = true 说明了所有的进程已经完成
不安全: 我们已经判断了所有的finish = false 的进程,但是仍未找到满足条件的
need < work 那么可以判定此状态为 不安全的状态
4.处理数据
1>:这里我们选取的数据结构是结构体数组因为一个进程他对应好多属性,所以选取的是结构体
在结构体的属性当中 我们设置一个 max[] 和 allocation[] 目的是存放多个不同类型资源
2>:关于node[i].a[j],node[i].b[j],node[i].c[j]的理解,就是3个二维数组 就是这样的

四:先说坑

1.这个题无语了简直了真是,不,应该是PTA这个平台让我真的无语了,我定义了一个变量 cnt 但我并未初始化为0 ,我在DEV-C中测试了好多数据其实也无妨正确结果,但是在PTA中提交一直显示答案错误,而且测试样例一直输出 找不到安全序列,真的一上午我真的想砸电脑,什么呀!! 最后坚持不懈,不信邪,终于让我发现一个大毛病,原来在PTA上变量必须初始化,否则系统自动给你赋值一个很大数 ,但在DEV-C上却没有任何问题
2.这个题还需要的是无论 是否可以得到安全序列,其都必须将其系统中各个进程的状态输出来

五:上码

/**思路:1.首先我们进行安全性算法是为了预防死锁,再解释一下死锁 比如1>:在系统中有两个进程p1,p2 和两个资源r1(扫描仪),r2(刻录机)p1和p2都需要将扫描的文档通过刻录机刻录到CD盘上, 2>:进程p1先请求资源r1成功,进程p2请求资源r2成功,那么接下来,p1又申请了r2资源  p2申请了r1资源,那么此时p1和p2都在等对方释放资源那么就会发生死锁,两个进程都无法进行下去2.那么安全性算法就是使系统在分配资源时候一直处在安全的状态(即不会发生死锁)那么我们在分配资源的时候就有了算法,即最终分配给各个进程的资源,都不会影响到整个系统的安全状态,这时会出现一个进程的执行序列3.具体解释算法过程1>:几个变量Max:一个进程所需的最大资源量Allocation:系统已经给其分配了多少资源Need:这个进程还需要多少资源Available:这个系统还剩多少资源2>:刚开始设置work = Available  将所有进程设置为 finish = false (相当于定义一个flag)3>:找一个进程满足下列的条件 finish = falseneed <= work(需要的资源得比系统剩余的要少)4>:如果 3>的条件满足的话,我们就需要 将work += Allocation (每个进程执行完后需要释放资源)finish = true (代表该进程完成)返回步骤 3>继续寻找满足上诉条件的进程 5>:思考如何判定此时的系统状态是安全还是不安全的 安全:如果 3>的条件不满足 即此时的所有进程的 finsh = true 说明了所有的进程已经完成不安全: 我们已经判断了所有的finish = false 的进程,但是仍未找到满足条件的need < work 那么可以判定此状态为 不安全的状态 ,否则那么就是说明该系统处在不安全的状态(即会发生死锁)4.处理数据 1>:这里我们选取的数据结构是结构体数组因为一个进程他对应好多属性,所以选取的是结构体                            在结构体的属性当中 我们设置一个 max[] 和 allocation[] 目的是存放多个不同类型资源 2>:关于node[i].a[j],node[i].b[j],node[i].c[j]的理解,就是3个二维数组 就是这样的  */ #include<bits/stdc++.h>
using namespace std;struct Node{string processName;//进程名    int a[100];//Max  int b[100];//allocation int c[100];//need bool finish;}node[1000];//关于重写 sort方法中的两个参数 都表示是一个结构体(即我们需要用两个结构体当中的数据进行比较)
bool sort_c(Node node1,Node node2){return node1.c[0] < node2.c[0];
}int main(){int N,M;int cnt = 0;//用于记进程完成的个数 vector<int>v1;//存总的资源总量 vector<int>v2;//存need需要的资源 vector<int>v3;//记录最后需要输出的Available cin >> N >> M;for(int i = 0; i < M; i++){int resources;cin >> resources;v1.push_back(resources); }for(int i = 0; i < N; i++){cin >> node[i].processName;//输入Max for(int j = 0; j < M; j++){cin >> node[i].a[j];}//输入allocation for(int j = 0; j < M; j++){cin  >> node[i].b[j]; v1[j] -= node[i].b[j];//这里是每次减去分配的资源 那么剩下的最后就是  available }//求取needfor(int j = 0; j < M; j++){node[i].c[j] = node[i].a[j] - node[i].b[j];} node[i].finish = false;//将每个进程初始状态设为 false }      for(int i = 0; i < M; i++){v3.push_back(v1[i]);} //   sort(node,node+N,sort_c);//算法核心部分 for(int i = 0; i < N; i++){int count = 0;for(int j = 0; j < M; j++){if(node[i].c[j] <= v1[j]){count++;}else{break;//只要有一个不合适就 break 出去 }              }if(node[i].finish == false && count == M) {//count == M说明剩余的各个资源总量大于该进程的所需要的 for(int j = 0; j < M; j++){v1[j] += node[i].b[j];//那么此时剩余的资源总量为原来的加上 该进程释放其占有的资源}   node[i].finish = true; cnt++;//记录完成进程的个数 //  cout << node[i].processName << ' ';//此处牛逼之处在于 只要我们找到满足条件的就从-1开始继续寻找满足条件的 i = -1; }                   }// cout << endl;int flag = 0;cout << "name max allocation need available" << endl;for(int i = 0; i < N; i++){cout << node[i].processName << ' ';for(int j = 0; j < M; j++){cout << node[i].a[j] << ' ';           }           cout << "| ";for(int j = 0; j < M; j++){cout << node[i].b[j] << ' ';            }cout << "| ";for(int j = 0; j < M; j++){cout << node[i].c[j] << ' ';           }cout << "|";if(flag == 0){for(int j = 0; j < M; j++){if(j == 0)cout << ' ' <<v3[j];elsecout << ' ' <<v3[j] ;                         }   flag = 1;      }   cout << endl; }if(cnt == N){    cout << "找到安全序列,处于安全状态。";}else{cout << "找不到安全序列,处于不安全状态。";} //    for(int i = 0; i < M; i++){//      cout << v1[i] << ' ';
//  } //  验证数据
//  for(int i = 0; i < N; i++){//
//      cout << node[i].processName << ' ';
//
//      for(int j = 0; j < M; j++){//
//          cout << node[i].c[j] << ' ';
//      }
//      cout << endl;
//  }}//name max allocation need available
//P0 7 5 3 | 0 1 0 | 7 4 3 | 3 3 2
//P1 3 2 2 | 2 0 0 | 1 2 2 |
//P2 9 0 2 | 3 0 2 | 6 0 0 |
//P3 2 2 2 | 2 1 1 | 0 1 1 |
//P4 4 3 2 | 0 0 2 | 4 3 0 |
//找到安全序列,处于安全状态。//5
//3
//10 5 7
//P0 8 6 3 0 1 0
//P1 3 2 2 2 0 0
//P2 9 0 2 3 0 2
//P3 2 2 2 2 1 1
//P4 4 3 2 0 0 2//5
//3
//6 3 5
//P0 7 5 3 0 1 0
//P1 3 2 2 2 0 0
//P2 9 0 2 3 0 2
//P3 2 2 2 2 1 1
//P4 4 3 2 0 0 2//5
//4
//3 14 12 12
//p0 0 0 1 2 0 0 1 2
//p1 1 7 5 0 1 0 0 0
//p2 2 3 5 6 1 3 5 4
//p3 0 6 5 2 0 6 3 2
//p4 0 6 5 6 0 0 1 4 


最后 再唠叨一句 ,记得加油宝!! 我们共勉 共同进步!!!

7-1 银行家算法--安全性检查 (20 分)(思路+详解+知识分析)宝 你今天 AC了吗相关推荐

  1. 7-16 一元多项式求导 (20 分)(详解+题目分析)

    7-16 一元多项式求导 (20 分) 1:题目 设计函数求一元多项式的导数. 输入格式: 以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. 输出格式: ...

  2. 7-1 矩阵链相乘问题 (20 分)(思路+详解+题目解析) 动态规划做法

    一:题目: 输入样例: 在这里给出一组输入.例如: 5 30 35 15 5 10 20 输出样例: 在这里给出相应的输出.例如: 11875 二:基本解析 1.基本的动态规划知识: 1):求解过程是 ...

  3. 7-32 哥尼斯堡的“七桥问题” (25 分)(思路+详解+题目分析)两种做法任选其一

    一:题目: 哥尼斯堡是位于普累格河上的一座城市,它包含两个岛屿及连接它们的七座桥,如下图所示. 可否走过这样的七座桥,而且每桥只走过一次?瑞士数学家欧拉(Leonhard Euler,1707-178 ...

  4. 1089 狼人杀-简单版 (20 分)-文字详解版

    1089 狼人杀-简单版 (20 分) 题目 以下文字摘自<灵机一动·好玩的数学>:"狼人杀"游戏分为狼人.好人两大阵营.在一局"狼人杀"游戏中,1 ...

  5. 7-5 汽车加油问题 (20 分)(思路+详解)Come 宝!!!!!!!!!!!!!

    一:题目 题目来源:王晓东<算法设计与分析> 一辆汽车加满油后可行驶 n公里.旅途中有若干个加油站.设计一个有效算法,指出应 在哪些加油站停靠加油,使沿途加油次数最少. 输入格式: 第一行 ...

  6. PAT-2019年冬季考试-甲级-7-1 Good in C (20分)超详解,几招就满分通过

    本题在2021年12月之后才会解封放到免费题库里,目前需要收费. 题目: When your interviewer asks you to write "Hello World" ...

  7. 10-4 6-4 查询厂商“D“生产的PC和便携式电脑的平均价格 (10 分)思路+详解+测试用例

    前言:测试用表 贴心杰将这个测试表分享给大家 ,如果大家做题的时候发现那个点过不去,一定不要直接看别人的博客,先自己测试用例,如果思路也对 ,验证数据也对,还有错误 你再看看别人的思路!!! CREA ...

  8. 7-5 流水作业调度 (10 分)(思路+详解+johnson解析)Come Baby!!!!!!!!!!

    一:题目 n个作业{1,2,-,n}要在由2台机器M1和M2组成的流水线上完成加工.每个作业加工的顺序都是先在M1上加工,然后在M2上加工.M1和M2加工作业i所需的时间分别为ai和bi.流水作业调度 ...

  9. 7-20 表达式转换 (25 分)(代码详解+题目分析)

    一:题目 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间.请设计程序将中缀表达式转换为后缀表达式. 输入格式: 输入在一行中 ...

最新文章

  1. osi 模型 tcpip网络模型
  2. WINDOWS下调用GetTokenInformation的奇怪之处--两次调用
  3. 多线程基础(五)NSThread线程通信
  4. mybatis3:Invalid bound statement (not found)
  5. 电脑日常故障及处理(二)
  6. Vue+Openlayers+HIKVSION实现点击摄像头进行预览
  7. Apache应用实例:建立yum服务器
  8. linux离线安装pyhs2,Python 下载及安装详细步骤
  9. appweb ejs_具有快速路线的EJS
  10. 梯度的直观理解_BP反向传播算法的思考和直观理解 -卷积小白的随机世界
  11. Windows 与 Linux 通过Xshell 文件互传
  12. 在线base64加密解密工具
  13. Spring定时任务@Scheduled提前一秒执行
  14. CSDN博文写作规范文档
  15. 海湾汉字编码表全部_汉字区位码对照查询表-汉字区位码对照表大全下载pdf打印版-西西软件下载...
  16. 谷歌五笔输入法电脑版_不背字根,如何三天学会五笔输入法
  17. 重装系统大法—WePE or 老毛桃
  18. 阿里云对象存储OSS有什么功能?
  19. Android性能优化——启动优化简述
  20. 华米科技:庇佑之下,黄汪难设温柔乡

热门文章

  1. .NET Core VS Code 环境配置
  2. 2016微软开发者峰会在京举办 纳德拉要来做演讲
  3. .NET的未来包含一个开源的Mono
  4. mondrain配置mysql_mondrian 4.7 源码部署(示例代码)
  5. Eclipse之如何快速查看抽象函数实现
  6. Android插件化开发基础之Java类加载器与双亲委派模型
  7. 栈与队列之用java实现队列
  8. python 全解坦克大战 辅助类 附完整代码【雏形】
  9. python列表操作程序_Python列表操作,比较常见的10个问题
  10. 人类历史上最伟大的物理学家