Не то, чтобы я считал соревновательное программирование полезным для улучшения навыков программирования. (По крайней мере, не навыки программирования для повседневного бизнеса.) Однако я испытал искушение и не смог устоять. (Это утро понедельника и, может быть, хорошая разминка на неделю.)
Составив идеи комментариев я получил это:
#include <cassert>
#include <iostream>
#include <vector>
#include <set>
int main()
{
// input and count frequency
int n; std::cin >> n;
assert(n >= 0 && n < 1000000);
const int valueMin = 20, valueMax = 50;
int freq[valueMax - valueMin + 1] {};
for (int i = 0; i < n; ++i) {
int value; std::cin >> value;
++freq[value - valueMin];
}
// sort frequency
std::set<std::pair<int, int>, bool(*)(const std::pair<int, int>&, const std::pair<int, int>&)>
freqSorted([](const std::pair<int, int> &pair1, const std::pair<int, int> &pair2) {
if (pair1.first != pair2.first) return pair1.first > pair2.first;
return pair1.second < pair2.second;
});
for (int i = valueMin; i <= valueMax; ++i) {
if (const int freqI = freq[i - valueMin]) {
freqSorted.insert(std::make_pair(freqI, i));
}
}
// output
for (std::pair<int, int> entry : freqSorted) {
std::cout << entry.second << ' ' << entry.first << '\n';
}
}
Примечания:
Я использую
const int valueMin = 20, valueMax = 50;
int freq[valueMax - valueMin + 1] {};
для хранения количества вхождений с минимальным объемом памяти. (Явное ограничение диапазона для входных значений меня обнадежило.)
user4581301 сделал меня чувствительным в отношении потребления памяти. (До прочтения я не осознавал, что хранение входных значений на самом деле не нужно.)
Использование std::map
(как рекомендовано Вишну Дасу) было моей первой идеей. При тестировании я задавался вопросом о пропущенных результатах, пока не понял, что map
с номером вхождения в качестве ключа будет хранить только одно из нескольких значений с одинаковой частотой.
Поэтому я изменил его на std::set
с обоими значениями в качестве ключа.
Выход:
42 3
34 2
47 2
26 1
35 1
Демонстрация в реальном времени на coliru