Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
24
Добавлен:
19.05.2015
Размер:
719.36 Кб
Скачать

Var Info: array[1..Max] of tInfo;

Перед началом работы в поле zadacha каждой структуры нужно записать ее порядковый номер, а в поле count – нуль (обнулить счетчик):

for i:=1 to MAX do begin

Info[i].zadacha := i;

Info[i].count := 0;

end;

Теперь читаем исходные данные: сначала общее количество запросов N, а потом N чисел (номеров задач), после чтения очередного номера задачи увеличиваем соответствующй счетчик:

readln(N);

for i:=1 to N do begin

readln(zNo);

Info[zNo].count := Info[zNo].count + 1;

end;

После этого массив записей сортируется по возрастанию поля count (здесь применен метод пузырька «наоборот» - за каждый проход самый тяжелый элемент едет вниз):

for i:=1 to MAX do

for j:=1 to MAX-i do

if Info[j].count > Info[j+1].count then begin

temp := Info[j];

Info[j] := Info[j+1];

Info[j+1] := temp;

end;

Здесь чувствуется выгода от использования структур: иначе пришлось бы вводить два массива (номера задач и счетчики запросов) и в цикле переставлять одновременно два массива (см. решение задачи 25). Обратите внимание, что в циклах нужно использовать размер массива MAX, а не N!

Осталось вывести результат, не забывая проверить на равенство счетчика нулю (задачи, которых нет в запросах, выводить не нужно):

for i:=1 to MAX do

if Info[i].count > 0 then

writeln(Info[i].zadacha, ' ', Info[i].count);

Полная программа для решения этой задачи:

program qq;

const MAX = 12;

type TInfo = record

zadacha: integer;

count: integer;

end;

Var Info: array[1..Max] of tInfo;

I, j, n, zNo: integer;

temp: TInfo;

begin

{ начальные установки }

for i:=1 to MAX do begin

Info[i].zadacha := i;

Info[i].count := 0;

end;

{ ввод данных }

readln(N);

for i:=1 to N do begin

readln(zNo);

Info[zNo].count := Info[zNo].count + 1;

end;

{ сортировка }

for i:=1 to MAX do

for j:=1 to MAX-i do

if Info[j].count > Info[j+1].count then begin

temp := Info[j];

Info[j] := Info[j+1];

Info[j+1] := temp;

end;

{ вывод результата }

for i:=1 to MAX do

if Info[i].count > 0 then

writeln(Info[i].zadacha, ' ', Info[i].count);

end.

Теперь посмотрим, как можно было решить задачу без записей, используя массивы. например, в решении, предложенном Е.Н. Смирновой (г. Брянск) используется только один массив счетчиков:

Var count: array[1..Max] of integer;

который сначала заполняется нулями:

for i:=1 to MAX do count[i] := 0;

При этом ввод данных с увеличением счетчиков выглядит так:

readln(N);

for i:=1 to N do begin

readln(zNo);

сount[zNo] := count[zNo] + 1;

end;

Остается решить проблему вывода результата. Заметим, что данные неотсортированы, если просто отсортировать массив счетчиков по неубыванию, то будет потеряна информация о номерах задач. Поэтому предлагается такой алгоритм, учитывающий, что значение счетчика уже не нужно после того, как оно выведено на экран:

  1. ищем минимальный по величине ненулевой счетчик с номером nMin

  2. выводим соответствующий номер задачи (nMin) и значение счетчика (count[nMin])

  3. обнуляем count[nMin], чтобы не учитывать его при следующем проходе

  4. При выполнении шага 1 сначала находим первый ненулевой элемент в массиве count и записываем его номер в переменную nMin:

nMin := 1;

while (count[nMin]=0) and (nMin < MAX) do

nMin := nMin+1;

Если такого элемента нет, будет выполняться условие count[nMin]=0, это значит, что все результаты выведены. При этом можно досрочно выйти из цикла с помощью оператора break:

if count[nMin] = 0 then break;

Иначе (если найден ненулевой счетчик), мы ищем далее по массиву минимальный ненулевой элемент:

for j:=nMin to max do

if (count[j]<>0) and (count[j]<count[nMin])

then nMin:=j;

выводим на экран его номер (номер задачи) и значение (количество запросов по этой задаче) и обнуляем этот счетчик:

writeln (nMin, ' ', count[nMin]);

count[nMin] := 0;

Вот полная программа:

program qq;

const MAX = 12;

Соседние файлы в папке ЕГЗ_2012_Поляков_май