Вариант 4
Часть 1.
Ответами к заданиям 1–23 являются число или последовательность цифр. Запишите ответ справа от номера задания без пробелов, запятых и других дополнительных символов.
Укажите наибольшее число, двоичная запись которого содержит ровно пять значащих нулей и две единицы. Ответ запишите в десятичной системе счисления.
Между населёнными пунктами А, В, С, D, Е, F построены дороги, протяжённость которых в километрах приведена в таблице. (Отсутствие числа в таблице означает, что прямой дороги между пунктами нет.)
A | B | C | D | E | F | |
A | 5 | 3 | ||||
B | 2 | 4 | ||||
C | 2 | 2 | 3 | |||
D | 5 | 2 | 1 | |||
E | 3 | 1 | 2 | |||
F | 4 | 3 | 2 |
Определите длину кратчайшего пути между пунктами А и F (при условии, что передвигаться можно только по построенным дорогам). В ответе укажите только число.
Дан фрагмент таблицы истинности выражения F.
x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | F |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 |
0 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 1 |
Каким выражением может быть F?
1) ¬x1 ∧ x2 ∧ x3 ∧ x4 ∧ ¬x5 ∧ x6 ∧ x7 ∧ x8
2) ¬x1 ∧ x2 ∧ x3 ∧ x4 ∧ x5 ∧ ¬x6 ∧ x7 ∧ ¬x8
3) ¬x1 v x2 v x3 v x4 v x5 v x6 v ¬x7 v x8
4) ¬x1 v x2 v x3 v x4 v x5 v ¬x6 v x7 v ¬x8
Для групповых операций с файлами используются маски имён файлов. Маска представляет собой последовательность букв, цифр и прочих допустимых в именах файлов символов, в которой также могут встречаться следующие символы.
Символ «?» (вопросительный знак) означает ровно один произвольный символ. Символ «*» (звёздочка) означает любую последовательность символов произвольной длины, в том числе «*» может задавать и пустую последовательность.
В каталоге находятся шесть файлов:
cba.doc cat.doc rat.docx bat.docx all.dat whale.dll
Ниже представлено восемь масок. Сколько из них таких, которым соответствуют ровно три файла из данного каталога?
*?a*?.d?* | *?а*. ???* | *?a?.d?? | *.? |
*a?.d*c* | *??a*?.d?* | ?а*. d?c* | *at*.*d* |
1) 1
2) 2
3) 4
4) 6
Автомат получает на вход четырёхзначное число. По этому числу строится новое число по следующим правилам.
1. Складываются первая и вторая, затем вторая и третья, а далее третья и четвёртая цифры исходного числа.
2. Полученные три числа записываются друг за другом в порядке убывания (без разделителей).
Пример. Исходное число: 7531. Суммы: 7 + 5 = 12; 5 + 3 = 8; 3 + 1 = 4. Результат: 1284.
Укажите наименьшее число, в результате обработки которого автомат выдаст число 1252.
Дан фрагмент электронной таблицы.
A | B | C | D | |
1 | 1 | 3 | 7 | 9 |
2 | 13 | 15 | 19 | |
3 | 23 | 25 | 27 | =B$3*2+C$4 |
4 | 21 | 31 | 33 | 41 |
Формулу из ячейки D3 скопировали в ячейку С2 так, что числовое значение ячейки С2 стало отличаться от числового значения ячейки D3. Каково стало числовое значение ячейки С2?
На студии при двухканальной (стерео) звукозаписи с 16-битным разрешением за 1 минуту был записан звуковой файл. Сжатие данных не производилось. Известно, что размер файла оказался 7500 Кбайт. С какой частотой дискретизации (в кГц) велась запись? В качестве ответа укажите только число, единицы измерения указывать не нужно.
Определите, что будет напечатано в результаты работы следующего фрагмента программы.
Бейсик
DIM k, s AS INTEGER
s = 0
к = 0
WHILE к < 200
s = s + 64
к = к + 16
WEND
PRINT s
Алгоритмический язык
нач
цел k, s
s : = 0
k := 0
нц пока k < 200
s := s + 64
k := k + 16
кц
вывод s
кон
Паскаль
var k, s: integer;
begin
s : = 0 ;
k := 0;
while k < 200 do
begin
s := s + 64;
k := k + 16;
end;
write (s);
end.
Си
{
int к, s;
s = 0 ;
к = 0;
while (k < 200) {
s = s + 64 ;
к = к + 16 ;
}
printf("%d", s) ;
}
Для кодирования некоторой последовательности, состоящей из букв А, Б, В, Г и Д, решили использовать неравномерный двоичный код, позволяющий однозначно декодировать двоичную последовательность, появляющуюся на приёмной стороне канала связи. Использовали код: А — 100; Б — 0; В — 110; Г — 111.
Укажите, каким кодовым словом должна быть закодирована буква Д. Длина этого кодового слова должна быть наименьшей из всех возможных. Код должен удовлетворять свойству однозначного декодирования. Если таких кодов несколько, укажите код с наименьшим числовым значением.
Сколько существует различных символьных последовательностей длины 6 в трёхбуквенном алфавите {А, В, С}, которые содержат ровно три буквы А?
Ниже на четырёх языках программирования записан рекурсивный алгоритм F.
Бейсик
SUB F(n)
IF n <= 5 THEN
F(n + 2)
PRINT n
F (n + 3)
END IF
END SUB
Алгоритмический язык
алг F(цел n)
нач
если n <= 5 то
F(n + 2)
вывод n, нс
F(n + 3)
все
кон
Паскаль
procedure F(n: integer);
begin
if n <= 5 then
begin
F(n + 2);
writeln (n);
F(n + 3)
end
end
Си
void F(int n)
{
if (n <= 5)
{
F(n + 2) ;
printf("%d\n", n);
F(n + 3) ;
}
}
Чему равна сумма всех чисел, напечатанных на экране при выполнении вызова F(l)?
В терминологии сетей TCP/IP маской сети называется двоичное число, определяющее, какая часть IP-адреса узла сети относится к адресу сети, а какая — к адресу самого узла в этой сети. Обычно маска записывается по тем же правилам, что и IР-адрес, — в виде четырёх байтов, причем каждый байт записывается в виде десятичного числа. При этом в маске сначала (в старших разрядах) стоят единицы, а затем с некоторого места — нули. Адрес сети получается в результате применения поразрядной конъюнкции к заданному IP-адресу узла и маске.
Например, если IP-адрес узла равен 131.111.255.131, а маска равна 255.255.192.0, то адрес подсети равен 131.111.192.0.
Для узла с IP-адресом 122.160.147.132 адрес сети равен 122.160.146.0. Чему равен третий слева байт маски? Ответ запишите в виде десятичного числа.
Для регистрации на сайте некоторой страны пользователю требуется придумать пароль. Длина пароля — ровно 11 символов. В качестве символов используются цифры 2, 4, 6, 8 и 15 различных букв местного алфавита, причём все буквы используются в двух начертаниях: как строчные, так и прописные (регистр буквы имеет значение!).
Под хранение каждого такого пароля на компьютере отводится минимально возможное и одинаковое целое количество байтов, при этом используется посимвольное кодирование и все символы кодируются одинаковым и минимально возможным количеством битов.
Определите объём памяти (в байтах), который занимает хранение 70 паролей. В ответе укажите только число.
Ниже приведён фрагмент программы, записанный на разных языках программирования. При каком наименьшем введённом числе а после выполнения программы значение переменной с будет равно 17?
Бейсик
INPUT а
b = 15
а = - а - 3 * b
IF а > b THEN
c = b + 1
ELSE
с = b + 2
END IF
Паскаль
readln(a);
b := 15;
a := - a - 3 * b;
if a > b then
c : = b + 1
else
c : = b + 2;
Си
scanf("%d", &а);
b = 15;
a = - a - 3 * b;
if (a > b)
c = b + 1;
else
c = b + 2;
Алгоритмический язык
ввод a
b:= 15
a:= - a - 3 * b
если a > b
то c := b + 1
иначе c := b + 2
все
На рисунке — схема дорог, связывающих города А, Б, В, Г, Д, Е, Ж, И, К, М. По каждой дороге можно двигаться только в одном направлении, указанном стрелкой. Сколько существует различных путей, ведущих из города А в город М и не проходящих через город Г?
Известно, что для натурального числа х справедливо равенство
Определите значение х. Ответ запишите в десятичной системе счисления.
В языке запросов поискового сервера для обозначения логической операции «ИЛИ» используется символ «|», а для логической операции «И» — символ «&».
В таблице приведёны запросы и количество найденных по ним страниц некоторого сегмента сети Интернет.
Запрос | Найдено страниц (в тыс) |
сафари | лев | крокодил | 800 |
сафари | 290 |
лев | крокодил | 600 |
Компьютер печатает количество страниц (в тысячах), которое будет найдено по следующему запросу:
Укажите целое число, которое напечатает компьютер.
Считается, что все запросы выполнялись практически одновременно, так что набор страниц, содержащих все искомые слова, не изменялся за время выполнения запросов.
На числовой прямой даны два отрезка: Р = [3, 20] и Q = [6, 12].
Укажите наибольшую возможную длину промежутка А, для которого формула
((x ∈ P) ~ (x ∈ Q)) → ¬(x ∈ A)
тождественно истинна, то есть принимает значение 1 при любом значении переменной х.
В программе описан одномерный целочисленный массив с индексами от 0 до 10. Ниже представлен записанный на разных языках программирования фрагмент одной и той же программы, обрабатывающей данный массив.
Бейсик
s = 0
n = 10
FOR i = 0 ТО n - 1
s = s + A(i) + А(i+1)
NEXT i
Паскаль
s : = 0 ;
n := 10;
for i := 0 to n - 1 do begin
s := s + A[i] + A[i +1]
end;
Алгоритмический язык
s : = 0
n := 10
нц для i от 0 до n - 1
s := s + A[i] + A[i+1]
кц
Си
s = 0;
n = 10;
for (i = 0; i <= n - 1; i++)
s = s + A [ i ] + A [ i +1 ] ;
В начале выполнения этого фрагмента в массиве находились двухзначные чётные натуральные числа. Какое наименьшее значение может иметь переменная s после выполнения данной программы?
Ниже на четырёх языках записан алгоритм. Получив на вход число х, этот алгоритм печатает два числа: L и М. Укажите наименьшее из таких чисел х, при вводе которых алгоритм печатает сначала 3, а потом 8.
Бейсик
DIM X, L, М AS INTEGER
INPUT X
L = 0: M = 0
WHILE X > 0
L = L + 1
IF М < (X MOD 10) THEN
М = X MOD 10
END IF
X = X \ 10
WEND
PRINT L
PRINT M
Паскаль
var x, L, M: integer;
begin
readln(x);
L := 0; M := 0;
while x > 0 do
begin
L := L + 1;
if M < (x mod 10) then
M := x mod 10;
x := x div 10;
end;
writeln(L); write(M);
end.
Си
#include<stdio.h>
void main()
{
int x, L, M;
scanf("%dH, &x) ;
L = 0; M = 0;
while (x > 0) {
L = L + 1;
if M < x % 10 {
M = x % 10
}
x = x /10;
}
printf("%d\n%d", L, M);
}
Алгоритмический язык
алг
нач
цел х, L, М
ввод X
L := 0; M := 0
нц пока х > 0
L : = L + 1
если М < mod(x,10) то
М := mod(х,10)
все
х := div(х,10)
кц
вывод L, нс, М
кон
Определите, какое число будет напечатано в результате выполнения следующего алгоритма (для Вашего удобства алгоритм представлен на четырёх языках программирования).
Бейсик
DIM А, В, Т, R AS INTEGER
А = -20: В = 20
R = F (А)
FOR Т = А ТО В
IF F(Т) < R THEN
R = F (Т)
END IF
NEXT Т
PRINT R
FUNCTION F (x)
F = 5 * (x + 3) * (x - 3)
END FUNCTION
Паскаль
var a, b, t, R: integer;
function F(x: integer): integer;
begin
F := 5 *(x + 3) * (x - 3);
end;
begin
a := -20; b := 20;
R := F(a);
for t := a to b do
begin
if (F(t) < R) then begin
R := F(t);
end;
end;
write(R);
end.
Си
int F(int х)
{
return 5 *(х + 3)*(х - 3);
}
void main()
{
int а, b, t, R;
a = -20; b = 20;
R = F (a) ;
for (t = a; t <= b; t++) {
if (F(t) < R) {
R = F(t) ;
}
}
printf("%d", R);
}
Алгоритмический язык
нач
цел а, b, t, R
a := -20; b := 20
R := F(а)
нц для t от а до b
если F(t)< R то
R := F(t)
все
кц
вывод R
кон
алг цел F(цел х)
нач
знач := 5 *(х + 3) *(х - 3)
кон
У исполнителя Увеличитель две команды, которым присвоены номера:
1. прибавь 1,
2. умножь на 3.
Первая из них увеличивает число на экране на 1, вторая умножает его на 3.
Программа для Увеличителя — это последовательность команд.
Сколько есть программ, которые число 1 преобразуют в число 24?.
Сколько существует различных наборов значений логических переменных x1, х2, ... x9, x10, которые удовлетворяют всем перечисленным ниже условиям?
((x1 ~ x3) v (x2 ~ x4)) ∧ (¬((x1 ~ x3) ∧ ¬(x2 ~ x4))) = 0
((x2 ~ x4) v (x5 ~ x7)) ∧ (¬((x2 ~ x4) ∧ ¬(x5 ~ x7))) = 0
((x5 ~ x7) v (x6 ~ x8)) ∧ (¬((x5 ~ x7) ∧ ¬(x6 ~ x8))) = 0
((x6 ~ x8) v (x9 ~ x10)) ∧ (¬((x6 ~ x8) ∧ ¬(x9 ~ x10))) = 0
((x1 ~ x3) → (x2 ~ x4)) → ((x6 ~ x8) v ¬(x9 ~ x10)) = 1
В ответе не нужно перечислять все различные наборы значений x1, х2, ... x9, х10, при которых выполнена данная система равенств. В качестве ответа Вам нужно указать количество таких наборов.
Часть 2.
Запишите сначала номер задания (24, 27 и т. д.), затем полное решение. Ответы записывайте чётко и разборчиво.
На обработку поступает последовательность из четырёх неотрицательных целых чисел (некоторые числа могут быть одинаковыми). Нужно написать программу, которая выводит на экран количество всех чисел исходной последовательности, которые делятся на 11, и сумму таких чисел. Если в последовательности нет чисел, которые делятся на 11, то на экран нужно вывести «NO». Известно, что вводимые числа не превышают 1000. Программист написал программу неправильно. Ниже эта программа для Вашего удобства приведёна на четырёх языках программирования.
Бейсик
CONST n = 4
count = 0
sum = 0
FOR I = 1 ТО n
INPUT x
IF x mod 11 = 0 THEN
count = count + 1
sum = x
END IF
NEXT I
IF sum > 0 THEN
PRINT count
PRINT sum
ELSE
PRINT "NO"
END IF
Алгоритмический язык
алг
нач
цел n = 4
цел i, х
цел sum, count
count := 0
sum := 0
нц для i от 1 до n
ввод x
если mod(x, 11) = 0 то
count := count + 1
sum := х
все
кц
если sum > 0
то
вывод count, нс
вывод sum, нс
иначе
вывод "NO"
все
кон
Паскаль
const n = 4;
var i, x: integer;
var sum, count: integer;
begin
count := 0;
sum := 0;
for i := 1 to n do
begin
read(x);
if x mod 11 = 0 then
begin
count := count + 1;
sum := x
end
end;
if sum > 0 then
begin
writeln(count);
writeln(sum)
end
else
writeln('NO')
end.
Си
#define n 4 void main(void)
{
int i, x;
int sum, count;
count = 0;
sum = 0;
for (i = 1; i <= n; i++)
#include <stdio.h>
{
scanf("%d", &x) ;
if (x % 11 == 0)
{
count++;
sum = x;
}
}
if (sum > 0)
{
printf("%d\n", count);
printf("%d\n", sum);
}
else
printf("N0\n");
}
Последовательно выполните следующее.
1. Напишите, что выведет эта программа при вводе последовательности: 22 33 65 45
2. Приведите пример такой последовательности, содержащей хотя бы одно число, кратное 11, что, несмотря на ошибки, программа печатает правильный ответ.
3. Найдите все ошибки в этой программе (их может быть одна или несколько). Известно, что каждая ошибка затрагивает только одну строку и может быть исправлена без изменения других строк. Для каждой ошибки:
1) выпишите строку, в которой сделана ошибка;
2) укажите, как исправить ошибку, т.е. приведите правильный вариант строки. Достаточно указать ошибки и способ их исправления для одного языка программирования.
Обратите внимание, что требуется найти ошибки в имеющейся программе, а не написать свою, возможно, использующую другой алгоритм решения. Исправление ошибки должно затрагивать только строку, в которой находится ошибка.
Примечание: 0 делится на любое целое число.
Содержание верного ответа
Решение использует запись программы на Паскале. Допускается использование программы на трёх других языках программирования.
1. Программа выведет два числа: 2 и 33.
2. Пример последовательности, содержащей числа, кратные 11, и для которой программа работает правильно: 1 3 11 20.
Замечание для проверяющего. В конце работы программы значение переменной sum всегда равно последнему числу последовательности, которое делится на 11, или 0, если в последовательности нет чисел, кратных 11. Значение переменной count вычисляется правильно. Ввиду второй ошибки программа будет работать верно, если:
1) в последовательности сумма чисел, кратных 11, равна последнему числу, кратному 11;
2) это число больше 0.
В программе есть две ошибки.
Первая ошибка: неверное присваивание при вычислении текущей суммы.
Строка с ошибкой:
sum := х
Верное исправление:
sum := sum + х
Вторая ошибка: неверная проверка наличия чисел, кратных 11, при печати.
Строка с ошибкой:
if sum > 0 then
Верное исправление:
if count > 0 then
Дан целочисленный массив из 40 элементов. Элементы массива могут принимать целые значения от -10 000 до 10 000 включительно. Опишите на естественном языке или на одном из языков программирования алгоритм, позволяющий найти и вывести количество пар элементов массива, сумма которых кратна 13 и положительна. Под парой подразумеваются два подряд идущих элемента массива.
Исходные данные объявлены так, как показано ниже на примерах для некоторых языков программирования и естественного языка. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать некоторые из описанных переменных.
Бейсик
N = 40
DIM A(N) AS INTEGER
DIM I, J, К AS INTEGER
FOR I = 1 TO N
INPUT A(I)
NEXT I
. . .
END
Алгоритмический язык
алг
нач
цел N = 40
цел таб а[1:N]
цел i, j, k
нц для i от 1 до N
ввод а[i]
кц
...
кон
Паскаль
const
N = 40;
var
a: array [1..N] of integer;
i, j, k: integer;
begin
for i := 1 to N do
readln(a[i]);
...
end.
Си
#include <stdio.h>
#define N 40
void main()
{
int a[N];
int i, j, k;
for (i = 0; i < N; i++)
scanf ("%d", &a[i]);
...
}
Естественный язык
Объявляем массив А из 40 элементов.
Объявляем целочисленные переменные I, J,
В цикле от 1 до 40 вводим элементы массива А с 1-го по 40-й.
Содержание верного ответа
На языке Паскаль
for i := 1 to N - 1 do
if ((a[i] + a[i+l]) mod 13 = 0) and (a[i] + a[i+l] > 0) then
inc(k);
writeln(k);
На алгоритмическом языке
k := 0
нц для i от 1 до N - 1
если mod(a[i] + a[i+l],13) = 0 и a[i] + a[i+l] > 0
то
k := k + 1
все
кц
вывод к
На языке Бейсик
K = 0;
FOR I = 1 ТО N - 1
IF (А(I) + А(1+1)) MOD 13 = 0 AND А(1) + А(1+1) > 0 THEN
К = К + 1
END IF
NEXT I
PRINT К
На языке Си
k = 0;
for (i =0; i < N - 1; i++)
if ((a[i] + a[i+l]) % 13 == 0 && a[i] + a[i+l] > 0)
k++ ;
printf("%d", k);
На естественном языке
Записываем в переменную К начальное значение, равное 0. В цикле от первого элемента до предпоследнего находим остаток от деления суммы текущего и следующего элементов массива на 13. Если значение данного остатка равно 0 и сумма текущего и следующего элементов массива больше 0, увеличиваем переменную К на единицу.
После завершения цикла выводим значение переменной К
Два игрока, Петя и Вася, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в кучу один или три камня или увеличить количество камней в куче в два раза. Например, имея кучу из 12 камней, за один ход можно получить кучу из 13, 15 или 24 камней. У каждого игрока, чтобы делать ходы, есть неограниченное количество камней.
Игра завершается в тот момент, когда количество камней в куче становится не менее 100. Победителем считается игрок, сделавший последний ход, т.е. первым получивший кучу, в которой будет 100 или больше камней.
В начальный момент в куче было S камней, 1 < S < 99.
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока — значит описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при раз¬личной игре противника.
Выполните следующие задания. Во всех случаях обосновывайте свой ответ.
Задание 1
а) Укажите все такие значения числа S, при которых Петя может выиграть в один ход. Обоснуйте, что найдены все нужные значения S, и укажите выигрывающие ходы.
б) Укажите такое значение S, при котором Петя не может выиграть за один ход, но при любом ходе Пети Вася может выиграть своим первым ходом. Опишите выигрышную стратегию Васи.
Задание 2
Укажите два таких значения S, при которых у Пети есть выигрышная стратегия, причём одновременно выполняются два условия:
— Петя не может выиграть за один ход;
— Петя может выиграть своим вторым ходом независимо от того, как будет ходить Вася.
Для каждого указанного значения S опишите выигрышную стратегию Пети.
Задание 3
Укажите значение хотя бы одно значение S, при котором одновременно выполняются два условия:
— у Васи есть выигрышная стратегия, позволяющая ему выиграть первым или вторым ходом при любой игре Пети;
— у Васи нет стратегии, которая позволит ему гарантированно выиграть первым ходом.
Для указанного значения S опишите выигрышную стратегию Васи. Постройте дерево всех партий, возможных при этой выигрышной стратегии Васи (в виде рисунка или таблицы). На рисунке на рёбрах дерева указывайте, кто делает ход; в узлах — количество камней в позиции.
Содержание верного ответа
Задание 1.
а) Петя может выиграть, удвоив количество камней в куче, если S = 50, ... 99. При меньших значениях S за один ход нельзя получить кучу, в которой не менее 100 камней.
б) Вася может выиграть первым ходом (как бы ни играл Петя), если исходно в куче будет S = 49 камней. Тогда после первого хода Пети в куче будет 50, 52 или 98 камней. Во всех случаях Вася удваивает количество камней и выигрывает в один ход.
Задание 2.
Возможные значения S: 46, 48. В этих случаях Петя, очевидно, не может выиграть первым ходом. Однако он может получить кучу из 49 камней. Эта позиция разобрана в п. 16). В ней игрок, который будет ходить (теперь это Вася), выиграть не может, а его противник (то есть Петя) следующим ходом выиграет.
Задание 3.
Возможные значения S: 45, 47.
Например, для S = 45 после первого хода Пети в куче будет 46, 48 или 90 камней. Если в куче станет 90 камней, Вася удвоит количество камней и выиграет первым ходом. Ситуация, когда в куче 46 или 48 камней, разобрана в п. 2. В этой ситуации игрок, который будет ходить (теперь это Вася), выигрывает своим вторым ходом.
В таблице изображено дерево возможных партий при описанной стратегии Васи для первого возможного значения. Для второго возможного значения дерево строится аналогично.
Заключительные позиции (в ни выигрывает Вася) подчеркнуты. На рисунке это же дерево изображено в графическом виде (оба способа допустимы).
Каждую секунду датчик передаёт по каналу связи неотрицательное вещественное число — результат некоторых измерений. Временем, в течение которого происходит передача, можно пренебречь. Необходимо найти в заданной серии показаний датчика максимальную сумму двух показаний, между моментами передачи которых прошло не менее 10 секунд. Значение каждого показания датчика не превышает 1000. Общее количество показаний датчика не превышает 10 000.
Напишите на любом языке программирования программу для решения поставленной задачи. Ваша оценка будет зависеть не только от правильности программы, но и от того, насколько она эффективна.
Программа считается эффективной по времени, если время работы программы пропорционально количеству полученных показаний прибора N, то есть при увеличении N в k раз время работы программы должно увеличиваться не более чем в k раз. Программа считается эффективной по памяти, если размер памяти, использованной в программе для хранения данных, не зависит от числа N и не превышает 1 килобайт. Максимальная оценка за правильную программу, эффективную по времени и по памяти, — 4 балла. Максимальная оценка за правильную программу, эффективную по времени, но неэффективную по памяти, — 3 балла.
Максимальная оценка за правильную программу, неэффективную ни по времени, ни по памяти, — 2 балла. Перед программой укажите версию языка и кратко опишите использованный алгоритм. В первой строке задаётся число N — общее количество показаний прибора. Гарантируется, что N > 10. В каждой из следующих N строк задаётся одно неотрицательное вещественное число — очередное показание датчика.
Пример входных данных:
11
12
45
5
4
25
23
21
20
10
12
26
Программа должна вывести одно число — описанное в условии произведение.
Пример выходных данных для приведённого выше примера входных данных: 38
Содержание верного ответа
Для построения программы, эффективной по времени, можно определить для каждого элемента входных данных максимальное значение от начала данных до этого элемента включительно. Затем нужно складывать каждый элемент, начиная с 11-го, со значением этого максимума, взятого на 10 элементов раньше, и выбрать наибольшую из этих сумм. Чтобы построить программу, эффективную и по времени, по памяти, заметим, что, поскольку при обработке очередного элемента входных данных используется максимум, найденный на 10 элементов раньше, достаточно хранить только 10 последних максимумов. Ниже приводится пример программы, реализующей эту идею
program task32;
const s = 10; {требуемое расстояние между показаниями}
var
N: integer;
a: array[0..s - 1] of real; {хранение показаний прибора}
{k-e введенное число записываем в ячейку a[k mod 3]}
а_: real; {ввод очередного показания}
mx: real; {максимальное введённое число}
{не считая 10 последних}
m: real; {максимальное значение суммы}
i: integer;
begin
readln(N);
{Ввод первых 10 чисел}
for i := 1 to s do
begin
readln(a_);
a[i mod s] := a_
end;
{Ввод остальных значений, поиск максимальной суммы }
mх := -1; т := -1;
for i := s + 1 to N do
begin
readln(a_);
if a[i mod s] > mx then mx := a[i mod s];
if a_ + mx > m then m := a_ + mx;
a[i mod s] : = a_
end;
writeln(m)
end.
№ | Ваш ответ | Ответ и решение | Первичный балл |
---|---|---|---|
Здесь появится результат первой части. Нажмите на кнопку «Завершить работу», чтобы увидеть правильные ответы и посмотреть решения. |