题目
整个题目啰里啰嗦,有效信息只占了题目长度的一半不到,前面全讲的废话,出个题目还要水字数……
样例输入
3
3
3
0.2 0.3 0.5
0.7 0.2 0.1
0.1 0.2 0.7
0.3 0.6 0.1
0.2 0.3 0.5
0.3 0.6 0.1
1 0 0
0.7 0.3 0
0.2 0.3 0.5
0.1 0.4 0.5
1 0 0
0.1 0.3 0.6
样例输出
0.27 0.45 0.27
0.56 0.33 0.11
0.27 0.27 0.45
题解
读完题目可以发现,前面一长串没有什么有用信息,讲了一堆让人容易听不懂的专业名词用来吓退看题不彻底的人
题干里面唯一有用的就是那个样例和其后的样例解释,告诉我们A,R和B到底是什么
他们代表的意义可以不用理解,只需要知道他定义了一种新运算:A○R=B
而通过阅读输入输出也可以得知,他会告诉我们A矩阵,R矩阵,我们要求B矩阵
知道这些就足够了
由于每个评价对象是单独的,因此可以写一个类,用来存放他们的A,R矩阵以及运算方法,归一化的方法,甚至打印B矩阵的方法
class FuzzyEvaluation
{
public:
FuzzyEvaluation(vector<double> a, vector<vector<double>> r);
void NormalRes();
void ComputeB();
void PrintB();
private:
vector<double> m_a;
vector<vector<double>> m_r;
vector<double> m_b;
};
FuzzyEvaluation::FuzzyEvaluation(vector<double> a, vector<vector<double>> r)
:m_a(a), m_r(r)
{}
void FuzzyEvaluation::NormalRes()
{
double sum = 0;
for (double i : m_b)
{
sum += i;
}
for (int i = 0; i < m_b.size(); i++)
{
m_b[i] = m_b.at(i) / sum;
}
}
void FuzzyEvaluation::ComputeB()
{
for (int i = 0; i < m_r.at(0).size(); i++)
{
double sum = 0;
for (int j = 0; j < m_r.size(); j++)
{
sum = max(sum, min(m_a.at(j), m_r.at(j).at(i)));
}
m_b.push_back(sum);
}
NormalRes();
PrintB();
}
void FuzzyEvaluation::PrintB()
{
for (double i : m_b)
{
printf_s("%.2f ", i);
}
printf_s("\n");
}
一共只有两步,太简单了,不过多赘述
代码
#include <iostream>
#include <vector>
#include <math.h>
using namespace std;
class FuzzyEvaluation
{
public:
FuzzyEvaluation(vector<double> a, vector<vector<double>> r);
void NormalRes();
void ComputeB();
void PrintB();
private:
vector<double> m_a;
vector<vector<double>> m_r;
vector<double> m_b;
};
FuzzyEvaluation::FuzzyEvaluation(vector<double> a, vector<vector<double>> r)
:m_a(a), m_r(r)
{}
void FuzzyEvaluation::NormalRes()
{
double sum = 0;
for (double i : m_b)
{
sum += i;
}
for (int i = 0; i < m_b.size(); i++)
{
m_b[i] = m_b.at(i) / sum;
}
}
void FuzzyEvaluation::ComputeB()
{
for (int i = 0; i < m_r.at(0).size(); i++)
{
double sum = 0;
for (int j = 0; j < m_r.size(); j++)
{
sum = max(sum, min(m_a.at(j), m_r.at(j).at(i)));
}
m_b.push_back(sum);
}
NormalRes();
PrintB();
}
void FuzzyEvaluation::PrintB()
{
for (double i : m_b)
{
printf_s("%.2f ", i);
}
printf_s("\n");
}
int main()
{
int n;
int m;
int b;
cin >> n >> m >> b;
vector<FuzzyEvaluation*> x;
for (int i = 0; i < n; i++)
{
vector<double> tem1;
for (int j = 0; j < m; j++)
{
double tem2;
cin >> tem2;
tem1.push_back(tem2);
}
vector<vector<double>> tem3;
for (int j = 0; j < m; j++)
{
vector<double> tem4;
for (int k = 0; k < b; k++)
{
double tem2;
cin >> tem2;
tem4.push_back(tem2);
}
tem3.push_back(tem4);
}
FuzzyEvaluation* tem5 = new FuzzyEvaluation(tem1, tem3);
x.push_back(tem5);
}
for (auto i : x)
{
i->ComputeB();
}
return 0;
}