СДАМ ГИА: РЕШУ ЕГЭ
Образовательный портал для подготовки к экзаменам
Информатика
≡ информатика
сайты - меню - вход - новости


Задания
Версия для печати и копирования в MS Word
Задания Д19 C4 № 3651

На автозаправочных станциях (АЗС) продается бензин с маркировкой 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