Районный этап олимпиады по информатике 9-11 классы 2017-18 учебный год.
Предлагаю рассмотреть решения, предложенные авторами олимпиады и моими учениками.
Задача №1. Стабильная машина
Ученый-исследователь в таблицу последовательно записывал результаты испытаний работы новой машины. Результатом каждого испытания является некоторое целое положительное число. Машина работает тем стабильнее, чем меньше перепад значений соседних испытаний.
Требуется: написать программу, определяющую по предложенным данным максимальный перепад значений соседних испытаний, и вывести их номера. Если таких пар испытаний несколько, то вывести номера всех в порядке возрастания
Входные данные: Первое число N (0 < N < 32767) – количество испытаний, далее N целых значений Hn (0 < Hn < 32767) – результаты испытаний
Выходные данные: Построчно пары чисел – номера пар испытаний с максимальным перепадом значений.
var
N, i, m: Integer;
A: array of Integer;
begin
readln(N);
SetLength(A, N);
for i := 0 to High(A) do readln(A[i]);
m := 0;
for i := 1 to High(A) do
if Abs(A[i] - A[i-1]) > m then m := Abs(A[i] - A[i-1]);
for i := 1 to High(A) do
if Abs(A[i] - A[i-1]) = m then writeln(i, ' ', i+1);
end.
Задача №2. Доска для записей
На пробковую доску крепятся записки. Записка представляет собой квадратный листочек со стороной a. Положение записки определяется координатами её верхнего левого угла в декартовой прямоугольной системе координат дверцы холодильника. Все записки для красоты имеют одинаковые размеры.
Требуется: написать программу, определяющую площадь видимой области записок.
Входные данные: Первые два целых числа, разделённых пробелом: n(0 < n < 100) – количество записок и a (0 < A < 10) – длина её стороны, далее n пар чисел x, y (0 < x, y < 65535), разделённых пробелом – целые координаты верхнего левого угла каждой записки.
Выходные данные: одно целое число – площадь видимой области поверхности записок.
var
N, A, i, j, Ans: Integer;
X, Y: array of Integer;
begin
readln(N, A);
SetLength(X, N);
SetLength(Y, N);
for i := 0 to N-1 do
readln(X[i], Y[i]);
Ans := A*A*N;
for i := 0 to N-1 do
for j := 0 to N-1 do
begin
if i = j then continue;
if (X[i] >= X[j]) and (X[i] <= X[j] + A) and
(Y[i] >= Y[j]) and (Y[i] <= Y[j] + A) then
Ans := Ans - (X[j] + A - X[i])*(Y[j] + A - Y[i])
else if (X[i] >= X[j]) and (X[i] <= X[j] + A) and
(Y[j] >= Y[i]) and (Y[j] <= Y[i] + A) then
Ans := Ans - (X[j] + A - X[i])*(Y[i] + A - Y[j])
end;
writeln(Ans);
end.
Задача №3. S-палиндромы
Палиндром – это число, которое слева-направо и справа-налево читается одинаково Например, 121, 3223, 4 – палиндромы. Число называется s-палиндромом, если его сумма цифр является палиндромом, причём само исходное число таковым не является. Например, таким s-палиндромом является число 137, так как его сумма цифр равна 11. Число 11 – палиндром, так как читается одинаково слева-направо и наоборот. Число 22 уже не будет s-палиндромом (несмотря на то, что сумма цифр – 4 – палиндром), так как само является палиндромом. Требуется написать программу, выводящую все s-палиндромы в указанном интервале.
Входные данные: В первой строке – два натуральных числа a, b (1 ≤ a, b ≤ 32767) – интервал чисел для поиска s-палиндромов.
Выходные данные: Выходной файл должен содержать N строк – числа s-палиндромы в интервале [a, b] (включая a и b), либо сообщение «NO», если таковых нет.
var
a, b, i, j, t, sum: Integer;
f, exists: Boolean;
s: String;
begin
readln(a, b);
exists := False;
for i := a to b do
begin
t := i;
Str(i, s);
sum := 0;
while t > 0 do
begin
sum := sum + t mod 10;
t := t div 10;
end;
f := False;
for j := 1 to Length(S) div 2 do
begin
if S[j] <> S[Length(S) - j + 1] then
begin
f := True;
Break;
end;
end;
if not f then
Continue;
Str(sum, s);
for j := 1 to Length(S) div 2 do
begin
if S[j] <> S[Length(S) - j + 1] then
begin
f := False;
Break;
end;
end;
if f then
begin
writeln(i);
exists := True;
end;
end;
if not exists then
writeln('NO');
end.
Задача №4. Учет трафика
Сотовый оператор чтобы привлечь клиентов, каждый месяц дарит пакет не тарифицируемых минут и сообщений, взимая при этом плату за все разговоры и сообщения сверх подарка. Оператор предоставляет ежемесячный отчёт о разговорах и сообщениях, чтобы пользователь мог легко убедиться в честности оператора и правильности выставленного счёта.
Требуется помочь пользователю рассчитать требуемую для оплаты сумму.
Входные данные: В первой строке одно число N (1 ≤ N ≤ 103) – число записей о звонках и сообщениях. Вторая строка содержит два целых P1 и P2 и два вещественных S1 и S2 числа, разделённых пробелами (1 ≤ P1, P2, S1, S2 ≤ 104). P1 и P2 – не тарифицируемое (подарочное) количество минут и SMS соответственно. S1 и S2 – стоимость минуты и стоимость SMS соответственно.
Далее N строк – информация о звонках и сообщениях. Для звонка: дата, время, длительность звонка в формате ММ:SS. Для сообщения: дата, время отсылки сообщения и кодовый текст «SMS». Формат даты DD.MM.YYYY, формат времени HH:MM:SS.
Выходные данные:Выходной файл должен содержать одно число – необходимая сумма оплаты с точностью до копейки.
var
i, j, k, n: Integer;
p1, p2: LongInt;
s1, s2, t: Real;
S: String;
m, sec: Integer;
f: Boolean;
begin
readln(n);
readln(p1, p2, s1, s2);
p1 := p1*60;
for i := 1 to n do
begin
readln(S);
f := False;
for j := 1 to Length(S) do
begin
if S[j] = ' ' then
begin
if f then
begin
if (S[j+1] = 'S') then
p2 := p2 - 1
else
begin
m := Ord(s[j+1]) - Ord('0');
m := m*10;
m := m + Ord(s[j+2]) - Ord('0');
sec := Ord(s[j+4]) - Ord('0');
sec := sec*10;
sec := sec + Ord(s[j+5]) - Ord('0');
p1 := p1 - m*60 - sec;
end;
break;
end
else
f := True;
end;
end;
end;
t := 0;
if (p1 < 0) then
t := t - p1/60*s1;
if (p2 < 0) then
t := t - p2*s2;
writeln(t:4:2)
end.
Задача №5. Игры для умных детей
В магазине «Умный ребенок» предлагается следующая игра Полем для игры выступает полоска, разделённая на квадраты. В каждом квадрате полоски написано некоторое натуральное число. Игрок в начальный момент времени ставит фишку перед первым квадратом и может совершать следующие движения: поставить фишку на следующий квадрат или перепрыгнуть квадрат. Попадая на определённый квадрат полоски, игрок прибавляет к своему счёту число, написанное в квадрате, на который он попал. До начала игры счёт игрока равен нулю. Задача игрока «пройти» полоску, набрав минимальное количество очков.
Требуется определить минимальную сумму баллов, за которую игрок может пройти полоску.
Формат входных данных: В первой строке одно число N (2 ≤ N ≤ 20) – длина полоски (количество квадратов). Во второй строке N натуральных чисел [1; 100] – последовательно значения, написанные на квадратах.
Формат выходных данных: Выходной файл должен содержать одно число – минимальная сумма баллов, за которую можно пройти игру.
program ideone;
uses Math;
var
N: Integer;
A, V: array of Integer;
i: Integer;
begin
readln(N);
SetLength(A, N);
SetLength(V, N);
for i := 0 to High(V) do
read(V[i]);
A[0] := V[0];
A[1] := V[1];
for i := 2 to High(V) do
A[i] := Min(A[i-2], A[i-1]) + V[i];
write(Min(A[N-2], A[N-1]));
end.
Материалы организаторов олимпиады в формате .pdf (скачать)