Задача №4936

Задания C4 по информатике с решением

Поиск задачи:

Здесь представлено решение задачи по информатике. Если у вас возникли сложности в решении то вы можете воспользоваться ответами которые размещены на данной странице. Вы конечно можете не согласиться с ответами, но данная информация размещена с целью ознакомления. Списывать с ответов или решать самому выбирать вам. Данная задача по теме с4
Решение задачи:

Уважаемые посетители сайта, если вы не согласны с той информацией которая представлена на данной странице или считаете ее не правильной, не стоит попросту тратить свое время на написание негативных высказываний, вы можете помочь друг другу, для этого присылайте в комментарии свое "правильное" решение и мы его скорее всего опубликуем.

Условие задачи:

C4 На вход программе подается набор символов, заканчивающийся точкой (в программе на языке
Бейсик символы можно вводить по одному в строке, пока не будет введена точка, или считывать
данные из файла). Напишите эффективную, в том числе и по используемой памяти, программу
(укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая
сначала будет определять, есть ли в этом наборе символы, соответствующие десятичным
цифрам. Если такие символы есть, то можно ли переставить их так, чтобы полученное число было
симметричным (читалось одинаково как слева направо, так и справа налево). Ведущих нулей в
числе быть не должно, исключение – число 0, запись которого содержит ровно один ноль.
Если требуемое число составить невозможно, то программа должна вывести на э кран слово «NO».
А если возможно, то в первой строке следует вывести слово «YES», а во второй – искомое
симметричное число. Если таких чисел несколько, то программа должна выводить максимальное
из них. Например, пусть на вход подаются следующие символы:
Do not 911 to 09 do.
В данном случае программа должна вывести
YES
91019
Пояснение.
Программа читает все входные символы до точки один раз, подсчитывая в массиве, хранящем 10
целых чисел, количество каждой из цифр. Сами входные символы при этом не запоминаются.
Затем проверяется — сколько в этом массиве нечетных элементов. Если больше одного, то задача
решения не имеет. При наличии решения сначала печатается половина имеющихся цифр 9 (если
таковые имеются, в случае нечетного числа цифр — меньшая половина), затем 8 и т.д. до 0,
потом печатается цифра, которая встречается во входных данных нечетное число раз, а затем —
оставшаяся половина цифр 0 (если таковые имеются, в случае нечетного числа цифр — меньшая
половина), 1, и т.д. до 9. Если никаких цифр, кроме 0, во входных данных нет, то задача имеет
решение, только если этот ноль единственный. Если нулей четное число, а ненулевая цифра
единственная, то решения не существует.
Баллы начисляются только за программу, которая решает задачу хотя бы для одного частного
случая (например, для строк, состоящих не более чем из 255 символов), или которая умеет только
определять, имеет ли задача решение.
Пример правильной и эффективной программы на языке Паскаль:
var a:array['0'..'9'] of integer;
c, c_odd: char;
i, k: integer;
f: boolean;
begin
for c:='0' to '9' do a[c]:=0;
read(с);
while c<>'.' do
begin
if c in ['0' .. '9'] then a[c] := a[c] + 1;
read(c);
end;
k := 0; {количество цифр, встречающихся нечетное число раз}
for c := '0' to '9' do
if a[c] mod 2 = 1 then
begin
k := k + 1;
c_odd := c
end;
f := (a['0'] = 1);
for c := '1' to '9' do
if (a[c] > 1) or (a[c] = 1) and (a['0'] = 0) then f := true;
if (k > 1)or not f then writeln('NO') else
begin
writeln('YES');
for c := '9' downto '0' do
for i := 1 to a[c] div 2 do
write(c);
if k = 1 then
write(c_odd);
for c := '0' to '9' do
for i := 1 to a[c] div 2 do
write(c);
end
end.

Пример правильной и эффективной программы на языке Бейсик:
DIM k, i, j, iodd, a(9) AS INTEGER
FOR i = 0 TO 9
a(i) = 0
NEXT
INPUT c$
DO WHILE NOT (c$ = ".")
IF c$ >= "0" AND c$ <= "9" THEN
a(ASC(c$) - ASC("0")) = a(ASC(c$) - ASC("0")) + 1
ENDIF
INPUT c$
LOOP
k = 0
IF a(0) = 1 THEN f = 1 ELSE f = 0
FOR i = 0 TO 9
IF a(i) MOD 2 = 1 THEN
k = k + 1
iodd = i
END IF
IF i > 0 AND a(i) > 1 THEN f = 1
NEXT
IF k = 1 AND a(0) = 0 THEN f = 1
IF k > 1 OR f = 0 THEN
PRINT "NO"
END
ENDIF
PRINT "YES"
FOR i = 9 TO 0 STEP -1
FOR j = 1 TO a(i) \ 2
PRINT i;
NEXT
NEXT
IF k = 1 THEN PRINT iodd;
FOR i = 0 TO 9
FOR j = 1 TO a(i) \ 2
PRINT i;
NEXT
NEXT
END

C4 После единых выпускных э кзаменов по информатике в район пришла информация о том, какой
ученик какой школы сколько баллов набрал. По полож ению об э кзамене каж¬дый район сам
определяет, за какой балл нужно поставить какую оценку.
Районный методист решила, что оценку «отлично» должны получить 20% участников (целое
число, с отбрасыванием дробной части).
Для этого она должна определить, какой балл долж ен был набрать ученик, чтобы получить
«отлично».
Если невозможно определить такой балл, чтобы «отлично» получили ровно 20% участников,
«отлично» должно получить меньше участников, чем 20%.
Если таких участников не окаж ется (наибольший балл набрали больше 20% участников) — эти и
только эти ученики должны получить «отлично».
Напишите эффективную, в том числе и по используемой памяти, программу (укажите
используемую версию языка программирования, например Borland Pascal 7.0), которая должна
вывести на э кран наименьший балл, который набра¬ли участники, получившие «отлично».
Известно, что информатику сдавало больше 5-ти учеников. Такж е известно, что есть такое
количество баллов, которое не получил ни один участник.
На вход программе сначала подаётся число учеников, сда-вавших э кзамен. В каждой из
следующих N строк находится информация об учениках в формате:
<Фамилия> <Имя> <Номер школы> <Количество баллов>
где <Фамилия> — строка, состоящая не более чем из 30 символов без пробелов,
<Имя> — строка, состоящая не более чем из 20 символов без пробелов,
<Номер школы> — целое число в диапазоне от 1 до 99,
<Количество баллов> — целое число в диапазоне от 1 до 100. Эти данные записаны через
пробел, причём ровно один между каждой парой (то есть всего по три пробела в каждой строке).
Пример входной строки:
Иванов Иван 50 87
Пример выходных данных:
78
Пояснение.
ПАСКАЛЬ
var k:array[0..100] of integer; (число учеников, набравших такой балл)
ch:char;
i,N,sh,ball,num,s:integer;
begin
for i: =0 to 100 do {обнуляем массив}
k[i]:=0;
readln(N); (считали количество строк}
for i:=1 to N do {перебираем все входные строки}
begin
repeat
read(ch)
until ch=' ';{считана фамилия}
repeat
read(ch) until ch=' ';(считано имя}
readln(sh,ball); {считали номер школы и балл ученика}
k[ball]:=k[ball]+l {считаем количество учеников, набравших такой балл}
end;
num:=N div 5; {вычисляем 20% от количества учеников}
S : = 0 ;
i : = 101 ;
whi1е sbegin
i:=i-l;
s:=s+k[i]
end;
if s=num then {"отлично" можно поставить ровно 20% участников}
writeln(i)
else
if k[i]=s then {наибольший балл набрало более 20% участников}
writeln(i)
else {ученики, набравшие "i" баллов, не получат "отлично"}
begin
i:=i+l;
while k[i]=0 do {ищем участников с большим баллом}
i:=i+l;
writeln(i)
end

end.
C4 Соревнования по игре «Тетрис-онлайн» проводятся по следующим правилам:
1. Каждый участник регистрируется на сайте игры под определённым игровым именем. Имена
участников не повторяются.
2. Чемпионат проводится в течение определённого времени. В любой момент этого времени
любой зарегистрированный участник мож ет зайти на сайт чемпионата и начать зачётную игру.
По окончании игры её результат (количество набранных очков) фиксируется и заносится в
протокол.
3. Участники имеют право играть несколько раз. Количество попыток одного участника не
ограничивается.
4. Окончательный результат участника определяется по одной, лучшей для данного участника
игре.
5. Более высокое место в соревнованиях занимает участник, показавший лучший результат.
6. При равенстве результатов более высокое место занимает участник, раньше показавший
лучший результат.
В ходе соревнований заполняется протокол, каждая строка которого описывает одну игру и
содержит результат участника и его игровое имя. Протокол формируется в реальном времени по
ходу проведения чемпионата, поэтому строки в нём располож ены в порядке проведения игр: чем
раньше встречается строка в протоколе, тем раньше закончилась соответствующая этой строке
игра.
Спонсор чемпионата предоставил призы различной ценности для награждения К лучших игроков
(К<=20). Если участников окаж ется меньше К, призами награждаются все. Вам необходимо
написать эффективную, в том числе по памяти, программу, которая по данным протокола
определяет К лучших игроков и занятые ими места.
Перед текстом программы кратко опишите алгоритм решения задачи и укажите используемый
язык программирования и его версию.
Описание входных данных
Первая строка содержит числа К — количество имеющихся призов и N — общее количество строк
протокола.
Каждая из следующих N строк содержит записанные через пробел результат участника (целое
положительное число, не превышающее 100 миллионов) и игровое имя (имя не мож ет содержать
пробелов). Строки исходных данных соответствуют строкам протокола и располож ены в том ж е
порядке, что и в протоколе.
Описание выходных данных
Программа должна вывести имена и результаты К лучших игроков в порядке занятых мест по
форме, приведённой ниж е в примере. Если игроков окаж ется меньше К, нужно вывести данные
обо всех игроках.
Пример входных данных:
615
69485 Jack
95715 qwerty
95715 Alex
83647 М
197128 qwerty
95715 Jack
93289 Alex
95715 Alex
95715 M
32768 BilboBaggins
99824 TetrisMaster
45482 BilboBaggins
62123 BilboBaggins
77623 M
56791 Champion
Пример выходных данных для приведённого выше примера входных данных:
1. qwerty (197128)
2. TetrisMaster (99824)
3. Alex (95715)
4. Jack (95715)
5. M (95715)
6. BilboBaggins (62123)

Пояснение.
Программа читает входные данные, не запоминая в массиве информацию обо всех сделанных
попытках. В процессе ввода заполняется массив, содержащий К лучших результатов. Допускается
создание массива из 20 элементов (указанное в условии максимально возможное значение К) и
использование его первых К элементов. Для каждой строки протокола необходимо определить,
попадает ли данный результат в текущий список лучших. При этом необходимо учитывать, что
очередная попытка мож ет принадлежать игроку, который уж е входит в список, в этом случае она
засчитывается, только если данный результат выше уж е записанного результата данного игрока.
При включении нового результата в список лучших этот результат долж ен быть записан на
соответствующее ему место, а более низкие результаты - сдвинуты на одну позицию вниз.
Ниж е приводится пример правильной программы на алгоритмическом языке. В данной программе
для каждой строки протокола просматривается полный текущий список лучших результатов.
Допускается сокращение этого просмотра за счёт дополнительных проверок.
Пример правильной и эффективной программы на алгоритмическом языке
алг
нач
цел К, N
ввод К, N
целтаб суммы[1:К]
литтаб имена[1:К]
цел сум
лит имя
цел низ, верх, место
нц для место от 1 до К
суммы[место]:= 0
имена[место]:= ""
кц
нц N раз
ввод сум, имя
верх:= 0; низ:= К
нц для место от 1 до К
если сум>суммы[место] и верх=0 то верх:= место все
если имя=имена [место] то низ:= место все
кц
если 0<верх<= низ то
нц для место от низ до верх+1 шаг −1
суммы[место]:= суммы[место −1]
имена[место]:= имена[место −1]
кц
суммы[верх]:= сум
имена[верх]:= имя
все
кц
нц для место от 1 до К
если суммы[место]>0
то вывод не, место,".",имена[место],"(",суммы[место]
все
кц
кон

C4 Соревнования по игре «Тетрис-онлайн» проводятся по следующим правилам:
1. Каждый участник регистрируется на сайте игры под определённым игровым именем. Имена
участников не повторяются.
2. Чемпионат проводится в течение определённого времени. В любой момент этого времени
любой зарегистрированный участник мож ет зайти на сайт чемпионата и начать зачётную игру.
По окончании игры её результат (количество набранных очков) фиксируется и заносится в
протокол.
3. Участники имеют право играть несколько раз. Количество попыток одного участника не
ограничивается.
4. Окончательный результат участника определяется по одной, лучшей для данного участника
игре.
5. Более высокое место в соревнованиях занимает участник, показавший лучший результат.
6. При равенстве результатов более высокое место занимает участник, раньше показавший
лучший результат.
В ходе соревнований заполняется протокол, каждая строка которого описывает одну игру и
содержит результат участника и его игровое имя. Протокол формируется в реальном времени по
ходу проведения чемпионата, поэтому строки в нём располож ены в порядке проведения игр: чем
раньше встречается строка в протоколе, тем раньше закончилась соответствующая этой строке
игра.
Спонсор чемпионата предоставил призы различной ценности для награждения К лучших игроков
(К<=20). Если участников окаж ется меньше К, призами награждаются все. Вам необходимо
написать эффективную, в том числе по памяти, программу, которая по данным протокола
определяет К лучших игроков и занятые ими места.
Перед текстом программы кратко опишите алгоритм решения задачи и укажите используемый
язык программирования и его версию.
Описание входных данных
Первая строка содержит числа К — количество имеющихся призов и N — общее количество строк
протокола.
Каждая из следующих N строк содержит записанные через пробел результат участника (целое
положительное число, не превышающее 100 миллионов) и игровое имя (имя не мож ет содержать
пробелов). Строки исходных данных соответствуют строкам протокола и располож ены в том ж е
порядке, что и в протоколе.
Описание выходных данных
Программа должна вывести имена и результаты К лучших игроков в порядке занятых мест по
форме, приведённой ниж е в примере. Если игроков окаж ется меньше К, нужно вывести данные
обо всех игроках.
Пример входных данных:
615
69485 Jack
95715 qwerty
95715 Alex
83647 М
197128 qwerty
95715 Jack
93289 Alex
95715 Alex
95715 M
32768 BilboBaggins
99824 TetrisMaster
45482 BilboBaggins
62123 BilboBaggins
77623 M
56791 Champion
Пример выходных данных для приведённого выше примера входных данных:
1. qwerty (197128)
2. TetrisMaster (99824)
3. Alex (95715)
4. Jack (95715)
5. M (95715)
6. BilboBaggins (62123)
Пояснение.

Программа читает входные данные, не запоминая в массиве информацию обо всех сделанных
попытках. В процессе ввода заполняется массив, содержащий К лучших результатов. Допускается
создание массива из 20 элементов (указанное в условии максимально возможное значение К) и
использование его первых К элементов. Для каждой строки протокола необходимо определить,
попадает ли данный результат в текущий список лучших. При этом необходимо учитывать, что
очередная попытка мож ет принадлежать игроку, который уж е входит в список, в этом случае она
засчитывается, только если данный результат выше уж е записанного результата данного игрока.
При включении нового результата в список лучших этот результат долж ен быть записан на
соответствующее ему место, а более низкие результаты - сдвинуты на одну позицию вниз.
Ниж е приводится пример правильной программы на алгоритмическом языке. В данной программе
для каждой строки протокола просматривается полный текущий список лучших результатов.
Допускается сокращение этого просмотра за счёт дополнительных проверок.
Пример правильной и эффективной программы на алгоритмическом языке
алг
нач
цел К, N
ввод К, N
целтаб суммы[1:К]
литтаб имена[1:К]
цел сум
лит имя
цел низ, верх, место
нц для место от 1 до К
суммы[место]:= 0
имена[место]:= ""
кц
нц N раз
ввод сум, имя
верх:= 0; низ:= К
нц для место от 1 до К
если сум>суммы[место] и верх=0 то верх:= место все
если имя=имена [место] то низ:= место все
кц
если 0<верх<= низ то
нц для место от низ до верх+1 шаг −1
суммы[место]:= суммы[место −1]
имена[место]:= имена[место −1]
кц
суммы[верх]:= сум
имена[верх]:= имя
все
кц
нц для место от 1 до К
если суммы[место]>0
то вывод не, место,".",имена[место],"(",суммы[место]
все
кц
кон

C4 Дан список точек плоскости с целочисленными координатами. Необходимо определить:
1) номер координатной четверти K, в которой находится больше всего точек;
2) точку A в этой четверти, наименее удалённую от осей координат;
3) расстояние R от этой точки до ближайшей оси.
Если в нескольких четвертях располож ено одинаковое количество точек, следует выбрать ту
четверть, в которой величина R меньше. При равенстве и количества точек, и величины R
необходимо выбрать четверть с меньшим номером K. Если в выбранной четверти несколько точек
находятся на одинаковом минимальном расстоянии от осей координат, нужно выбрать первую по
списку. Точки, хотя бы одна из координат которых равна нулю, считаются не принадлежащими ни
одной четверти и не рассматриваются.
Напишите эффективную, в том числе по памяти, программу, которая будет решать эту задачу.
Перед текстом программы кратко опишите алгоритм решения задачи и укажите используемый
язык программирования и его версию.
Описание входных данных
В первой строке вводится одно целое положительное число - количество точек N.
Каждая из следующих N строк содержит координаты очередной точки - два целых числа (первое
— координата x, второе — координата у).
Описание выходных данных
Программа должна вывести номер выбранной четверти K, количество точек в ней M, координаты
выбранной точки A и минимальное расстояние R по образцу, приведённому ниж е в примере.
Пример входных данных:
7
−3 4
1 2
1 1
0 4
−2 −3
−6 8
−12 1
Пример выходных данных для приведённого выше примера входных данных:
K = 2
M = 3
A = (−12, 1)
R = 1
Пояснение.
Программа читает исходные данные, не запоминая все точки в массиве. Для каждой четверти
хранятся количество точек в этой четверти, координаты ближайшей к осям точки, минимальное
расстояние до оси. Для каждой точки определяется, в какой четверти она лежит, после чего
данные соответствующей четверти корректируются. При этом точки, лежащие на осях (одна из
координат равна нулю), не рассматриваются.
Пример правильной и эффективной программы на алгоритмическом языке
алг
нач
цел N
цел х, у
целтаб М[1:4], Rm[1:4], хА[1:4], уА[1:4]
цел i
цел к
нц для i от 1 до 4 М [i] :=0 Rm[i]:=0
кц
ввод N
нц N раз
ввод х, у
выбор
при х>0 и у>0 : к := 1
при х<0 и у>0 : к :=2
при х<0 и у<0 : к :=3
при х>0 и у<0 : к :=4

