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

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

Спрятать критерии
Критерии проверки:

Кри­те­рии оце­ни­ва­ния вы­пол­не­ния за­да­нияБаллы
Про­грам­ма ра­бо­та­ет для любых вход­ных дан­ных про­из­воль­но­го раз­ме­ра и на­хо­дит ответ, не со­хра­няя вход­ные дан­ные в мас­си­ве, раз­мер ко­то­ро­го со­от­вет­ству­ет числу N (ко­ли­че­ству за­про­сов).

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

4
Про­грам­ма ра­бо­та­ет верно, но вход­ные дан­ные за­по­ми­на­ют­ся в мас­си­ве, раз­мер ко­то­ро­го со­от­вет­ству­ет числу N. Этот мас­сив, воз­мож­но, потом сор­ти­ру­ет­ся. До­пус­ка­ет­ся на­ли­чие от одной до трех син­так­си­че­ских оши­бок. Воз­мож­но, в прин­ци­пи­аль­но верно ор­га­ни­зо­ван­ном вводе дан­ных есть одна ошиб­ка (на­при­мер, ис­поль­зо­ва­ние read вме­сто readln в Пас­ка­ле или не­вер­ное счи­ты­ва­ние стро­ки в C++). Три балла также вы­став­ля­ет­ся, если в эф­фек­тив­ной про­грам­ме, удо­вле­тво­ря­ю­щей кри­те­ри­ям вы­став­ле­ния 4 бал­лов, есть одна ошиб­ка, в ре­зуль­та­те ко­то­рой про­грам­ма ра­бо­та­ет не­вер­но на не­ко­то­рых на­бо­рах не­ти­пич­ных вход­ных дан­ных.3
Про­грам­ма ра­бо­та­ет в целом верно, эф­фек­тив­но или нет, но в ре­а­ли­за­ции ал­го­рит­ма со­дер­жит­ся до двух оши­бок (не­вер­ная ини­ци­а­ли­за­ция счётчи­ков, до­пу­ще­на ошиб­ка в прин­ци­пи­аль­но верно ор­га­ни­зо­ван­ной сор­ти­ров­ке или ал­го­рит­ме по­ис­ка ми­ни­маль­ных эле­мен­тов, ис­поль­зу­ет­ся знак “<” вме­сто “<=”, “or” вме­сто “and” и тому по­доб­ное).

Воз­мож­но, не­кор­рект­но ор­га­ни­зо­ва­но счи­ты­ва­ние вход­ных дан­ных. До­пус­ка­ет­ся на­ли­чие от одной до пяти син­так­си­че­ских оши­бок, опи­сан­ных выше

2
Про­грам­ма, воз­мож­но, не­вер­но ра­бо­та­ет при не­ко­то­рых вход­ных дан­ных, но по при­ведённому тек­сту ре­ше­ния ясно, что эк­за­ме­ну­е­мый по­ни­ма­ет, из каких эта­пов долж­но со­сто­ять ре­ше­ние за­да­чи. При ис­поль­зо­ва­нии сор­ти­ров­ки она может быть ре­а­ли­зо­ва­на прин­ци­пи­аль­но не­вер­но (на­при­мер, вме­сто двух цик­лов ис­поль­зу­ет­ся один), или до­пу­ще­на прин­ци­пи­аль­ная ошиб­ка в по­ис­ке нуж­ных эле­мен­тов. Всего до­пус­ка­ет­ся до 4 раз­лич­ных оши­бок в ре­а­ли­за­ции ал­го­рит­ма, в том числе опи­сан­ных в кри­те­ри­ях при­сво­е­ния двух бал­лов. До­пус­ка­ет­ся на­ли­чие от одной до семи син­так­си­че­ских оши­бок, опи­сан­ных выше.1
За­да­ние не вы­пол­не­но или вы­пол­не­но не­вер­но.0
Мак­си­маль­ный балл4