paranid5

Голосование

Jun 27th, 2020
217
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.70 KB | None | 0 0
  1. /*Выборы в США
  2. Как известно, в США президент выбирается не прямым голосованием, а путем двухуровневого голосования. Сначала проводятся выборы в каждом штате и определяется победитель выборов в данном штате. Затем проводятся государственные выборы: на этих выборах каждый штат имеет определенное число голосов — число выборщиков от этого штата. На практике, все выборщики от штата голосуют в соответствии с результатами голосования внутри штата, то есть на заключительной стадии выборов в голосовании участвуют штаты, имеющие различное число голосов.
  3.  
  4. На этот раз вам известно число выборщиков от каждого штата США и результаты голосования каждого гражданина США (а также в каком штате проживает данный гражданин).
  5.  
  6. Вам необходимо подвести результаты голосования: сначала определить результаты голосования в каждом штате и определить, за какого из кандидатов отданы голоса выборщиков данного штата. Далее необходимо подвести результаты голосования выборщиков по всем штатам.
  7.  
  8. Входные данные
  9.  
  10. Первая строка входных данных содержит количество штатов в США N (1≤N≤100000). Далее идет N строк, описывающих штаты США, каждая строка состоит из названия штата и числа выборщиков от этого штата. На следующей строке задано число M (0≤M≤100000)— количество проголосовавших на выборах. В следующих M строках идут записи результатов голосования по каждому из участников голосования. Одна строка соответствует одному избирателю. Записи имеют вид: название штата, имя кандидата, за которого проголосовал данный избиратель. Названия штатов и имена кандидатов не содержат пробелов.
  11.  
  12. Выходные данные
  13.  
  14. Выведите список кандидатов, упорядоченный по убыванию числа голосов выборщиков, полученных за данного кандидата, а при равенстве числа голосов выборщиков: в лексикографическом порядке. После имени кандидата выведите число набранных им голосов.
  15.  
  16. Если в каком-либо штате два или более число кандидатов набрали одинаковое число голосов, то все голоса выборщиков этого штата получает наименьший в лексикографическом порядке кандидат из числа победителей в этом штате.
  17.  
  18. Гарантируется, что в каждом штате проголосовал хотя бы один избиратель.
  19.  
  20. Примечание к примерам тестов
  21.  
  22. В Florida 2 избирателя голосует за Gore и три избирателя за Bush, поэтому 25 голосов выборщиков от Floria получает Bush. В Pennsylvania побеждает Gore (5 голосов против 1), поэтому Gore получает 23 голоса выборщиков от Pennsylvania.
  23.  
  24. В Florida побеждает Gore (5 голосов выборщиков), в Alaska — Bush (2 голоса выборщика). В Pennsylvania два кандидата набрали наибольшее число голосов (по 1), поэтому 4 голоса выборщиков от этого штата получает Clinton, т.к. он идет раньше в лексикографическом порядке.
  25.  
  26. Примеры
  27. Ввод
  28. Вывод
  29. 2
  30. Florida 25
  31. Pennsylvania 23
  32. 11
  33. Florida Gore
  34. Pennsylvania Gore
  35. Florida Bush
  36. Pennsylvania Gore
  37. Pennsylvania Bush
  38. Florida Gore
  39. Pennsylvania Gore
  40. Florida Bush
  41. Pennsylvania Gore
  42. Florida Bush
  43. Pennsylvania Gore
  44.  
  45. Bush 25
  46. Gore 23
  47.  
  48.  
  49. 3
  50. Florida 5
  51. Pennsylvania 4
  52. Alaska 3
  53. 4
  54. Florida Gore
  55. Pennsylvania Obama
  56. Pennsylvania Clinton
  57. Alaska Bush
  58.  
  59. Gore 5
  60. Clinton 4
  61. Bush 3
  62. Obama 0*/
  63.  
  64.  
  65. #include <iostream>
  66. #include <map>
  67. #include <vector>
  68. #include <algorithm>
  69.  
  70. typedef long long ll;
  71.  
  72. bool names_sort (std::pair<std::string, ll>& f, std::pair<std::string, ll>& s)
  73. {
  74.     if (f.second == s.second)
  75.         return std::lexicographical_compare
  76.         (f.first.begin(), f.first.end(),
  77.         s.first.begin(), s.first.end());
  78.     return f.second < s.second;
  79. }
  80.  
  81. int main()
  82. {
  83.     ll n = 0;
  84.     std::scanf("%lld", &n);
  85.     std::map<std::string, ll> amount; // кол-во голосующих от штатов
  86.     for (ll i = 0; i < n; i++)
  87.     {
  88.         ll voices = 0;
  89.         std::string state;
  90.         std::cin >> state;
  91.         std::scanf("%lld", &voices);
  92.         amount[state] = voices;
  93.     } // заполнили кол-вом голосов
  94.     ll m = 0;
  95.     std::scanf("%lld", &m);
  96.     std::map<std::string, std::map<std::string, ll>> voice; // голосование в штате
  97.     std::map<std::string, ll> victory; // итог (имя, число)
  98.     for (ll i = 0; i < m; i++)
  99.     {
  100.         std::string state;
  101.         std::string guy;
  102.         std::cin >> state;
  103.         std::cin >> guy;
  104.         victory[guy] = 0;
  105.         voice[state][guy]++;
  106.     } // голосование в каждом штате
  107.     std::map<std::string, std::string> guys;
  108.     // победитель в штате (штат, имя)
  109.     for (auto& it : voice) // проход по штату
  110.     {
  111.         std::pair<std::string, ll> max("", -1);
  112.         for (auto& its : it.second)
  113.         {
  114.             if (its.second > max.second)
  115.             {
  116.                 max.first = its.first;
  117.                 max.second = its.second;
  118.             }
  119.         }
  120.         guys[it.first] = max.first;
  121.     }
  122.     for (auto& guy : guys)
  123.         victory[guy.second] += amount[guy.first];
  124.     std::vector<std::pair<std::string, ll>> print (victory.size());
  125.     // сортировка по значению
  126.     std::copy(victory.begin(), victory.end(), print.begin());
  127.     std::sort(print.rbegin(), print.rend(), names_sort);
  128.     // сортировка значений и анти-сортировка имён
  129.     ll start = 0, finish = 1;
  130.     for (ll i = 0; i < print.size() - 1; i++)
  131.     {
  132.         if (print[i].second != print[i + 1].second)
  133.             start++, finish++;
  134.         else
  135.         {
  136.             while (i < print.size() - 1 && print[i].second == print[i + 1].second)
  137.                 finish++, i++;
  138.             std::reverse(print.begin() + start, print.begin() + finish);
  139.             start = finish++;
  140.         }
  141.     } // сортировка имён
  142.     for(auto& i : print)
  143.         std::printf("%s %lld\n", i.first.c_str(), i.second);
  144.     return 0;
  145. }
Add Comment
Please, Sign In to add comment