иначе к :=0
все
если к>0 то
М[к]:=М[к]+1
если Rm[к]= 0 или iabs(х)то
Rm[к]:=imin(iabs(х),iabs(у))
хА[к]:=х; уА[к]:=у
все
все
кц к: =1
нц для i от 2 до 4
если М[i]>М[к] или M[i]=M[k] и Rm[i]то к:=i все
кц
вывод "К = ", к, нc
вывод "М = " М [ к] , нc
вывод "А = (", хА[к], ", ", уА[к], ")", нc
вывод "R =" ,Rm[к]
кон
C4 Вам необходимо написать программу распознавания чисел, записанных прописью. Сначала на
вход программе подаётся обучающий блок, состоящий из 27 строк. Первые 9 строк содержат
слова "один", "два", ...., "десять", следующие 9 строк — слова "одиннадцать", "двенадцать", ...
"девятнадцать", следующие 9 строк — слова "десять", "двадцать", ..., "девяносто". Все слова
записаны меленькими русскими буквами без лишних пробелов в начале и в конце строки.
Затем на вход программе подаётся значение N — количество записей, которые необходимо
обработать. Следующие N строк содержат записанные словами числа. Каждое число записано
по-русски, маленькими буквами, без ошибок. Если число состоит из нескольких слов, между
словами находится ровно один пробел, лишних пробелов в начале и в конце строк нет.
Напишите эффективную программу, которая определит сумму тех входных чисел, которые
находятся в интервале то 1 до 99.
Размер памяти, которую использует Ваша программа, не долж ен зависеть от длины исходного
списка.
Перед текстом программы кратко опишите используемый Вами алгоритм решения задачи.
Пример входных данных (обучающий блок показан в примере с сокращениями):
один
два
...
девяноста
5
двадцать восемь
два миллиона
четырнадцать
сто двадцать три
тысяча девятьсот восемьдесят четыре
Пример выходных данных для приведённого выше примера входных данных:
42
Пояснение.
Вариант 1.
Программа читает обучающий блок и запоминает написание чисел и их значения. Допускается
построение полного "словаря" всех чисел от 1 до 99 или хранение только исходного обучающего
блока. В приведённом примере на Паскале реализовано построение полного "словаря".
Затем программа читает входные строки, не запоминая их в массиве. Если построен полный
"словарь", прочитанная строка ищется в этом словаре как единое целое. Числовое значение
введённой строки равно сумме значений составляющих слов. Если вся строка при поиске в полном
"словаре" отсутствует в обучающих данных, введённое число не попадает в интервал от 1 до 99
и не должно учитываться. Дополнительная проверка вхождения числа в заданный интервал не
требуется, т. к. все числа, которые удаётся распознать с помощью приведённого обучающего
блока, автоматически в него попадают, но за наличие такой дополнительной проверки в
программе оценка снижается.
Паскаль
program c4;
var
w: array[1..99] of string;
N: integer;
s: integer;
line: string;
i, j: integer;

