Сайт учителя информатики

Муниципального бюджетного общеобразовательного учреждения

"Средняя общеобразовательная школа №3" станицы Советской

Козменко Виктора Петровича

Главная Кабинет информатики Олимпиада по информатики Методические материалы Скачать Расписание
факультативных занятий
Видео Фотогалерея

Карта сайта
Олимпиада по информатики

Задача 1: A и B

Поменять значения переменных A и B между собой, не заводя дополнительных переменных. Входной файл input.txt содержит числа a и b (0 <= a, b <= 32767). В выходном файле output.txt должны содержаться значения этих переменных после обмена.

Решение 01:

Первая мысль, приходящая в голову, это написать программу, похожую на эту:
A := B;
B := A;
Естественно, это программа работать не будет (в обеих переменных будет значение B).
Теперь поищем правильное решение. Обозначим начальное значение A за A1, B за B1. Тогда необходимо, чтобы по окончании работы программы A равнялось B1, а B - A1.
0) A = A1; B = B1;
1) Занесем в переменную A результат суммирования A и B (A := A + B):
A = A1 + B1; B = B1;
2) Занесем в переменную B разность A и B (B := A - B):
A = A1 + B1; B = A1;
3) Занесем в переменную A разность A и B (A := A - B):
A = B1; B = A1;

Код программы:
A := A + B;
B := A - B;
A := A - B;

Задача 2: Трамвайные билеты.

Написать программу определения количества шестизначных "счастливых" трамвайных билетов, у которых сумма первых трех цифр совпадает с суммой трех последних.
Оптимизировать решение по времени выполнения. Количество билетов вывести в файл output.txt

Решение 02:
Логично устроить цикл в цикле, затем считать сумму первых и последних трех цифр и сравнивать их между собой.
Как считать сумму цифр?
  For Spec := 1 to 3 do
  Begin
    K := K + Luck mod 10;
    Luck := Luck div 10;
  End;
где Luck - число, в котором надо посчитать сумму цифр, K - сумма цифр (более правильная реализация с циклом while, но это я предоставлю реализовать вам ;).
Итак, у нас два цикла, в которых перебираются 1000 чисел, итого 1000000 итераций, т.е. мы перебираем все возможные билеты, но делаем это не очень явно.
Попробуем разогнать программу в 1000 раз :). В этом нам поможет динамическое программирование, т.е. сохранение уже полученных однажды результатов.
Рассмотрим трехзначное число. Сумма цифр этого числа может принимать значения от 0 до 27, т.е. мы можем просто посчитать сколько чисел от 0 до 999 с данной суммой цифр и записать это значение в массив от 0 до 27.
Т.к. второе число также трехзначное, то мы можем пользоваться для него тем же массивом данных. Тогда, после подсчета кол-ва чисел с данной суммой цифр, мы можем достаточно просто подсчитать количество "счастливых билетов":
  For I := 0 to 27 do
    L := L + M[I] * M[I];
где I - счетчик, L - кол-во счастливых билетов, M - массив значений суммы цифр.
Удачи вам в реализации!

Задача 03: Скобки.

Проверить корректность расстановки скобок в арифметическом выражении.
Выражение задается из файла "input.txt" и может содержать произвольное количество круглых скобок.
Программа должна выдать одну строчку: "правильно" или "неправильно".

Решение 03:
Сначала разберемся, что считать правильной расстановкой скобок:
1) количество открытых скобок всегда больше либо равно количеству закрытых.
2) в конце выражения количество закрытых скобок равно количеству открытых.
В этой задаче возможно употребление, так называемого "конечного автомата", который изменяет свое состояние в зависимости от входных данных. Этот автомат должен иметь счетчик скобок, первоначально инициализированный нулем. Тогда:
1) при появлении символа "(" - увеличить счетчик на 1;
2) при появлении символа ")" - уменьшить счетчик на 1;
3) при появлении символа EOF - прекратить работу;
4) игнорировать появление любого другого символа.
Автомат мы создали, теперь надо правильно воспользоваться им для решения предложенной задачи.
Посмотрим на счетчик: он содержит количество открытых, но еще не закрытых скобок. Если счетчик стал меньше нуля, значит появилась лишняя закрывающая скобка, т.е. выражение неверно (нарушение пункта 1).
Если после завершения работы конечного автомата счетчик не равен нулю (т.е. не все скобки закрыты) то выражение неверно (нарушение пункта 2).
Полученная программа будет короткой и красивой.

 

 

Адрес нашей школы:
357329,
Ставропольский край,
Кировский район,
станица Советская,
улица Ленина, 60

телефон: приёмная 67-1-76
директор 67-1-73
E-mail:
schooln3@rambler.ru