В еженедельном выпуске популярной газеты было объявлено голосование по выбору актёра, который, по мнению читателей, должен сняться в продолжении фильма «Белое солнце пустыни». На выбор был предложен список из шести актеров. Вам предлагается написать эффективную, в том числе по используемой памяти, программу, которая будет обрабатывать результаты sms-голосования по данному вопросу. Результаты голосования получены в виде списка актёров (каждый элемент списка соответствует одному sms-сообщению). Следует учитывать, что количество голосов в списке может быть очень велико. Перед текстом программы кратко опишите используемый Вами алгоритм решения задачи. На вход программе в первой строке подаётся количество пришедших sms-сообщений N. В каждой из последующих N строк записаны фамилия и имя актера (сначала фамилия, а потом через пробел имя). Длина строки не превосходит 50 символов. Пример входных данных:
5
Меньшиков Олег
Миронов Евгений
Меньшиков Олег
Машков Владимир
Меньшиков Олег
Программа должна вывести список всех актёров, встречающихся в списке, в порядке убывания (невозрастания) количества голосов, отданных за того или иного актёра, с указанием количества отданных за него голосов. При этом каждый актёр должен быть выведен ровно один раз вне зависимости от того, сколько голосов было отдано за него.Пример выходных данных для приведённого выше примера входных данных:
Меньшиков Олег 3
Миронов Евгений 1
Машков Владимир 1
Программа читает все входные данные один раз, не запоминая их в массиве, размер которого равен N, а составляя только список встретившихся актёров и количества голосов, отданных за каждого из них. Во время чтения данных об очередном актёре просматривается список ранее сохранённых актеров. Если он уже есть в списке, то количество голосов, отданных за него, увеличивается на 1, иначе актёр добавляется в массив упомянутых в голосовании актёров (при корректных данных размер массива не может быть больше 6). После окончания ввода производится сортировка массивов актёров и количества голосов, отданных за них, в порядке убывания количества голосов; затем выводится список актёров с указанием частоты встречаемости. Баллы начисляются только за программу, которая решает задачу хотя бы для одного частного случая. Ниже приведены примеры решения задания на языках Паскаль и Бейсик. Допускаются решения, записанные на других языках программирования. При оценивании решений на других языках программирования необходимо учитывать особенности этих языков программирования. Так, на языке C++ при считывании строковой переменной будут считаны не фамилия и имя, а только фамилия, поэтому следует использовать функцию getline(cin,s); аналогичная проблема возникает и в языке Си.
| Пример правильной и эффективной программы на языке Паскаль: | Пример правильной и эффективной программы на языке Бейсик: |
|---|---|
Var n, Num, i, j, t: integer; Count: array[1..6] of integer; s: string; Names: array[1..6] of string; Begin Num:=0; {Число различных актеров в списке голосов} ReadLn(N); {Считываем количество голосов} for i:=1 to N do begin ReadLn(S); {считали очередного актера} {Осуществляем его поиск в списке уже встретившихся} j:=1; while (j<=Num) and (s<>Names[j]) do j:=j+1; {Если он найден} if j<=Num then {Увеличиваем счетчик числа голосов, отданных за этого актера} Count[j]:=Count[j]+1 else begin {Иначе добавляем актера в конец списка} Names[j]:=s; Count[j]:=1; Num:=Num+1; end end; {Сортируем массивы Names и Count в порядке убывания значений массива Count} for i:=Num downto 2 do for j:=2 to i do if Count[j-1] < Count[j] then begin t:=Count[j]; Count[j]:=Count[j-1]; Count[j-1]:=t; s:=Names[j]; Names[j]:=Names[j-1]; Names[j-1]:=s; end; for i:=1 to Num do WriteLn(Names[i], ' ', Count[i]); end. | DIM N, Num, i, j, t AS INTEGER DIM Count(6) AS INTEGER DIM Names$(6) Num = 0 'Число различных актеров в списке голосов INPUT N 'Считываем количество голосов FOR i = 1 TO N LINE INPUT s$ 'считали актера 'Осуществляем поиск названия в списке уже встретившихся j = 1 WHILE (j <= Num) AND (s$ <> Names$(j)) j = j + 1 WEND 'Если актер найден IF j <= Num THEN 'Увеличиваем счетчик числа голосов, отданных за 'этого актера Count(j) = Count(j) + 1 ELSE ' Иначе добавляем актера в конец списка Names$(j) = s$ Count(j) = 1 Num = Num + 1 END IF NEXT i 'Сортируем массивы Names и Count в порядке убывания значений 'массива Count FOR i = Num TO 2 STEP -1 FOR j = 2 TO i IF Count(j - 1) < Count(j) THEN t = Count(j): Count(j) = Count(j - 1): Count(j - 1) = t s$ = Names$(j): Names$(j) = Names$(j - 1): Names$(j - 1) = s$ END IF NEXT j NEXT i FOR i = 1 TO Num PRINT Names$(i), Count(i) NEXT i END |