begin
{читаем обучающий блок}
for i := 1 to 9 do readln(w[i]);
for i := 11 to 19 do readln(w[i]);
for i := 1 to 9 do readln(w[10*i]);
{строим полный словарь}
for i := 2 to 9 do begin
for j := 1 to 9 do begin
w[10*i + j] := w[10*i]+ ' ' + w[j];
end;
end;
читаем и обрабатываем основной набор данных}
readln(N);
s : = 0 ;
for i:=1 to N do begin
readln(line);
j : =1;
while (j<100) and (w[j]<>line) do j:=j+1;
if j<100 then s:=s+j; end;
end.
writeln(s);
Вариант 2.
Программа читает обучающий блок и запоминает написание чисел и их значения. Допускается
построение полного "словаря" всех чисел от 1 до 99 или хранение только исходного обучающего
блока. В приведённом примере на Паскале — хранение исходного обучающего блока. Если
полный "словарь" отсутствует, строка разбивается на слова (в подходящей строке их мож ет быть
не более двух). Числовое значение введённой строки равно сумме значений составляющих слов.
Если какое-то слово отсутствует в обучающих данных, введённое число не попадает в интервал
от 1 до 99 и не должно учитываться. Дополнительная проверка вхождения числа в заданный
интервал не требуется, т. к. все числа, которые удаётся распознать с помощью приведённого
обучающего блока, автоматически в него попадают, но за наличие такой дополнительной
проверки в программе оценка снижается.
Паскаль
program c4;
const nw=27;
var
words: array[1..nw] of string;
values: array[1..nw] of integer;
{поиск слова в словаре, возврат числового значения}
function word2value (w: string) : integer;
var
i: integer;
begin
i : =1;
while (i<=nw) and (words[i]<>w) do i:=i+1;
if i<=nw then word2value:=values[i]
else word2value:=0;
end;
var
N: integer;
s: integer;
v1, v2: integer;
line: string;
i, j: integer;
begin
{читаем обучающий блок}
for i := 1 to 9 do begin
readln(words[i] ) ;
values[i] :=i ;
end;
for i := 10 to 18 do begin
readln(words[i]);
values[i]:=i+1;

