题目
样例输入
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;
}