На автозаправочных станциях (АЗС) продается бензин с маркировкой 92, 95 и 98. В городе N был проведен мониторинг цены бензина на различных АЗС.
Напишите эффективную, в том числе и по используемой памяти, программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая будет определять для бензина с маркировкой 92, на какой АЗС его продают по второй по минимальности цене (считается, что самой низкой цене потребители не доверяют), а если таких АЗС несколько, то выдается только количество таких АЗС. Если все АЗС, у которых 92-й бензин есть, продают его по одной и той же цене, то эта цена считается искомой и выдается либо число таких АЗС, когда их несколько, либо конкретная АЗС, если она одна. Гарантируется, что хотя бы одна АЗС 92-й бензин продает.
На вход программе сначала подается число данных о стоимости бензина N. В каждой из сле¬дующих N строк находится информация в следующем формате:
<Компания> <Улица> <Марка> <Цена>
где <Компания> — строка, состоящая не более чем из 20 символов без пробелов,
<Улица> — строка, состоящая не более чем из 20 символов без пробелов,
<Марка> — одно из чисел — 92, 95 или 98,
<Цена> — целое число в диапазоне от 1000 до 3000, обозначающее стоимость одного литра бензина в копейках.
<Компания> и <Улица>, <Улица> и <Марка>, а также <Марка> и <цена> разделены ровно одним пробелом.
Пример входной строки:
СуперБенз Цветочная 92 1950
Программа должна выводить через пробел Компанию и Улицу искомой АЗС или их количество, если искомых вариантов несколько.
Пример выходных данных:
Бензинчик Перспективная
Второй вариант выходных данных:
4
Программа читает все входные данные один раз, не запоминая их в массиве, размер которого соответствует числу входных данных N или максимальной цене (3000). Во время чтения данных определяются две минимальных цены и количество АЗС, продающих по 92-й бензин по этим ценам. При печати результата проверяется, что у кого-то цена больше минимальной (вторая по минимальности цена существует), в этом случае искомая (искомые) АЗС — со второй по величине ценой, если это не так, то искомая (искомые) АЗС — все, продающие 92-й бензин. Баллы начисляются только за программу, которая решает задачу хотя бы для одного частного случая (например, когда все АЗС продают бен¬зин по различной цене, и 92-й бензин продают не менее двух АЗС).
Пример правильной и эффективной программы на языке Паскаль:
var c: char;
i, k, N, b, mini, min2, cntl, cnt2: integer;
s,si,s2: string;
begin
mini:=3001;
cntl:=0;
readln(N);
for i:=l to N do
begin
read(c) ;
si := ' ' ;
repeat
s:=s+c;
read(c);
until c=' '; {считана компания}
repeat
s:=s+c;
read(c) ;
until c=' '; {улица добавлена к компании}
readln(k,b);
if k = 92 then
if mini > b then
begin
min2:=minl;
cnt2:=cntl;
s2:=sl;
minl:=b;
cntl:=l;
sl:=s
end else
if mini = b then cntl:=cntl+l else
if min2 > b then
begin
min2:=b; cnt2:=l; s2:=s
end else
if min2 = b then cnt2:=cnt2+l
end;
if cnt2>0 then
if cnt2=l then
writeln(s2) else writeln(cnt2)
else {все АЗС продают 92-й бензин по одной цене}
if cntl=l then writeln(sl) else writeln(cntl) ;
writeln;
end.
Пример правильной программы на языке Бейсик:
DIM s AS STRING
DIM si AS STRING, s2 AS STRING
mini = 3001
cntl = 0
INPUT n
FOR j = 1 TO n
LINE INPUT s
i = 0
DO
i = i + 1
c$ - MID$(s, i, 1)
LOOP WHILE c$ <> " "
DO
i = i + 1
c$ = MID$ (s, i, 1)
LOOP WHILE c$ 0> " "
DO
i = i + I
с $ - MID$ (s, i, 1)
LOOP WHILE c$ <> " "
m = VAL(MID$(S, i + 1, 2) )
b = VAL(MID$(s, i + 4))
k = i - 1
s = LEFTS(s, k)
IF m = 92 THEN
IF mini > b THEN
min2 = mini: cnt2 = cntl: s2 = si
mini = b: cntl = 1: s1 = s
ELSE
IF mini = b THEN
cntl = cntl + 1
ELSE
IF min2 > b THEN
min2 = b: cnt2 =1: s2 = s
ELSE
IF min2 = b THEN cnt2 = cnt2 + i
ENDIF
ENDIF
ENDIF
ENDIF
NEXT j
IF cnt2 > 0 THEN
IF cnt2 = 1 THEN PRINT s2 'ELSE PRINT cnt2
ELSE
IF cntl = 1 THEN PRINT si ELSE PRINT cntl
ENDIF
END