end;
for i := 19 to 27 do begin
readln(words[i]);
values[i] :=10*(i-18) ;
end;
{читаем и обрабатываем основной набор данных}
readln(N);
s : = 0 ;
for i:=1 to N do begin
readln(line);
j : =pos(line, ' ') ;
if j>0 then begin
v1 := word2value(copy(line,1,j-1));
v2 := word2value(copy(line,j+1,length(line)-j));
if (v1>0) and (v2>0) then s:=s+v1+v2;
end
else begin
v1 := word2value(line);
if v1>0 then s:=s+v1;
end;
end;
writeln(s);
end.
Бейсик
DIM w$(99)
FOR i = 1 TO 9
LINE INPUT w$(i)
NEXT i
FOR i = 11 TO 19
LINE INPUT w$(i)
NEXT i
FOR i = 10 TO 90 STEP 10
LINE INPUT w$(i)
NEXT i
FOR i = 20 TO 9 0
FOR j = 1 TO 9
w$(i + j) = w$(i) + " " + w$(j)
NEXT j
NEXT i
INPUT N s = 0 FOR i = 1 TO N
LINE INPUT line$
j = 1
WHILE j < 100 AND w$(j) <> line$
j = j + 1
WEND
IF j < 10 0 THEN s = s + j
NEXT i
PRINT s
END
Алгоритмический язык
алг c4 нач
литтаб слова[1:99]
лит трока
цел N
цел сумма
цел i, j
нц для i от 1 до 9
ввод слова[i]
кц
нц для i от 11 до 19
ввод слова[i]
кц
нц для i от 10 до 90 шаг 10

