Четверг, 25.04.2024, 18:02
Информатика и математика в Плесской школе
Приветствую Вас Гость | RSS
Меню сайта
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа

Районный этап олимпиады по информатике 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 (скачать)

 

 

Поиск
Календарь
«  Апрель 2024  »
ПнВтСрЧтПтСбВс
1234567
891011121314
15161718192021
22232425262728
2930
Архив записей
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Учительский портал
    Copyright MyCorp © 2024