题目
题目截图如下
解释的不明不白,很容易让人无法理解公式的意义
题目解释
重新解释一下这道题目
第一个公式中X+j和X-j分别表示同一个属性类中最大的和最小的
例如第一类属性的值分别为12000 8500 13000 11000,最大值和最小值就分别为13000和8500
第二个公式由于使用了排序,同类属性中第n个其实就是最大值,而同类属性中第1个就是最小值,出题人故意使用多种混淆符号,属实是水平太臭。
代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
///指标数量
int n;
cin >> n;
///指标权重
vector<double> w;
for (int i = 0; i < n; i++)
{
double tem;
cin >> tem;
w.push_back(tem);
}
///企业数量
int m;
cin >> m;
//企业所有指标
vector<vector<double>> count;
for (int i = 0; i < m; i++)
{
vector<double> tem1;
for (int j = 0; j < n; j++)
{
double tem2;
cin >> tem2;
tem1.push_back(tem2);
}
count.push_back(tem1);
}
//预处理
vector<double> difference;
vector<double> min_num;
vector<double> max_num;
for (int i = 0; i < n; i++)
{
vector<double> tem1;
for (int j = 0; j < m; j++)
{
tem1.push_back(count.at(j).at(i));
}
sort(tem1.begin(), tem1.end());
difference.push_back(tem1.at(m - 1) - tem1.at(0));
min_num.push_back(tem1.at(0));
max_num.push_back(tem1.at(m - 1));
}
//综合计算
for (int i = 0; i < m; i++)
{
vector<double> num = count.at(i);
double sum1 = 0;
double sum2 = 0;
for (int j = 0; j < n; j++)
{
double tem = 0;
if (num.at(j) > 0)
{
tem = num.at(j) / max_num.at(j);
}
else
{
tem = num.at(j) / min_num.at(j);
}
sum1 += w.at(j) * 100 * tem;
sum2 += w.at(j) * ((num.at(j) - min_num.at(j)) / difference.at(j));
}
printf_s("%.3f %.3f\n", sum1, sum2);
}
return 0;
}
不多赘述,题目没什么难度,不过出题人故意把题目出的很难看