【矿大】中国矿业大学 CUMT 信息安全管理与工程2024春季学期 OpenJudge OJ 问题 K: 基于故障树、威胁值的信息安全风险评估算法

题目

样例输入

6
0.18 0.18 0.19 0.20 0.17 0.21
0.22 0.18 0.19 0.18 0.20 0.23
0.28 0.28 0.32 0.30 0.29 0.30
0.52 0.51 0.50 0.54 0.53 0.50
0.06 0.26 0.20 0.26 0.14 0.10
0.30 0.33 0.23 0.31 0.30 0.25
0.200 0.178 0.284 0.270 0.224 0.286
0.223 0.317 0.358 0.300 0.585 0.213
0.207 0.214 0.175 0.180 0.221 0.200
0.258 0.259 0.274 0.248 0.249 0.322
0.800 0.212 0.720 0.238 0.343 0.460
0.228 0.194 0.261 0.212 0.153 0.113
1 1 1 1 1 1.2

样例输出

0.313 0.287 0.403 0.395 0.259 0.489 0.387
0.279 0.333 0.416 0.389 0.297 0.457 0.384
0.470 0.397 0.389 0.403 0.777 0.429 0.432
0.470 0.316 0.375 0.394 0.334 0.469 0.413
0.331 0.684 0.445 0.388 0.259 0.328 0.440
0.523 0.286 0.417 0.474 0.248 0.202 0.391

题解

这题题目解释的不是很清楚,但是经过简单判断也能解答

一开始给出的顶事件计算公式只用了一步完成的计算,在下面的举例中用了两步,所以可能会对判断产生干扰,实际上这题太简单了

把两个输入矩阵的对应位置上的数值相乘,就可以得到少了顶事件的风险决策矩阵的转置矩阵,接着求它的转置矩阵并顺便计算顶事件就得到了风险决策矩阵

归一化那里可能没有解释清楚,不过公式也写的明白了,他所说的所有数据,实际上是每一列的所有数据,这样这题就一清二楚了

代码

#include <iostream>
#include <vector>

using namespace std;

int main()
{
	vector<vector<double>> dy_threat;
	vector<vector<double>> fragile;
	vector<double> w;
	int n;
	cin >> n;
	for (int i = 0; i < 6; i++)
	{
		vector<double> tem1;
		for (int j = 0; j < n; j++)
		{
			double tem2;
			cin >> tem2;
			tem1.push_back(tem2);
		}
		dy_threat.push_back(tem1);
	}
	for (int i = 0; i < 6; i++)
	{
		vector<double> tem1;
		for (int j = 0; j < n; j++)
		{
			double tem2;
			cin >> tem2;
			tem1.push_back(tem2);
		}
		fragile.push_back(tem1);
	}
	for (int i = 0; i < 6; i++)
	{
		double tem;
		cin >> tem;
		w.push_back(tem);
	}

	//风险决策矩阵的转置
	vector<vector<double>> mat_1;
	for (int i = 0; i < 6; i++)
	{
		vector<double> tem1;
		for (int j = 0; j < n; j++)
		{
			tem1.push_back(dy_threat.at(i).at(j) * fragile.at(i).at(j) * w.at(i));
		}
		mat_1.push_back(tem1);
	}
	//求真正的风险决策矩阵
	vector<vector<double>> mat;
	for (int i = 0; i < n; i++)
	{
		vector<double> tem;
		for (int j = 0; j < 6; j++)
		{
			tem.push_back(mat_1.at(j).at(i));
		}
		tem.push_back(tem.at(0) + tem.at(1) + tem.at(2) * tem.at(4) + tem.at(3) + tem.at(5));
		mat.push_back(tem);
	}

	//归一化
	
	for (int i = 0; i < 7; i++)
	{
		double sum = 0.0;
		for (int j = 0; j < n; j++)
		{
			sum += pow(mat.at(j).at(i), 2);
		}
		sum = pow(sum, 0.5);
		for (int j = 0; j < n; j++)
		{
			mat[j][i] = mat.at(j).at(i) / sum;
		}
	}
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < 7; j++)
		{
			printf_s("%.3f ", mat.at(i).at(j));
		}
		printf_s("\n");
	}
	return 0;
}

  • 25
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值