Если разбить большой набор данных на части, всегда ли среднее средних, медиана медиан,
мода мод частей будут совпадать со средним, медианой, модой всего набора в целом? Нет, и
это открывает широчайшие возможности по манипуляциям со статистикой, о которых
необходимо помнить, когда статистика используется в качестве аргумента (при правильном
использовании статистика, конечно, может быть очень серьёзным и весомым аргументом).
Проиллюстрируем этот эффект.
Формат ввода
На первой строке вводится нечётное число N — количество наборов чисел.
Далее следует N наборов, каждый из которых состоит из нечётного количества целых чисел и
записывается одной строчкой, через пробел.
Формат вывода
Выводятся:
• медиана каждого набора,
• мода каждого набора,
• медиана медиан,
• мода мод,
• медиана чисел из всех наборов, взятых вместе,
• мода чисел из всех наборов, взятых вместе.
Гарантируется, что все моды определяются единственным образом.
Пример
Ввод
3
2 2 2 2 8
2 2 2 2 9
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
Вывод
2 2 4
2 2 4
2
2
4
4
C/C++
Решение задачи на C++.
#include <algorithm>
#include <iostream>
#include <vector>
#include <sstream>
#include <map>
using namespace std;
int main() {
size_t n;
cin >> n;
cin.ignore(numeric_limits<streamsize>::max(), '\n');
vector<vector<int>> box(n);
for (auto& suit : box) {
string line;
getline(cin, line);
istringstream iss(line);
int value;
while (iss >> value) suit.push_back(value);
sort(suit.begin(), suit.end());
}
vector<int> med;
for (const auto& suit : box) med.push_back(suit[suit.size() >> 1]);
vector<int> mod;
auto comp = [](const pair<int, size_t>& x, const pair<int, size_t>& y) {
return x.second < y.second;
};
for (const auto& suit : box) {
map<int, size_t> tmp;
for (auto value : suit) ++tmp[value];
auto pos = max_element(tmp.begin(), tmp.end(), comp);
mod.push_back(pos->first);
}
auto med_med = med[med.size() >> 1];
map<int, size_t> tmp;
for (auto value : mod) ++tmp[value];
auto pos = max_element(tmp.begin(), tmp.end(), comp);
auto mod_mod = pos->first;
vector<int> all;
for (const auto& suit : box) {
for (auto value : suit) {
all.push_back(value);
}
}
sort(all.begin(), all.end());
auto all_med = all[all.size() >> 1];
tmp.clear();
for (auto value : all) ++tmp[value];
pos = max_element(tmp.begin(), tmp.end(), comp);
auto all_mod = pos->first;
for (auto val : med) cout << val << ' ';
puts("");
for (auto val : mod) cout << val << ' ';
puts("");
cout << med_med << '\n';
cout << mod_mod << '\n';
cout << all_med << '\n';
cout << all_mod << '\n';
}
#include <iostream>
#include <vector>
#include <sstream>
#include <map>
using namespace std;
int main() {
size_t n;
cin >> n;
cin.ignore(numeric_limits<streamsize>::max(), '\n');
vector<vector<int>> box(n);
for (auto& suit : box) {
string line;
getline(cin, line);
istringstream iss(line);
int value;
while (iss >> value) suit.push_back(value);
sort(suit.begin(), suit.end());
}
vector<int> med;
for (const auto& suit : box) med.push_back(suit[suit.size() >> 1]);
vector<int> mod;
auto comp = [](const pair<int, size_t>& x, const pair<int, size_t>& y) {
return x.second < y.second;
};
for (const auto& suit : box) {
map<int, size_t> tmp;
for (auto value : suit) ++tmp[value];
auto pos = max_element(tmp.begin(), tmp.end(), comp);
mod.push_back(pos->first);
}
auto med_med = med[med.size() >> 1];
map<int, size_t> tmp;
for (auto value : mod) ++tmp[value];
auto pos = max_element(tmp.begin(), tmp.end(), comp);
auto mod_mod = pos->first;
vector<int> all;
for (const auto& suit : box) {
for (auto value : suit) {
all.push_back(value);
}
}
sort(all.begin(), all.end());
auto all_med = all[all.size() >> 1];
tmp.clear();
for (auto value : all) ++tmp[value];
pos = max_element(tmp.begin(), tmp.end(), comp);
auto all_mod = pos->first;
for (auto val : med) cout << val << ' ';
puts("");
for (auto val : mod) cout << val << ' ';
puts("");
cout << med_med << '\n';
cout << mod_mod << '\n';
cout << all_med << '\n';
cout << all_mod << '\n';
}
Рустем Хаирулин
Спасибо большое, работает прекрасно