ввод слова[i]
кц
нц для i от 20 до 90 шаг 10
нц для j от 1 до 9
кц
кц
ввод N
сумма:= 0
нц для i от 1 до N
ввод строка
j : =1
нц пока j < 10 0 и слова [j] <>строка
j:=j +1
кц
если j <10 0 то сумма:=сумма+j все
кц вывод
кон
Перл
for $v (1..9, 11..19, 20, 30, 40, 50, 60, 70, 80, 90) {
chomp ($w = <>) ;
$value{$w} = $v; }
$n = <>;
$s = 0;
while ($ n--) {
chomp ($line = <>);
$num = 0;
$value{$w}}
for $w (split / /,$line) {
if ($value{$w}) {$num += $value{$w}}
else {$num=0; last}
}
$s += $num;
}
print $s;
C4 После единых выпускных э кзаменов по информатике в район пришла информация о том, какой
ученик какой школы сколько баллов набрал.
Районный методист решила выяснить фамилии учеников, которые набрали наибольший балл, по
каждой школе в отдельности, но только если из школы информатику сдавало не меньше 3
человек. Если в школе информатику сдавало меньше 3 человек, информа цию по этой школе
выводить не нужно.
Программа должна вывести на э кран информацию в виде:
<Номер школы> <Фамилия ученика>
в отдельной строке для каждой школы.
Напишите эффективную, в том числе и по используемой памяти, программу (укажите
используемую версию языка программирования, например Borland Pascal 7.0), которая должна
вывести на э кран требуемую информацию. Известно, что информатику сдавало больше 5-ти
учеников района. Такж е известно, что в районе школы с некоторыми номерами не существуют.
На вход программе сначала подаётся число учеников, сда-вавших э кзамен. В каждой из
следующих N строк находится информация об учениках в формате:
<Фамилия> <Имя> <Номер школы> <Количество баллов>
где <Фамилия> — строка, состоящая не более чем из 30 символов без пробелов,
<Имя> — строка, состоящая не более чем из 20 символов без пробелов,
<Номер школы> — целое число в диапазоне от 1 до 99,
<Количество баллов> — целое число в диапазоне от 0 до 100. Эти данные записаны через
пробел, причём ровно один между каждой парой (то есть всего по три пробела в каждой строке).
Пример входной строки:
Иванов Иван 50 87
Пример выходных данных:
5 Иванов
50 Петров
74 Сидоров
Пояснение.
ПАСКАЛЬ
var num,bal: array[1..99] of integer;

name: array[1..99] of string[52];
s:string[52];
eh:char;
i,N,sh,ball:integer;
begin
for i: =1 to 99 do {обнуляем массивы}
begin
num[i]:=0;
bal[i]:=-1 end;
readln(N); {считали количество строк}
for i:=1 to N do {перебираем все входные строки}
begin
s : =' ';
repeat
read(ch);
s : =s+ch
until ch=' ';{считана фамилия и записана в переменную s}
repeat
read(ch)
until ch= ' '; {считано имя}
readln(sh,ball); {считали номер школы и балл ученика}
if ball>bal[sh] then {если текущий балл лучше}
begin
bal[sh]ball; {запоминаем текущий балл по школе}
name[sh]:=s {и фамилию ученика}
end;
num[sh]:=num[sh]+l {считаем количество учеников из школы}
end;
for i:=l to 99 do
if num[i]>=3 then {выбираем только школы,из которых сдавало больше трех учеников}
writeln{i,' ',name[i])
end.
C4 На вход программе подается последовательность символов, среди которых встречаются и
цифры. Ввод символов заканчивается точкой (в программе на языке Бейсик символы можно
вводить по одному в строке, пока не будет введена точка). Требуется написать как можно более
эффективную программу (укажите используемую версию языка программирования, например,
Borland Pascal 7.0), которая составит из тех цифр, которые встречаются во входных данных,
максимальное число. При составлении итогового числа каждая цифра мож ет быть использована
только один раз. Если во входных данных цифры не встречаются, то следует вывести "-1".
Например, пусть на вход подаются следующие символы:
14ф73п439
В данном случае программа должна вывести
97431
Пояснение.
Код:
var a: array[0..9] of boolean; {массив булевского типа, значения элементов = true или false, true
значит, что цифра есть, false значит, что этой цифры нет}
 с: char;
 i, k: integer;
begin
for i:=0 to 9 do a[i]:=false; {очистка массива}
read(c);
while с<>'.' do //Вводим, пока не будет введена точка
begin
 if с in ['0'..'9'] then {если с принадлежит диапазону символов '0'..'9'}
begin
 k:=ord(c)-ord('0'); {каждая цифра вычисляется как разность кодов этой цифры и нуля}

a[k]:=true
 end;
read(c);
end;

k:=0;
for i:= 9 to 0 do
 if a[i] then
 begin
 k:=k+1;
 write(i)
end;
if k=0 then write(-l);
writeln
end.
C4 После единых выпускных э кзаменов по информатике в район пришла информация о том,какой
ученик, какой школы, сколько набрал баллов.
Районый методист решила выяснить номер школы, ученики которой набрали наибольший средний
балл,с точностью до целых.
Программа должна вывести на э кран номер такой школы и её средний балл.
Если наибольший средний балл набрало больше одной школы, вывести количество таких школ.
Напишите эффективную, в том числе и по используемой памяти, программу(укажите
используемую версию языка программирования),которая должна вывести на э кран требуемую
информацию.
Такж е известно, что в районе школ с некоторыми номерами не существует.
На вход программе сначала подается число учеников, сдававших э кзамен. В каждой из
следующих N строк находится информация об учениках в формате:
<Фамилия><Имя><Номер школы><Количество баллов>
<Фамилия>-строка, состоящая не более чем из 30 символов без пробелов,
<Имя>-строка, состоящая не более чем из 20 символов.
<Номер школы>-число в диапазоне от 1 до 99
<Количество баллов>-число в диапазоне от 1 до 100.
Эти данные записаны через пробел, то есть в каждой строке ровно 3 пробела.
Пояснение.
type massiv=array[1..99] of integer;
var count:massiv;
 sumball:massiv;
 ch:char;
 i,N,nomer,ball,max,nmax:integer;
Begin
for i:=1 to 99 do
 begin
 count[i]:=0;
 sumball[i]:=0;
 end;
write('Введите количество учеников: ');readln(n);
for i:=1 to n do
begin
Repeat
read(ch);
Until ch=' ';
Repeat
read(ch);
Until ch=' ';
read(nomer);
read(ball);
count[nomer]:=count[nomer]+1;
sumball[nomer]:=sumball[nomer]+ball;
end;
for i:=1 to 99 do
if count[i]>0 then sumball[i]:=sumball[i] div count[i];
max:=1;
nmax:=1;
for i:=2 to 99 do
if sumball[i]>sumball[max] then
 begin
 max:=i;
 nmax:=1;
 end
else if sumball[i]=sumball[max] then inc(nmax);
if nmax=1 then writeln(max,' ',sumball[max])
else writeln(nmax);

