Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/25: Рейтинг темы: голосов - 25, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 17.08.2021
Сообщений: 3

Подвести результаты голосования

19.08.2021, 21:00. Показов 5424. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
На Сириусе есть такая задача:

Как известно, в США президент выбирается не прямым голосованием, а путём двухуровневого голосования. Сначала проводятся выборы в каждом штате, и определяется победитель выборов в данном штате. Затем проводятся государственные выборы: на этих выборах каждый штат имеет определённое число голосов — число выборщиков от этого штата. На практике все выборщики от штата голосуют в соответствии с результатами голосования внутри штата, то есть на заключительной стадии выборов в голосовании участвуют штаты, имеющие различное число голосов.

На этот раз вам известно число выборщиков от каждого штата США и результаты голосования каждого гражданина США (а также в каком штате проживает данный гражданин).

Вам необходимо подвести результаты голосования: сначала определить результаты голосования в каждом штате и определить, за кого из кандидатов отданы голоса выборщиков данного штата. Далее необходимо подвести результаты голосования выборщиков по всем штатам.

Входные данные

Первая строка входных данных содержит количество штатов в США N (1≤N≤100000). Далее идёт N строк, описывающих штаты США, каждая строка состоит из названия штата и числа выборщиков от этого штата. На следующей строке задано число M (1≤M≤100000)— количество проголосовавших на выборах. В следующих M строках идут записи результатов голосования по каждому из участников голосования. Одна строка соответствует одному избирателю. Записи имеют следующий вид: название штата, имя кандидата, за которого проголосовал данный избиратель. Названия штатов и имена кандидатов не содержат пробелов.

Выходные данные

Выведите список кандидатов, упорядоченный по убыванию числа голосов выборщиков, полученных за данного кандидата, а при равенстве числа голосов выборщиков — в лексикографическом порядке. После имени кандидата выведите число набранных им голосов.

Если в каком-либо штате два или более кандидатов набрали одинаковое число голосов, то все голоса выборщиков этого штата получает наименьший в лексикографическом порядке кандидат из числа победителей в этом штате.

Гарантируется, что в каждом штате проголосовал хотя бы один избиратель.

Ввод:
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

Вывод:
Bush 25
Gore 23

Ввод:
3
Florida 5
Pennsylvania 4
Alaska 3
4
Florida Gore
Pennsylvania Obama
Pennsylvania Clinton
Alaska Bush

Вывод:
Gore 5
Clinton 4
Bush 3
Obama 0


Я решил эту задачу вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <iostream>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <algorithm>
 
using namespace std;
 
int main( void )
{
  map<string, int64_t> state_num;
  map<string, map<string, int>>  state_name_num;
  map<string, int64_t> global_name_num;
  map<int64_t, vector<string>> reversed_gnn;
 
  set<string> all_names;
  vector<int64_t> keys;
 
  string state, name;
 
  int64_t num, tmp;
 
  cin >> tmp;
  while ( tmp-- > 0 )
  {
    cin >> state >> num;
 
    state_num[state] = num;
  }
  
  cin >> tmp;
 
  while (tmp-- > 0)
  {
    cin >> state >> name;
 
    state_name_num[state][name] += 1;
    all_names.insert(name);
  }
 
  for (auto name: all_names)
    global_name_num[name] = 0;
 
  for (auto it = state_name_num.begin(); it != state_name_num.end(); it++)
  {
    string vic_name = "";
    int64_t x = max_element(it->second.begin(), it->second.end(),
      [](const pair<string, int> &p1, const pair<string, int> &p2) 
      {
          return p1.second < p2.second; 
      })->second;
 
    for (auto it2 = it->second.begin(); it2 != it->second.end(); it2++)
      if (it2->second == x)
        if (vic_name == "")
          vic_name = it2->first;
        else
          vic_name = min(it2->first, vic_name);
    global_name_num[vic_name] += state_num[it->first];
  }
 
  for (auto it = global_name_num.begin(); it != global_name_num.end(); it++)
  {
    reversed_gnn[it->second].push_back(it->first);
    keys.push_back(it->second);
  }
 
  sort(keys.begin(), keys.end());
 
  for (auto it = keys.rbegin(); it != keys.rend(); it++)
  {
    sort(reversed_gnn[*it].begin(), reversed_gnn[*it].end());
 
    for (auto name: reversed_gnn[*it])
      cout << name << " " << *it << endl;
  }
}
Но в моем решении есть какая-то ошибка. Помогите пожалуйста.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.08.2021, 21:00
Ответы с готовыми решениями:

