【矿大】中国矿业大学 CUMT 信息安全管理与工程2024春季学期 OpenJudge OJ 问题 C: 模糊综合评价法

题目

整个题目啰里啰嗦,有效信息只占了题目长度的一半不到,前面全讲的废话,出个题目还要水字数……

样例输入

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;
}

 

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值