Выпуклая оболочка

advertisement
Методика и содержание подготовки учащихся к олимпиадам по программированию.
Дистанционный курс.
Выпуклая оболочка
Постановка задачи. Пусть
на плоскости дано множество
точек.
Требуется
построить
выпуклый многоугольник чтобы
для любой точки из заданного
множества было верно одно из
трех утверждений:
а) точка является вершиной
построенного многоугольника;
б)
точка
принадлежит
одной из сторон многоугольника;
в) точка лежит внутри
многоугольника.
(на рисунке показан пример
выпуклой оболочки).
Y
В реальности задачи часто
даются в упрощенном виде:
спрашивается длина выпуклой
оболочки (то есть периметр
полученного многоугольника).
Например,
в
формулировке
X
«какой длины забор придется
построить, чтобы огородить объекты, расположенные по координатам..» В самом простом случае,
если позволяет время, можно решить эту задачу и прямым перебором: рассмотрим все пары точек,
напишем для такой пары уравнение прямой, и подставим в него все остальные точки. Если все
остальные точки лежат в одной и той же полуплоскости, то данный отрезок принадлежит
выпуклой оболочке. Правда, время работы такого алгоритма можно оценить как O(n3) (для каждой
точки в худшем случае надо «примерить» все остальные в качестве пары; для каждой пары
подставить все остальные в уравнение прямой). Здесь мы обсудим два наиболее
распространенных метода для решения подобных задач.
Метод Джарвиса
1.
Найдем точку (обозначим ее P1), которая заведомо будет принадлежать выпуклой
оболочке (например, точку с минимальной координатой по y) и запомним ее.
2.
Для всех остальных точек определим полярные углы относительно P1 и выберем из
них ту, чей полярный угол является наименьшим (если таких точек несколько, то
выберем наиболее удаленную от P1). Это будет вторая точка выпуклой оболочки – P2,
запомним ее, например в массиве.
3.
Повторим шаг 2 для второй и последующих точек выпуклой оболочки.
Оценим время работы этого метода. Для каждой вершины выпуклой оболочки находятся
полярные углы всех остальных точек (за O(n)), и среди этих полярных углов ищется
минимум (еще за O(n)). Если оболочка состоит из h точек, то время работы равно O(hn).
Наихудшим будет случай, когда все точки исходного множества принадлежат выпуклой
оболочке. В этом случае время работы метода составит O(n2).
МЦНМО, 2007/08 учебный год
Методика и содержание подготовки учащихся к олимпиадам по программированию.
Дистанционный курс.
Зачастую в большинстве олимпиадных задач ставится дополнительное условие: «никакие
три точки» из множества не
лежат на одной прямой. В этом Y
случае сравнение по расстоянию
(и что самое главное, вычисление
этого расстояния) можно не
делать.
Также
необходимо
обратить внимание учащихся на
возможность
«вырожденного
случая», когда в исходном
наборе всего одна или две точки,
P3
или все точки исходного набора
лежат на одной прямой. В таких
частных случаях построение
выпуклой оболочки попросту
невозможно, что требует, с
P2
другой
стороны,
особой
аккуратности
при
формулировании задач, чтобы
учащиеся не тратили время на
P1
обработку частных случаев,
которые не предусматривались
автором данной задачи.
X
Метод Грэхема
1.
Найдем точку (назовем ее P1), заведомо принадлежащую выпуклой оболочке
(например, точку с минимальной координатой по y).
2.
Отсортируем все остальные точки по возрастанию
6
полярного угла относительно P1, в случае равенства
4
полярных углов – по возрастанию расстояния до нее
5
(полученный порядок обхода точек показан на рисунке;
красным цветом показан
луч, от
которого
3
отсчитываются полярные углы).
7
3.
Для всех отсортированных точек выполним обход
2
Грэхема. Пусть уже построена некоторая часть
P1
выпуклой оболочки. Тогда:
a. если на следующем шаге поворот делается против
часовой стрелки (что можно выяснить с помощью
свойства векторного произведения), то следующая
6
точка включается в оболочку (например, если первая
4
и вторая точки включены в выпуклую оболочку, и
5
рассматривается третья, то на этом этапе она должна
быть также включена, так как поворот от 2-й к 3-й
3
делается против часовой стрелки; синим цветом на
7
рисунке показаны стороны, которые принадлежат
2
выпуклой оболочке на данном шаге);
P1
b. если в следующем шаге поворота не делается, то
МЦНМО, 2007/08 учебный год
Методика и содержание подготовки учащихся к олимпиадам по программированию.
Дистанционный курс.
4.
последняя добавленная точка исключается из выпуклой оболочки и добавляется
новая (так, при рассмотрении точки 4 необходимо исключить из оболочки точку 3,
и поставить новую точку вместо нее).
c. если на следующем шаге делается поворот по
часовой стрелке, то последняя (или даже несколько)
6
точек исключается из выпуклой оболочки и вместо
4
5
них добавляется новая (так, при рассмотрении точки
6 оказывается, что от точки 5 к ней делается поворот
3
по часовой стрелке; в этом случае точка 5
исключается из выпуклой оболочки; фиолетовым
7
2
цветом показаны исключенные отрезки).
Процесс продолжается, пока все точки не будут
P1
обработаны. Также необходимо проверить поворот от
последней точке к P1 и при необходимости исключить несколько точек в конце
оболочки.
Что должен уметь учитель?
В современных условиях далеко не все учителя могут позволить себе успевать за всеми
нововведениями во всех областях, а зачастую очень хочется показать ученикам разные новые
возможности информационных технологий.
Подготовка преподавателя в олимпиадной области требует довольно много времени и сил,
особенно если обстоятельства складываются так, что весь материал приходится прорабатывать
самостоятельно, без помощи учителей математики, которые могли бы взять на себя объяснения
отдельных крупных разделов курса (той же геометрии).
Требования… даже не столько требования, а пожелания к подготовке преподавателя можно
свести к следующим:
1.
уметь подобрать задачу по теме и по силам ученикам (то есть понимать, какие
знания могут потребоваться для решения конкретной задачи, какие технические или
алгоритмические сложности придется преодолевать ученикам). Почему
«подобрать»? Потому что на данный момент накоплен очень большой опыт и издано
много литературы с задачами, готовыми тестами к ним.
2.
уметь адаптировать задачу для уровня учеников и целей занятия (например,
понимать какие ограничения и частные случаи являются существенными для
понимания алгоритма вообще, а на какие детали можно пока не обращать внимания,
пока тема не освоена в целом)
3.
уметь составлять задачи для проведения школьных олимпиад (составлять задачи
желательно так, чтобы у учащихся не возникало большого количества вопросов по
условию).
4.
уметь составлять тесты к задачам или адаптировать уже имеющиеся наборы тестов.
5.
уметь вместе со школьником проанализировать алгоритм решения задачи и указать
на слабые стороны решения (или по конкретному тесту, который не прошла
программа, сказать что именно не предусмотрел школьник).
6.
уметь самостоятельно писать программы – не обязательно. Это действительно так,
поскольку в настоящее время существует не только большое количество разных
систем программирования (Visual C++, Dev C++, Visual Basic, Delphi, Java, C# и т.д.),
то даже в рамках одной школы у заинтересованных школьников можно наблюдать
МЦНМО, 2007/08 учебный год
Методика и содержание подготовки учащихся к олимпиадам по программированию.
Дистанционный курс.
неохватное (для одного человека) многообразие программных средств, со своими
особенностями и тонкостями.
Коснемся немного формулировок олимпиадных задач, которые не привыкшему школьнику
могут показаться «громоздкими».
Пример.
Шнурки (источник – московские окружные олимпиады, 2007)
Обувная фабрика собирается начать выпуск элитной модели ботинок. Дырочки для шнуровки будут
расположены в два ряда, расстояние между рядами равно a, а расстояние между дырочками в ряду b. Количество
дырочек в каждом ряду равно N (все числа неотрицательные, не превышают 100).
(Классический способ
Шнуровка должна происходить элитным способом «наверх, по
шнуровки неприменим
горизонтали в другой ряд, наверх, по горизонтали и т.д.» (см. рисунок).
для элитной обуви!)
Кроме того, чтобы шнурки можно было завязать элитным бантиком,
длина свободного конца шнурка должна быть l.
Какова должна быть длина шнурка для этих ботинок?
Формат входных данных
Вводятся четыре натуральных числа a, b, l и N.
Формат выходных данных
Ваша программа должна выводить одно число – искомую длину шнурка.
Пример (см. рисунок)
Входные данные
2 1 3 4
Выходные данные
26
а
l
b
b
b
Если отбросить лирику, то задача сводится просто к нахождению суммарной длины
большого количества отрезков определенных длин. Что говорит ограничение «все числа
неотрицательные, не превышают 100»? Вернее, что должен в нем увидеть участник олимпиады.
1.
Все числа неотрицательные. В том числе число N (количество пар отверстий) не
может быть отрицательным, значит задача имеет смысл и не нужно писать
отдельную проверку на этот случай.
2.
Число N может быть равно 0 («неотрицательно» не значит «положительно»). То есть
возможно придется предусмотреть случай, когда есть только одна пара отверстий.
Будет ли это частный случай, или он впишется в общую картину – будет ясно по
ходу решения. Также, в условии допускаются нулевые расстояния.
3.
Числа не превышают 100. То есть максимально возможно 100 пар отверстий,
расположенных на расстоянии 100 друг от друга. Учитывая, что каждая половинка
шнура проходит снизу вверх одинаковый путь (который оценочно может быть около
10000), то общая длина оценивается числом 20000, что уже может считаться
достаточно близким к диапазону типа Integer (для Паскаля).
4.
Тип шнуровки подразумевает не вычисление диагоналей по теореме Пифагора, а
простое суммирование длин. Поэтому при написании программы достаточно
пользоваться целочисленными типами данных.
МЦНМО, 2007/08 учебный год
Download