Разбор задач

advertisement
«Весенний LIST» 2016
Турнир
по программированию
КГБОУ «Центр образования «Эврика»
Задача A. Информатическая сила
(30 тестов)
Делимость
Требовалось проверить, могло ли быть в классе A
больше людей, чем в классе B. Очевидно, что если
максимально возможное количество человек в A не
превосходит минимальное возможное в B, то ответ
— «NO». В противном случае условие в любом
случае выполняется, и ответ — «YES».
Задача A. Информатическая сила
Максимально возможное количество человек в A равно
количеству решенных задач (каждый человек решил
хотя бы одну задачу). Минимально возможное
количество человек в классе B равно количеству
решенных задач, деленному на N с округлением в
большую сторону. Такую ситуацию можно получить
следующим образом: в классе B участники решали все
задачи, которые были на олимпиаде, но поскольку
информатическая сила может нацело не делиться на N,
то должен быть хотя бы один человек, который решил
не все задачи. Именно этого человека учитывает
округление. В итоге решение задачи сводилось к
проверке, больше ли A числа B, деленного на N с
округлением в большую сторону.
Задача A. Информатическая сила
Решение:
a = int(input())
b = int(input())
n = int(input())
print('Yes' if a > (b + n - 1) // n else 'No')
Задача B. Топот котов (24 теста)
Задача на условия.
Как решать?
• Считаем данные в массив a.
• Для всех квартир с номером больше m
проверим, должны ли жильцы платить
штраф.
• for (int I = m; I <= n*m; i++)
• if (a[i] > 2 * a[I – m]) ans += c;
• Выведем ответ.
Задача C. Спички (21 тест)
•
•
•
•
Задача на простой перебор.
Для каждого квадрата необходимы четыре спички. Однако
на плоскости каждая спичка может являться стороной одного
(С1К) или двух квадратов (С2К). Наша задача - минимизировать
число С1К.
Очевидно, что выкладываемая фигура должна представлять
собой фрагменты сетки с квадратными ячейками, сторонами
которых являются спички. Площадью фигуры (в спичках
квадратных) является количество квадратов. Количество С1К это периметр P фигуры.
Очевидно, что фигура должна быть связной. Если это не так, то
можно соединить ее отдельные части, сделав общей хотя бы
одну С1К (т.е. сделать ее С2К), тем самым уменьшив периметр.
Если фигура имеет внутри пустоту, можно заполнить ее
спичками, увеличив площадь и уменьшив периметр (левый
рисунок).
Задача C. Спички (21 тест)
Задача C. Спички (21 тест)
•
•
•
•
Задача на простой перебор.
Если фигура при обходе имеет подряд более одного вогнутого
угла, можно заполнить выемку спичками, увеличив площадь и
уменьшив периметр (средний рисунок).
Если фигура при обходе имеет один вогнутый угол между
двумя выпуклыми, можно заменить все три угла на один
выпуклый, заполнив выемку спичками. При этом увеличится
площадь и не изменится периметр (правый рисунок).
Если фигура - прямоугольник a*b, причем a-b>1, то можно
оставить периметр таким же и увеличить площадь, заменив эту
фигуру на прямоугольник (a-1)*(b+1).
Соответственно, если фигура - квадрат a*a или
прямоугольник (a+1)*a, то увеличить площадь, оставив
прежним или уменьшив периметр - НЕЛЬЗЯ.
Задача C. Спички (21 тест)
Задача C. Спички (21 тест)
Задача на простой перебор.
Зная периметр, вспомним, что
(N * 4 - P) спичек являются С2К, а P спичек - С1К.
Поэтому вычисляем количество спичек как
P + (N * 4 - P) / 2 = (N * 4 + P) / 2 = N * 2 + P / 2.
•
•
•
•
Задача D. Хаотическая перестановка
(35 тестов)
Задача на циклы.
Дана перестановка.
Разрешено сделать не более чем n обменов
соседних элементов.
Надо чтобы никакие три подряд идущих
элемента не были упорядоченными.
Задача D. Хаотическая перестановка
Как решать? (Конструкция)
• Будем добавлять элементы слева направо по
одному, поддерживая префикс хаотическим.
• Добавим очередной элемент.
• Если с последней тройкой все хорошо, делать
ничего не надо.
• Если последние три элемента упорядочены, то
надо поменять местами последние два.
• При этом не будут упорядочены ни последняя
тройка, ни предпоследняя.
Задача D. Хаотическая перестановка
Еще одно решение
• Можно решать задачу за не более, чем n / 2
обменов.
• Будем добавлять по два элемента сразу.
• Разбором случаев, можно доказать, что
достаточно поменять или последнюю или
предпоследнюю пару.
Задача E. Космические захватчики
(25 тестов)
Простая задача на условия.
Сначала почитаем в переменной b сумму всех
вражеских кораблей. Потом проверим: если
n div 2 меньше p, то в переменной c будем
хранить n - p (количество дополнительных ходов
к правому углу) + n - 1 (количество
дополнительных ходов к левому углу).
Если n div 2 больше или равен p то в c будем
хранить p - 1 + n - 1.
В конце выводим значение b + c.
Задача F. Коровы - в стойла
(16 тестов)
Бинарный поиск по ответу
Эта задача на бинпоиск по ответу. Нужно
придумать функцию F, которая проверяет, сколько
коров с переданным ей допустимым расстоянием
можно расставить, и возвращает true, если можно
расставить всех. Построим следующий график. Ось
абсцисс целочисленная, ось ординат булевская.
Отложим по оси абсцисс все допустимые
расстояния, меньше которых между коровами
быть не должно (от нуля до +∞), а по оси ординат
— можем ли мы расставить всех коров с таким
минимальным допустимым расстоянием.
Задача F. Коровы - в стойла
Легко видеть, что функция эта сначала принимает
только значения true, а с некоторого момента —
только значения false. По ней и будем делать
бинпоиск. Нас интересует, где достигается крайнее
правое значение true. Берём отрезок [A; B] на оси
абсцисс, покрывающий все возможные ответы на
задачу. Для его середины M вызываем функцию F.
Если она даёт true, то наш ответ лежит на отрезке
[M; B], иначе — на полуинтервале [A; M).
Рекурсивно вызываемся, творим бинпоиск и так
далее.
Задача G. Абсолютный Язык
(24 теста)
Задача на строки.
Пройдем по строке, начиная со второго символа до
конца, сравнивая текущий символ и предыдущий.
s = input()
ans = 0
for i in range(1, len(s)):
if s[i] == chr(ord(s[i - 1]) + 1):
ans += 1
print(ans)
Спасибо за внимание!
Download