Пример задачи с решением C4 (высокий уровень, время – 60 мин)
Пример задания: На автозаправочных станциях (АЗС) продается бензин с маркировкой 92, 95 и 98. В городе N был проведен мониторинг цены бензина на различных АЗС. Напишите эффективную по времени работы и по используемой памяти программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая будет определять для каждого вида бензина, сколько АЗС продают его дешевле всего. На вход программе в первой строке подается число данных о стоимости бензина. В каждой из последующих N строк находится информация в следующем формате: где – строка, состоящая не более, чем из 20 символов без пробелов, – строка, состоящая не более, чем из 20 символов без пробелов, – одно из чисел – 92, 95 или 98, – целое число в диапазоне от 1000 до 3000, обозначающее стоимость одного литра бензина в копейках. и, и, а также и разделены ровно одним пробелом. Пример входной строки: Синойл Цветочная Программа должна выводить через пробел 3 числа – количество АЗС, продающих дешевле всего 92-й, 95-й и 98-й бензин соответственно. Если бензин какой-то марки нигде не продавался, то следует вывести 0. Пример выходных данных:
Input.txtOutput.txt 4 Тасол Прага Лукоил Кара Марка Мира Сара Курито Пример входных данных:
Содержание верного ответа и указания по оцениванию (допускаются иные формулировки ответа, не искажающие его смысла) Программа читает все входные данные один раз, не запоминая их в массиве, размер которого соответствует числу АЗС или диапазону цен. Во время чтения данных определяются минимальная цена каждой марки бензина и количество АЗС, продающих его по этой цене. Для этого используются 6 переменных или соответствующие массивы (например, для удобства из 8 элементов каждый, см. программу на языке Бейсик). Баллы начисляются только за программу, которая решает задачу хотя бы для одного частного случая (например, когда для каждой марки бензина минимальная цена отмечена ровно на одной АЗС). Решение:
Объявление массива Var min,ans:array[92..98] of integer; с:char; i,N,k,b:integer;
Блок считывания данных (файлы input и output готовы заранее) Begin Assign(input, input.txt); Reset(input); Assign(output, output.txt); Rewrite(output); For i:=92 to 98 do begin min[i]:=3001; Ans[i]:=0; End;
Задаем и считываем данные Read(N); For i:=1 to N do begin repeat read(c); until c= ; {считана компания} repeat read(c); until c= ; {считана улица} read(k,b); {марка, стоимость}
Находим и распечатываем ответ If min[k]>=b then begin min[k]:=b; ans[k]:=1; End Else if min[k]=b then ans[k]:=ans[k]+1; End;{если бензин какой-то марки не было, ans[i] осталось равным 0} Write(ans[92],,ans[95],,ans[98]); end.