Изменить стиль страницы

Для последовательности с 5 членами есть только один подлежащий размещению член, и все идет очень быстро. Но сложность растет с ростом n очень круто. Если при 5 членах есть только один подлежащий размещению член, то с n = 6 их уже два и задача квадратична. Для произвольного n число подлежащих испытанию случаев имеет порядок nn−4.

Можно, наверное, и еще ускорить. Если даны пак (значение последнего члена), то известно максимальное число возможных повторений, и можно выбрать наилучшие исходные значения. Если есть право на r повторений, то можно брать не более r − 1 последовательных членов, начиная с a2, и, если они взяты как исходные значения, то права на повторение больше нет. Тем не менее эта задача расходует огромное количество машинного времени…

Головоломка 24.

В этой задаче я вас полностью предоставляю себе. Принцип все тот же. Но нужно как следует все организовать. Желаю успеха.

Головоломка 25.

Здесь, наоборот, помощь может оказаться далеко не лишней. Эта программа потребовала от меня массу времени. Кроме того, это поучительный случай, который я сохраняю в своих архивах как типичный пример для целого класса задач.

Среди информатиков есть два принципиально разных взгляда на программирование. Есть школа, приверженцы которой сначала проделывают всю математическую работу; они считают, что для того, чтобы написать хорошую программу, нужно сначала доказать некоторое свойство данных, а затем использовать его для получения результата. Сначала сделайте математику, а информатика придет позже. Таким образом, это способствует рассмотрению информатики как ветви математики.

Но есть и другой подход. Напишите сначала программу, пусть даже неэффективную. Затем понаблюдайте за ее поведением или постарайтесь прояснить ее действие. С помощью подходящих преобразований сделайте ее более результативной. Довольно часто я получаю таким образом весьма эффективные результаты, и я убежден, что в этом состоит новый метод создания алгоритмов. Но бывают упорно сопротивляющиеся случаи. Эта головоломка — один из них.

Начну со следующего замечания: речь идет о том, чтобы образовать все возможные перестановки и выбросить все те, которые не удовлетворяют условиям задачи.

Рассмотрим сначала случай 9 девушек. Обозначим их

а, б, в, г, д, е, ж, з, и.

Первая прогулка может быть выбрана произвольно. Возьмем:

<i>а б в</i>

<i>г д е</i>

<i>ж з и</i>

Беря в качестве строк столбцы этой таблицы первой прогулки, получаем вторую прогулку:

<i>а г ж</i>

<i>б д з</i>

<i>в е и</i>

Диагонали приводят к двум оставшимся прогулкам:

<i>а д и   а е з</i>

<i>в г з   б г и</i>

<i>б е ж   в д ж</i>

Все благополучно, Попробуем теперь 15.

Первая прогулка

а б в г д е ж з и к л м н о п

Если вы возьмете в качестве трех первых строк второй прогулки начала столбцов первой прогулки:

<i>а г ж</i>

<i>б д з</i>

<i>в е и</i>

вы не сможете далее организовать 6 оставшихся букв в двух строчках, не повторяя пар. Но вы можете сохранить первые пары в этих трех строках и взять в качестве последних элементов соответственно ж, к, н. Посредством этого приема получаются в двух столбцах по три неиспользованных элемента, которые и можно взять в качестве новых строк. Получается вторая прогулка:

<i>а г ж</i>

<i>б д к</i>

<i>в е н</i>

<i>з л о</i>

<i>и м п</i>

Сейчас мы докажем некоторые свойства искомых прогулок. Но здесь я делаю вам подарок. Мне потребовалось несколько дней, чтобы сообразить все то, что следует ниже. Почему бы вам не предоставить себе несколько дней на размышление? Тогда закройте книгу на этом месте…

Рассмотрим подмножество из семи букв а, б, в, г, д, е, ж. Исходя из этих элементов, можно образовать 7 * 6/2 = 21 пару. В первой прогулке участвует 6 из этих пар:

аб ав бв зд ге дв

Во второй прогулке их пять:

аг аж гж бд ве

что составляет всего 11 пар. Таким образом, на оставшиеся 5 прогулок остается распределить 10 пар. Но поскольку есть 7 элементов и только 5 строк, то в каждой прогулке будет встречаться не менее двух таких нар. Следовательно, в каждой из оставшихся прогулок встретятся в точности две таких пары. Обозначим через x любую из выделенных букв, а остальные буквы будем обозначать точками. Оставшиеся 5 прогулок имеют вид

<i>x x .</i>

<i>x x .</i>

<i>x . .</i>

<i>x . .</i>

<i>x . .</i>

Но можно еще кое-что уточнить. Рассмотрим только первые 6 букв а, б, в, г, д, е. Они дают 15 пар, из которых 9 реализуются в двух первых прогулках. Таким образом, среди 5 оставшихся прогулок надлежит распределить 6 из них, что означает по одной паре в четырех из них и две в последней. Поэтому получаем:

<i>x x .  <div class="fb2-code"><code>&lt;i&gt;x x .  &lt;div class=&quot;fb2-code&quot;&gt;&lt;code&gt;&amp;lt;i&amp;gt;x x .  &amp;lt;div class=&amp;quot;fb2-code&amp;quot;&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;i&amp;amp;gt;x x .  &amp;amp;lt;div class=&amp;amp;quot;fb2-code&amp;amp;quot;&amp;amp;gt;&amp;amp;lt;code&amp;amp;gt;&amp;amp;amp;lt;i&amp;amp;amp;gt;x x .&amp;amp;amp;lt;/i&amp;amp;amp;gt;&amp;amp;lt;/code&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/i&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/i&amp;gt;&lt;/code&gt;&lt;/div&gt;&lt;/i&gt;</code></div></i>

<i>x ж .  <div class="fb2-code"><code>&lt;i&gt;x ж .  &lt;div class=&quot;fb2-code&quot;&gt;&lt;code&gt;&amp;lt;i&amp;gt;x ж .  &amp;lt;div class=&amp;quot;fb2-code&amp;quot;&amp;gt;&amp;lt;code&amp;gt;&amp;amp;lt;i&amp;amp;gt;x ж .  &amp;amp;lt;div class=&amp;amp;quot;fb2-code&amp;amp;quot;&amp;amp;gt;&amp;amp;lt;code&amp;amp;gt;&amp;amp;amp;lt;i&amp;amp;amp;gt;x x .&amp;amp;amp;lt;/i&amp;amp;amp;gt;&amp;amp;lt;/code&amp;amp;gt;&amp;amp;lt;/div&amp;amp;gt;&amp;amp;lt;/i&amp;amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/i&amp;gt;&lt;/code&gt;&lt;/div&gt;&lt;/i&gt;</code></div></i>