CCF 201903-4 消息传递接口 100分

在这里插入图片描述

题意

有n个进程互相通信,每个进程只会两种操作发送信息和接受信息,每个进程会有一个任务队列,队列中的任务必须挨个执行,让你判断是否会死锁

思路

首先每个队列建立一个任务队列,队列使用deque
每次取出一个任务

vector<deque<pair<char, int>>> processes;//全部进程的任务队列

建立两个map当有暂时不能匹配的接受信息和发送信息时存入map

unordered_map<int, int> rec, send;//键为自身进程,值为目标进程

维护一个任务栈首先初始化将n个任务压入,然后在循环中依次取出直到栈空结束循环,每当匹配成功时将匹配成功的两个进程压入栈(这种方法可以处理超出题目限制的8条以上的任务)

deque<int> taskque;
for (int i = 0; i < n; ++i)taskque.push_back(i);//初始化,把0到n-1条进程压入栈

结果判断,当rec和send全部为空时无死锁

代码



#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
#include <vector>
#include <deque>
#include <unordered_map>
using namespace std;
int t, n;
vector<deque<pair<char, int>>> processes;//全部进程的任务队列
void execute() {
	unordered_map<int, int> rec, send;//键为自身进程,值为目标进程
	deque<int> taskque;
	for (int i = 0; i < n; ++i)taskque.push_back(i);//初始化,把0到n-1条进程压入栈
	while (!taskque.empty()) {
		int cur = taskque.front();
		taskque.pop_front();
		if (processes[cur].empty())continue;//进程内无任务跳过
		int num = processes[cur].front().second;
		if (processes[cur].front().first == 'S') {
			auto rp = rec.find(num);
			if (!rec.empty() && rp != rec.end() && rp->second == cur) {//如果目标进程正等待本进程的发送数据
				processes[num].pop_front();
				processes[cur].pop_front();//将自身进程和目标进程弹出一个任务
				taskque.push_front(num);
				taskque.push_front(cur);//将自身进程和目标进程压入栈
				rec.erase(num);
			}
			else 
				send.insert({ cur,num });
		}
		else {
			auto sp = send.find(num);
			if (!send.empty() && sp != send.end() && sp->second == cur) {
				processes[num].pop_front();
				processes[cur].pop_front();
				taskque.push_front(num);
				taskque.push_front(cur);
				send.erase(num);
			}
			else
				rec.insert({ cur,num });
		}
	}
	if (rec.empty() && send.empty())cout << '0' << endl;
	else cout << '1' << endl;
}



//#define DEBUG
int main()
{
#ifdef DEBUG
	fstream cin("input.txt");
#endif // DEBUG
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cin >> t >> n;
	cin.get();
	for (; t != 0; --t) {
		processes.resize(n);
		for (int i = 0; i < n; ++i) {
			stringstream strs;
			string temp;
			getline(cin, temp);
			strs << temp;
			int num; char c;
			while (strs >> c >> num)
				processes[i].push_back({ c,num });
		}
		execute();
		processes.clear();
	}
}

看完觉得还可以记得点个赞啊

测试数据

//官方数据
2 3
R1 S1
R2 S0 R0 S2
S1 R1
R1
R2 S0 R0
S1 R1

//自己设的数据
1 5
S1 S1 S1 S1 R4 R4 R4 R4
R0 R0 R0 R0 S2 S2 S2 S2
R1 R1 R1 R1 S3 S3 S3 S3
R2 R2 R2 R2 S4 S4 S4 S4
R3 R3 R3 R3 S0 S0 S0 S0
//结果为0


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用是一段C++代码,用来解析CCF201612-2工资计算问题。这段代码通过计算各种收入范围和税率,然后根据输入的税前工资来计算出税后工资。具体步骤如下: 1. 首先定义了salaryrange数组存储各个收入范围,taxrate数组存储各个税率,以及range数组用来计算各种收入范围。 2. 通过循环计算range数组的值,range[i表示税前工资在salaryrange[i范围内的税后工资。 3. 输入税前工资t后,通过循环找到税前工资所在的收入范围i。 4. 如果i=0,表示税前工资在最低收入范围内,税后工资直接等于税前工资。 5. 如果i不等于0,表示税前工资在其他收入范围内,通过公式s = salaryrange[i-1 + (t - range[i-1]) * 100 / (100 - taxrate[i-1])计算税后工资。 6. 最后输出税后工资s。 根据这段代码的解析,可以计算出CCF201612-2工资计算问题的答案。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [CCF201612-2 工资计算(100)](https://blog.csdn.net/tigerisland45/article/details/54799557)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [CCF201612-2 工资计算](https://blog.csdn.net/qq_40670344/article/details/97441803)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值