End.
C4 На вход программы подаются строчные английские буквы. Ввод этих букв заканчивается
точкой (другие символы, отличные от «.» и букв «a».. «z» во входных данных отсутствуют.
Требуется написать программу на одном из языков программирования, которая будет печатать
буквы, встречающиеся во входной последовательности, в порядке увеличения частоты их
встречаемости. Каждая буква должна быть распечатана один раз. Точка при этом не
учитывается. Если какие-то буквы встречаются одинаковое число раз, то они выдаются в
алфавитном порядке. Например, пусть на вход подаются следующие символы:
colaclc
В данном случае программа должна вывести:
аoсl
Пояснение.
program C4;
uses crt;
var
a:array[0..25] of integer;
m:array[0..25] of 'a'..'z';
ch:char;
i,j,k:integer;
Begin
for i:=0 to 25 do
begin
a[i]:=0;
m[i]:=chr(ord('a')+i);
end;
read(ch);
while ch<>'.' do
begin
a[ord(ch)-ord('a')]:=a[ord(ch)-ord('a')]+1;
read(ch);
end;
for i:=1 to 25 do
 for j:=0 to 24 do
 if a[j]>a[j+1] then
 begin
 k:=a[j];
 ch:=m[j];
 a[j]:=a[j+1];
 m[j]:=m[j+1];
 a[j+1]:=k;
 m[j+1]:=ch;
 end;
i:=0;
while a[i]=0 do inc(i);
for j:=i to 25 do write(m[j]);
End.
C4 На вход программе подаются 365 строк, которые содержат информацию о среднесуточной
темпе-ратуре всех дней 2007 года. Формат каждой из строк следующий: сначала записана дата в
виде dd.mm (на запись номера дня и номера месяца в числовом формате отводится строго два
символа, день от месяца отделен точкой), затем через пробел (для Бейсика — через запятую)
записано значение температуры — число со знаком плюс или минус, с точностью до 1 цифры
после десятичной точки. Данная информация отсортирована по значению температуры, т. е.
хронологический порядок нарушен. Требуется написать эффективную программу на языке
Паскаль или Бейсик, которая будет выводить на э кран информацию о месяцах с максимальной
среднеме¬сячной температурой. Найденные максимальные значения следует выводить в
отдельной строке для каждого месяца в виде: номер месяца, значение среднемесячной
температуры, округленное до одной цифры после десятичной точки.
Пояснение.
Программа считывает входные данные, сразу подсчитывая в массиве, хранящем 12 вещественных
чисел, сумму температур в каждом из месяцев. Затем с использованием этого массива ищется

максимальная среднемесячная температура. За дополнительный просмотр среднемесячных
температур (их можно как запомнить в массиве, так и вычислить заново) распечатывается
информация об искомых месяцах. Баллы начисляются только за программу, которая решает
задачу хотя бы для частного случая (например, месяц с максимальной температурой
единственен).
Пример правильной и эффективной программы на языке Паскаль:
const d:array[1..12] of integer =
(31,28,31,30,31,30,31,31,30,31,30,31);
var m:array[1..12] of real;
max, t:real;
i,j:integer;
cl,c2:char;
begin
for j:=1 to 12 do
m[j ] : =0;
for i:=l to 365 do
begin
readln(cl,cl,cl,cl,c2,t);
j:= (ord(cl)-ord('0') ) *10 +
ord(c2)-ord('01);
m [ j] :=m[j]+t
end;
max:=m[1]/d[1];
for j:=2 to 12 do
if m[j]/d[j] > max then
max:=m[j]/d[j];
for j:=1 to 12 do
if abs(m[j]/d[j]-max) < 0.0001
then writeln(j,1 ',m[j]/d[jj:0:1)
end.
Пример правильной программы на языке Бейсик:
DATA 31,28,31,30,31,30,31,31,30,31,30,31
DIM i, j, d (12) AS INTEGER
DIM m(12)
DIM dat AS STRING * 5
FOR i = 1 TO 12
m (i) = 0
READ d(i)
NEXT i
FOR i = 1 TO 3 65
INPUT dat, t
j = (ASC(MID$(dat, 4, 1)) - ASC("0")> * 10 +
ASC (MID5 (dat, 5, 1)) -ASCCO")
m(j) = m (j ) + t
NEXT i
max = m(l) / d(1)
FOR j = 2 TO 12
IF m(j ) / d(j) > max THEN max = m(j) / d(j)
NEXT j
FOR j = 1 TO 12 IF ABS(m(j) / d(j) - max) < .0001 THEN
PRINT j; " " ;
PRINT USING "##.#"; m(j) / d(j)
ENDIF
NEXT j
END

C4 На вход программе подаётся текст заклинания, состоящего не более чем из 200 символов,
заканчивающийся точкой (символ «точка» во входных данных единственный). Оно было
зашифровано Гарри Поттером следующим образом. Сначала Гарри определил количество букв в
самом длинном слове, обозначив полученное число К (словом называется непрерывная
последовательность английских букв, слова друг от друга отделяются любыми другими символами,
длина слова не превышает 20 символов). Затем он заменил каждую английскую букву в
заклинании на букву, стоящую в алфавите на К букв ранее (алфавит считается циклическим, то
есть перед буквой А стоит буква Z), оставив другие символы неизменными. Строчные буквы при
этом остались строчными, а прописные — прописными. Требуется написать как можно более
эффективную программу (укажите используемую версию языка программирования, например,
Borland Pascal 7.0), которая будет выводить на э кран текст расшифрованного заклинания.
Например, если зашифрованный текст был таким:
Zb Ra Ca,Dab Rа.
то результат расшифровки долж ен быть следующим:
Се Ud Pd,Gde Ud.
Пояснение.
Код:
var f:boolean;
i, k, max: integer;
с,cnew:char;
s:string;
begin
 s:=''; {длина строки – текста заклинания}
{Находим К – количество букв в самом длинном слове}
max:=0; k:=0;
f:=false; {текущий символ не буква}
repeat
read(c); //считываем по символу
s:=s+c; //прибавляем к строке
if f then {слово началось}
if с in ['a'..'z','A'..'Z']
then k:=k+1
else begin {текущий символ не буква – слово кончилось}
 if k>max then max:=k;
 f:=false
end
else {f=false}
if с in ['a'..'z','A'..'Z']
 then
 begin
 f:=true;
 k:=l
 end {начало нового слова}
until c='.';//считываем до точки
{Расшифровка заклинания}
for i:=l to length(s) do
begin
cnew:=chr(ord(s[i])+max); {Находим символ, код которого =s[i]+max}
case s[i] of
'a'..'z': if cnew>'z' then write (chr (ord (cnew)-26))//если новый символ уж е не буква,то из него
вычтем 26(колво букв в алфавите) и получим нужный символ.т к алфавит у нас циклический
else write(cnew); //иначе выводим
'A'..'Z': if cnew>'Z' then write (chr (ord (cnew)-26))
 else write(cnew);
else write(s([i])//если не буква-выводим как есть
end;
end;
readln
end.

C4 По каналу связи передается последовательность положительных целых чисел , … все
числа не превышают 1000, их количество заранее неизвестно. Каждое число передается в виде
отдельной текстовой строки, содержащей десятичную запись числа. Признаком конца
передаваемой последовательности является число 0. Участок последовательности от элемента
 до элемента называется подъемом, если на этом участке каждое следующее число
больше предыдущего. Высотой подъема называется разность . Напишите
эффективную программу, которая вычисляет наибольшую высоту среди всех подъемов
последовательности. Если в последовательности нет ни одного подъема, программа выдает 0.
Программа должна напечатать отчет по следующей форме:
Получено ... чисел Наибольшая высота подъема: …
Размер памяти, которую использует Ваша программа, не долж ен зависеть от длины переданной
последовательности чисел.
Перед текстом программы кратко опишите используемый вами
алгоритм решения задачи.
Пример входных данных:
144
17
27
3
7
9
11
10
0
Пример выходных данных для приведенного выше примера входных данных:
Получено 8 чисел
Наибольшая высота подъема: 10
Пояснение.
Программа читает все входные данные один раз, не запоминая все входные данные в массиве. Во
время чтения программа помнит число LMax — высоту самого высокого из уж е закончившихся
подъемов, а такж е необходимые сведения о текущем подъеме, например, число L — высоту
текущего подъема (то есть разность между последним и первым числом участка) и последнее
прочитанное число T (это число — наибольшее из чисел текущего подъема). Прочитав
очередное число R, программа сравнивает его с числом T. Если R > T, то значение L
увеличивается на R-T. В противном случае фиксируется конец подъема и начало нового участка.
То есть, во-первых, значение L сравнивается с LMax и, при необходимости, LMax полагается
равным L. Во-вторых, полагаем L = 0.
Пример правильной и эффективной
программы на языке Паскаль:
Пример правильной и эффективной
программы на языке Бейсик:
program c4_1;
var
R, T, N, L, LMax : Integer;
begin
N:=0;
L:=0;
LMax:=0;
T:=1001;
repeat
ReadLn(R);
if R<>0 then N:=N+1;
if R>T then L:=L+R-T
else begin
if L>LMax then LMax:=L;
L:=0;
end;
T:=R;
until R=0;
WriteLn('Получено ', N, ' чисел');
WriteLn('Наибольшая высота подъема ', LMax);
end.
DIM R, T, N, L, LMax AS INTEGER
N = 0
L = 0
LMax = 0
T = 1001;
DO
INPUT R
IF R <> 0 THEN N = N + 1
IF R > T THEN
L = L + R-T
ELSE
IF L > LMax THEN LMax = L
L = 0
END IF
T = R
LOOP UNTIL R = 0
PRINT "Получено "; N; " чисел"
PRINT "Наибольшая высота подъема "; Lmax
Пример правильной и эффективной
программы на языке Алгоритмическом языке:
алг C4_1
нач

цел R, T, N, L, LMax
N:=0
L:=0
LMax:=0
T:=1001;
нц
ввод R
если R<>0 то N:=N+1 все
если R>T то
L:=L+R-T
иначе
если L>LMax то LMax:=L все
L:=0
все T:=R
кц при R=0
вывод "Получено ", N, " чисел", нс
вывод "Наибольшая высота подъема ", LMax, нс
кон
C4 На вход программе подаются сведения о номерах школ учащихся, участвовавших в олимпиаде.
В первой строке сообщается количество учащихся N, каждая из следующих N строк имеет
следующий формат: <Фамилия> <Инициалы> <номер школы>, где <Фамилия> - строка,
состоящая не более чем из 20 символов, <Инициалы> - строка, состоящая из 4-х символов (буква,
точка, буква, точка), <номер школы> - не более чем двузначный номер. <Фамилия> и
<Инициалы>, а такж е <Инициалы> и <номер школы> разделены одним пробелом. Пример
входной строки:
Иванов П.С. 57
Требуется написать как можно более эффективную программу (укажите используемую версию
языка программирования, например, Borland Pascal 7.0), которая будет выводить на э кран
информацию, из какой школы (школ) было больше всего участников олимпиады.
Пояснение.
var nс:аrrау[1..99] of integer;
р:1..99;
с: char;
i, k, N, max: integer;
begin
readln(N);
for i:=l to 99 do nc[i]:=0;
for i:=l to N do
begin
 repeat
 read(c)
 until с=' ';
 repeat
 read(c)
 until с=' ';
readln(p);
nc[p]:=nc[p]+1;
end;
max:=0;
for i:=1 to 99 do
if nc[i]>0 then
 if nc[i]>max then max:=nc[i];
for i:=l to 99 do
 if nc[i]=max then writeln(i);
readln
end.

C4 После единых выпускных э кзаменов по информатике в район пришла информация о том, какой
ученик какой школы сколько баллов набрал. Эта информация в том ж е виде была разослана в
школы. Завуч школы № 50 решила наградить двух учащихся, которые лучше всех в школе сдали
информатику. Программа должна вывести на э кран фамилии и имена этих учеников.
Если наибольший балл набрало больше двух человек — вывести количество таких учеников.
Если наибольший балл набрал один человек, а следующий балл набрало несколько человек —
нужно вывести только фамилию и имя лучшего.
Напишите эффективную, в том числе и по используемой памяти, программу (укажите
используемую версию языка программирования, например Borland Pascal 7.0), которая должна
вывести на э кран требуемую информацию. Известно, что информатику сдавало больше 5-ти
учеников школы № 50.
На вход программе сначала подаётся число учеников, сда¬вавших э кзамен. В каждой из
следующих N строк находится информация об учениках в формате:
<Фамилия> <Имя> <Номер школы> <Количество баллов> где <Фамилия> — строка, состоящая не
более, чем из 30 символов без пробелов, <Имя> — строка, состоящая не более чем из 20 символов
без пробелов, <Номер школы> — целое число в диапазоне от 1 до 99, <Количество баллов> —
целое число в диапазоне от 1 до 100. Эти данные записаны через пробел, причём ровно один
между каждой парой (то есть всего по три пробела в каждой строке).
Пример входной строки:
Иванов Иван 50 87
Пример выходных данных:
Круглов Василий Тарасова Дарья
Другой вариант выходных данных:
7
Третий вариант выходных данных:
Гусарский Илья
Пояснение.
О т в е т :
ПАСКАЛЬ
var S,Smax,Smax2:string[52];
ch:char;
i, N, sh,ball, max, nmax, max2, nmax2 : integer;
begin
max:=-1; Smax:=''; nmax:=0;
max2:=-1;
readln(N); {считали количество строк}
for i:=1 to N do {перебираем все входные строки}
begin s : = " ; repeat
read(ch);
s:=s+ch
until ch=' ';{считана фамилия и запомнена в переменной s}
repeat
read(ch);
s : = s+ch
until ch=' 1 ; {считано имя и добавленак переменной s}
readln(sh,ball); {считали номер школы и балл ученика}
if sh=50 then {обрабатываем только учеников 50-й школы}
if ball>max then {текущий балл - лучший}
begin
max2:=max; Smax2:=Smax; nmax2:=nmax;
max : =bal 1; Smax : = s; nmax : = 1
end
else
if ball=max then {текущий балл - такой ж е, как лучший}
begin
nmax:=nmax+1; max2:=max; Smax2:=S end
else
if ball>max2 then {текущий балл - лучше второго}
begin
max2:=ball; Smax2:=S; nmax2:=1
end
else
if ba1l=max2 then {текущий балл такой ж е, как второй}
nmax2 : =nmax2 + l
end;
if (nmax=2) or (nmax= 1) and (nmax2 = 1) then {два лучших ученика}

begin
writeln (Smax) ;
writeln(Smax2)
end
else
if (nmax=l) and (nmax2>l) then {один лучший ученик}
writeln(Smax)
else
writeln(nmax) {лучших учеников больше двух}
end.
C4 На вход программе подаются 366 строк, которые содержат информацию о среднесуточной
температуре всех дней 2008 года. Формат каждой из строк следующий: сначала записана дата в
виде dd.mm (на запись номера дня и номера месяца в числовом формате отводится строго два
символа, день от месяца отделен точкой), затем через пробел записано значение температуры -
число со знаком плюс или минус, с точностью до 1 цифры после десятичной точки. Данная
информация отсортирована по значению температуры, то есть хронологический порядок
нарушен. Напишите эффективную, в том числе и по используемой памяти, программу (укажите
используемую версию языка программирования, например Borland Pascal 7.0), которая будет
выводить на э кран информацию о месяце (месяцах) среднемесячная температура для которого
(которых) наименее отклоняется от среднегодовой. В первой строке вывести среднегодовую
температуру. Найденные значения дтя каждого из месяцев следует выводить в отдельной строке
в следующем виде: номер месяца, значение среднемесячной температуры, отклонение от
среднегодовой температуры.
Пояснение.
Содержание верного ответа
(допускаются иные формулировки ответа, не искажающие его смысла)
Программа читает входные данные, сразу подсчитывая в массиве, хранящем 12 вещественных
чисел, сумму температур в каждом из месяцев, одновременно суммируя все температуры в году.
Затем с использованием этого массива ищется минимальное отклонение среднемесячной
температуры от среднегодовой. За дополнительный просмотр этого массива распечатывается
информация об искомых месяцах. Баллы начисляются только за программу, которая решает
задачу хотя бы для частного случая
(например, месяц с минимальным отклонением единствен).
Программа работает верно, т. е. определяет все месяцы, в которых среднемесячная температура
минимально отклоняется от среднегодовой, не содержит атож енных циклов, в тексте программы
не анализируется каждый месяц в отдельности. Допускается наличие в тексте программы одной
синтаксической ошибки.
Пример правильной и эффективной программы на языке Паскаль:
Coast d:array[ I.. 12] of integer =
(31,29,31,30,31,30,31,31,30,31,30,31);
var tm:array [1.. 12] of real;
m:1..12;
data:string[5];
min,ty,t:real;
i: integer;
begin
for i:=1 to 12 do
tm[i]:=0;
ty:=0; {среднегодовая температура}
fori:=l to 366 do
begin
readln(data,t);
{вычисляем номер месяца}
m:(ord(data[4])-ord('0'))* 10
+ord(data[5])-ord('0');
tm[m] :=tm[m]+t;
ty:=ty+t;
end;
for i:=1 to 12 do
tm[i]:=tm[i]/d[i];
ty:=ty/366;
min:=100;
for i:=1 to 12 do
if abs(tm[i]-ty) min:=abs(tm[i]-ty);
writeln('Среднегодовая температура = ',ty:0:2);

for i:=1 to 12 do
if abs(abs(tm[i]-ty)-min)<0.0001 then
writeln(i,'', tm[i]:0:2,' \abs(tm[i]-ty):0:2); readln end.
Пример правильной и эффективной программы на языке Бейсик:
DATA 31,29,31,30,31,30,31,31,30,31,30,31
DIM i, m, d(12) AS INTEGER
DIMtm(12)
DIM dat AS STRING*5
FOR i=1 TO 12
tm(i) = 0
READ d(i)
NEXTi
ty = 0
'tу - среднегодовая температура
FORi = 1 TO 366
INPUT dat, t
'Вычисляем номер месяца
m=(ASC(MID$(dat,4,l))-ASC("0"))*10+
ASC(MID$(dat,5,l))-ASC("0")
tm(m) = tm(m) +1
ty = ty + t
NEXTi FORi=1 TO 12
tm(i) = tm(i)/d(i)
NEXTi ty = ty/366
mm = 100 FOR i=1 T0 12
IF ABS(tm(i) - ty) < min THEN min = ABS(tm(i) - ty)
NEXTi
PRINT "Среднегодовая температура = ";
PRINT USING "##.##"; ty FOR i=1T0 12
IF ABS(ABS(tm(i) - ty) - min) < .0001 THEN
PRINT i;
PRINT USING "##.## "; tm(i); ABS(tm(i) - ty)
END IF
NEXT i
END
C4 На автозаправочных станциях (АЗС) продается бензин с маркировкой 92, 95 и 98. В городе N
был проведен мониторинг цены бензина на различных АЗС.
Напишите эффективную по времени работы и по используемой памяти программу (укажите
используемую версию языка программирования, например, Borland Pascal 7.0), которая будет
определять для каждого вида бензина, сколько АЗС продают его деше вле всего. На вход
программе в первой строке подается число данных о стоимости бензина. В каждой из
последующих N строк находится информация в следующем формате:
<Компания> <Улица> <Марка> <Цена> где <Компания> – строка, состоящая не более, чем из 20
символов без пробелов, <Улица> – строка, состоящая не более, чем из 20 символов без пробелов,
<Марка> – одно из чисел – 92, 95 или 98, <Цена> – целое число в диапазоне от 1000 до 3000,
обозначающее стоимость одного литра бензина в копейках. <Компания> и <Улица>, <Улица> и
<Марка>, а такж е <Марка> и <цена> разделены ровно одним пробелом. Пример входной строки:
Синойл Цветочная 95 2250 Программа должна выводить через пробел 3 числа — количество АЗС,
продающих дешевле всего 92-й, 95-й и 98-й бензин соответственно. Если бензин какой-то марки
нигде не продавался, то следует вывести 0.
Пояснение.
var
min, ans: array[92..98] of integer;
c: char;
i, k, N, b: integer;
begin
for i:=92 to 98 do
begin
min[i]:=3001;{допустимо и другое число, >3000}
ans[i]:=0;
end;
readln(N);
for i:=1 to N do
begin
repeat
read(c);
until c=' '; {считана компания}

repeat
read(c);
until c=' '; {считана улица}
readln(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}
writeln(ans[92],' ', ans[95],' ', ans[98])
end.
 

 


Категория: по информатике | Добавил: Админ (03.01.2016)
Просмотров: | Теги: с4 | Рейтинг: 0.0/0


Другие задачи:
Всего комментариев: 0
avatar