Олимпиадная задача, непонятная работа компилятора. Выборы в США
Решил задачу, прошёл данные в условии тесты, но когда отправляю задачу на проверку не проходятся даже данные в условии тесты. Если же просто скопипастить и вывести правильный ответ из первого теста в условии, то первый тест пройдёт.
ВЫБОРЫ В США (Название задачи)
Ссылка на информатикс: https://informatics.mccme.ru/mod/statements/view3.php?id=25861&chapterid=3770#1
Условие: Как известно, в США президент выбирается не прямым голосованием, а путём двухуровневого голосования. Сначала проводятся выборы в каждом штате, и определяется победитель выборов в данном штате. Затем проводятся государственные выборы: на этих выборах каждый штат имеет определённое число голосов — число выборщиков от этого штата. На практике все выборщики от штата голосуют в соответствии с результатами голосования внутри штата, то есть на заключительной стадии выборов в голосовании участвуют штаты, имеющие различное число голосов.
На этот раз вам известно число выборщиков от каждого штата США и результаты голосования каждого гражданина США (а также в каком штате проживает данный гражданин).
Вам необходимо подвести результаты голосования: сначала определить результаты голосования в каждом штате и определить, за кого из кандидатов отданы голоса выборщиков данного штата. Далее необходимо подвести результаты голосования выборщиков по всем штатам.
Входные данные: Первая строка входных данных содержит количество штатов в США N (1≤N≤100000). Далее идёт N строк, описывающих штаты США, каждая строка состоит из названия штата и числа выборщиков от этого штата. На следующей строке задано число M (1≤M≤100000)— количество проголосовавших на выборах. В следующих M строках идут записи результатов голосования по каждому из участников голосования. Одна строка соответствует одному избирателю. Записи имеют следующий вид: название штата, имя кандидата, за которого проголосовал данный избиратель. Названия штатов и имена кандидатов не содержат пробелов.
Выходные данные: Выведите список кандидатов, упорядоченный по убыванию числа голосов выборщиков, полученных за данного кандидата, а при равенстве числа голосов выборщиков — в лексикографическом порядке. После имени кандидата выведите число набранных им голосов.
Если в каком-либо штате два или более кандидатов набрали одинаковое число голосов, то все голоса выборщиков этого штата получает наименьший в лексикографическом порядке кандидат из числа победителей в этом штате.
Гарантируется, что в каждом штате проголосовал хотя бы один избиратель.
Тесты:
ВВОД1:
2
Florida 25
Pennsylvania 23
11
Florida Gore
Pennsylvania Gore
Florida Bush
Pennsylvania Gore
Pennsylvania Bush
Florida Gore
Pennsylvania Gore
Florida Bush
Pennsylvania Gore
Florida Bush
Pennsylvania Gore
ВЫВОД1:
Bush 25
Gore 23
ВВОД2:
3
Florida 5
Pennsylvania 4
Alaska 3
4
Florida Gore
Pennsylvania Obama
Pennsylvania Clinton
Alaska Bush
ВЫВОД2:
Gore 5
Clinton 4
Bush 3
Obama 0
Примечание к тестам: В Florida 2 избирателя голосует за Gore и три избирателя за Bush, поэтому 25 голосов выборщиков от Florida получает Bush. В Pennsylvania побеждает Gore (5 голосов против 1), поэтому Gore получает 23 голоса выборщиков от Pennsylvania.
В Florida побеждает Gore (5 голосов выборщиков), в Alaska — Bush (2 голоса выборщиков). В Pennsylvania два кандидата набрали наибольшее число голосов (по 1), поэтому 4 голоса выборщиков от этого штата получает Clinton, т.к. он идет раньше в лексикографическом порядке.
МОЁ РЕШЕНИЕ (Можете протестировать на приведённых выше тестах и убедиться, что выводится правильный ответ)
#include <iostream>
#include <map>
#include <vector>
#include <string>
#include <set>
#include <algorithm>
#include <utility>
#include <iterator>
using namespace std;
int main(){
map <pair<string,string>, int> e; // e[make_pair("Florida", "Gore")] = 2;
map <string, int> states; // states["Florida"] = 25;
int n,m,p; // n - 2; m - 11; p - 25, 23;
string state,guy;
vector <pair<int,string>> s; // s[0] = 25, "Bush"; Массив для ответа
pair <string,string> w; // {"Florida", "Gore"}; w - от слова winner;
set <string> people; // Gore, Bush; Здесь будут люди получившие 0 голосов, постепенно этот сет будет уменьшаться по мере получения голосов кандидатами
cin >> n;
for (int i = 0; i < n; ++i){
cin >> state >> p;
states[state] = p;
}
cin >> m;
for (int i = 0; i < m; ++i){
cin >> state >> guy;
++e[make_pair(state, guy)];
people.insert(guy);
}
for (auto it = e.begin(); it != e.end(); ++it){
w = it->first; // по умолчанию
auto it2 = it; // для проверки следующего элемента и сравнения его с предыдущим
++it2;
while ((it2 != e.end()) && ((it->first).first == (it2->first).first)){ // пока в словаре встречаются голоса, отданные В ОДНОМ И ТОМ ЖЕ штате то есть я собираю все голоса из одного штата и сравниваю их попарно поддерживая макс
if (it->second < it2->second){ // При равенстве ничего делать не нужно тк словарь уже отсортирован лексикографически
w = it2->first; // новый победитель в данном штате
}
++it; // Новая пара
++it2; // Новая пара
}
s.push_back(make_pair(states[w.first], w.second)); // 25, "Bush"
}
sort(begin(s), end(s)); reverse(begin(s), end(s)); // Сортируем по убыванию
for (int i = 0; i < (int) s.size(); ++i){
people.erase(s[i].second); // Если данный человек есть в массиве s то у него положительное колво голосов
if (i != (int) s.size() - 1){
cout << s[i].second << " " << s[i].first << endl;
} else {cout << s[i].second << " " << s[i].first;}
}
if (people.size() > 0){ // Теперь здесь остались кандидаты которые не получили ни одного голоса
cout << endl;
for (auto i : people){
cout << i << " " << 0 << endl;
}
}
//cout << "Bush" << " " << 25 << endl; // Если вывести это, то первый тест проходит
//cout << "Gore" << " " << 23;
return 0;
}
Комментарии основаны на 1 тесте.