C/C++

Решение задачи на C++.

Если разбить большой набор данных на части, всегда ли среднее средних, медиана медиан,

мода мод частей будут совпадать со средним, медианой, модой всего набора в целом? Нет, и

это открывает широчайшие возможности по манипуляциям со статистикой, о которых

необходимо помнить, когда статистика используется в качестве аргумента (при правильном

использовании статистика, конечно, может быть очень серьёзным и весомым аргументом).

Проиллюстрируем этот эффект.

Формат ввода

На первой строке вводится нечётное число 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
#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';
}
А*
Аристарх ***
53 007
Лучший ответ
Рустем Хаирулин Спасибо большое, работает прекрасно