В массиве фиксируются результаты голосования кафедры
В массиве фиксируются результаты голосования кафедры, состоящего из 15 сотрудников по принципу: «1» – за, «0» – против, «-1» – воздержался,...

Вывести результаты голосования совета факультета в процентах
В массиве фиксируются результаты голосования совета факультета, состоящего из 30 сотрудников по принципу: 0 – бюллетень не роздан, 1 – за,...

Подвести результаты голосования
Как известно, в США президент выбирается не прямым голосованием, а путем двухуровневого голосования. Сначала проводятся выборы в каждом...

4
1 / 1 / 0
Регистрация: 17.08.2021
Сообщений: 3
20.08.2021, 11:06  [ТС]
Я обнаружил ошибку: если 2 кандидата набирают одинаковое кол-во баллов, то каждый из них выводится несколько раз.

Исправленный код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <iostream>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <algorithm>
 
using namespace std;
 
int main( void )
{
  map<string, int64_t> state_num;
  map<string, map<string, int>>  state_name_num;
  map<string, int64_t> global_name_num;
  map<int64_t, set<string>> reversed_gnn;
 
  set<string> all_names;
  set<int64_t> keys;
 
  string state, name;
 
  int64_t num, tmp;
 
  cin >> tmp;
  while ( tmp-- > 0 )
  {
    cin >> state >> num;
 
    state_num[state] = num;
  }
  
  cin >> tmp;
 
  while (tmp-- > 0)
  {
    cin >> state >> name;
 
    state_name_num[state][name] += 1;
    all_names.insert(name);
  }
 
  for (auto name: all_names)
    global_name_num[name] = 0;
 
  for (auto it = state_name_num.begin(); it != state_name_num.end(); it++)
  {
    string vic_name = "";
    int64_t x = max_element(it->second.begin(), it->second.end(),
      [](const pair<string, int> &p1, const pair<string, int> &p2) 
      {
          return p1.second < p2.second; 
      })->second;
 
    for (auto it2 = it->second.begin(); it2 != it->second.end(); it2++)
      if (it2->second == x)
        if (vic_name == "")
          vic_name = it2->first;
        else
          vic_name = min(it2->first, vic_name);
    global_name_num[vic_name] += state_num[it->first];
  }
 
  for (auto it = global_name_num.begin(); it != global_name_num.end(); it++)
  {
    reversed_gnn[it->second].insert(it->first);
    keys.insert(it->second);
  }
 
  for (auto it = keys.rbegin(); it != keys.rend(); it++)
    for (auto name: reversed_gnn[*it])
      cout << name << " " << *it << endl;
}
1
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
20.08.2021, 11:57
Цитата Сообщение от Kerblif Посмотреть сообщение
Я решил эту задачу вот так:
Уж больно напоминает плохо стыренные мой.
Выборы в США

Похоже на какой то троллинг....
0
1 / 1 / 0
Регистрация: 17.08.2021
Сообщений: 3
22.08.2021, 10:01  [ТС]
Тебе это кажется. Это решение тупое и прямолинейное. Никаких алгоритмов ложных при обработке не применялось.

Я просто подумал, что бы я сделал руками, на бумаге и перенес это в код.
0
0 / 0 / 0
Регистрация: 20.10.2020
Сообщений: 3
03.10.2023, 20:36
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <string>
#include <map>
using namespace std;
 
int main() {
    int n, i, x = 0, ans = 0;
    string z, q;
    map <string, int> d;
    map <string, int>::iterator it;
    while (cin >> z) {
        cin >> x;
        d[z] += x;
    }
    for (auto it : d)
        cout << it.first << " " << it.second << endl;
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.10.2023, 20:36
Помогаю со студенческими работами здесь

Отобразить результаты голосования сразу после голосования
Почему после нажатия кнопки, отображается результат голосования по нулям, а при повторном нажатии пустом показивает правельные результаты?...

Вывести результаты голосования
Имеется список результатов голосования избирателей за несколько партий (не более 100 партий), в виде списка названий данных партий. На вход...

Обнуляются результаты голосования
Такое дело: На одном из сайтов попросили меня сделать фотоконкурс с голосованием. Я сделал и все работало нормально какое то время, но...

Перевод с Pascal в C# (результаты голосования)
Помогите перевести код на c# var i, j, s: integer; a: array of integer; p: array of real; m: array of string; // для...

Опрос на сайте: как подсчитать результаты голосования
Допустим, на сайте есть опрос, состоящий из 6 вариантов... данные опрошенных, отправляются на удаленный компьютер владельца.. а результаты...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru