Завдання ІІІ (міського) етапу 2005 року

1. Покриття iнтервалами, 8 балів
Відрізок числової прямої [a0; b0] належить об'єднанню скінченної кількості інтервалів [a1;b1], [a2;b2], …, [an;bn].

Завдання
Створіть програму cover.*, яка з даної множини інтервалів вибере найменшу кількість інтервалів, об'єднання яких містить даний відрізок [a0; b0].

Вхідні дані
Файл cover.dat містить у вказаному порядку натуральні числа a0, b0, a1, b1, …, an, bn, які не перевищують 65432, причому n < 10001.

Вихідні дані
Файл cover.res має містити лише послідовність натуральних чисел
aj(1), bj(1), aj(2), bj(2), …, aj(k), bj(k), для якої:

Вхідні дані ґарантують існування і єдиність розв'язку.

Приклад

cover.datcover.res
2 5 1 3 2 4 3 5 4 6 2 51 3 2 5 4 6

2. Трикутники, 18 балів

Завдання
Створіть програму triangle.*, яка з'ясує, чи можна з даних 4 трикутників утворити трикутник «склеюванням» вздовж сторони.

Вхідні дані
Кожний рядок файлу triangle.dat містить чотири трійки натуральних чисел, які є сторонами даних трикутників і менші за 321.

Вихідні дані
Відповідний рядок файлу triangle.res має містити:

Приклад

triangle.dattriangle.res
5 4 3 5 4 3 5 4 3 5 4 3
5 4 3 5 4 3 5 4 3 4 4 3
6 8 10
No solution

3. Многоґранник-2, 28 балів
Всі ґрані многоґранника — правильні многокутники. Кількості ґраней і ребер не перевищують відповідно 20 і 36. Всі ґрані многоґранника занумеровано послідовними натуральними числами, починаючи з 1. Ребра також занумеровано послідовними натуральними числами, починаючи з 1. При цьому менший номер суміжної ґрані не спадає, а для сталого меншого номера суміжної ґрані більший номер зростає. Для правильного 4-ґранника перелік у такому порядку пар суміжних ґраней має вигляд (1;2), (1;3), (1;4), (2;3), (2;4), (3;4).

Завдання
Створіть програму polyedr.* знаходження розгорток многоґранника.

Вхідні дані
j-ий рядок файла polyedr.dat містить повний перелік номерів ґраней, що мають з j-ою ґранню спільне ребро.

Вихідні дані
Файл polyedr.res має містити дані про різні розгортки многоґранника, в якому всі ґрані одного кольору — по одному рядку на кожну розгортку. Кожний такий рядок даних має містити у порядку зростання номери нерозрізаних ребер для відповідної розгортки. Файл має містити перші 15 таких наборів даних, які відповідають різним розгорткам многоґранника. Перші набори в розумінні такої послідовності перебору розгорток у процесі «доклеювання» ґраней:

Якщо кількість одноколірних розгорток менша за 15, то файл polyedr.res містить дані про всі такі розгортки. На кожне число файлу відвести по 3 позиції, останню обов'язково заповнити. Для кожного рядка всі числа записувати в порядку зростання, що не завжди відповідає описаному порядку вибору склеєних ребер.

Файл polyedr.out має містити лише кількість всіх симетрій многоґранника, яка не перевищує 120.

Приклад

polyedr.datpolyedr.respolyedr.out
2 3 4
3 4 1
4 1 2
1 2 3
1 2 3
1 2 5


24



4. Ханойськi башти, 10 балів
Диски з вирізаною серединою (форма бублика) перекладають таким чином:

Завдання
Створіть програму tower.* для визначення найменшої кількості переміщень дисків і розташування дисків після певної кількості переміщень, здійснених за оптимальним щодо кількості переміщень планом.

Вхідні дані
Файл tower.dat містить у вказаному порядку кількості дисків n і переміщень k, де n < 60, k < 1018.

Вихідні дані
Єдиний рядок файлу tower.res має містити у вказаному порядку, починаючи з першої позиції:

Диски занумеровано натуральними числами в межах від 1 до n включно у порядку зростання радіусів основ. Вмісти дисків розділено символом «*». Між числами, між числом і роздільником «*» лише 1 пропуск.

Приклади

tower.dattower.res
3 17 * 1 * * 2 3 *
3 27 * 1 * 2 * 3 *
3 37 * * 1 2 * 3 *
3 47 * 3 * 1 2 * *
3 57 * 3 * 2 * 1 *
3 67 * 2 3 * * 1 *
3 77 * 1 2 3 * * *

5. Вписане коло, 9 балів

Завдання
Створити програму circle.*, яка для натурального радіуса вписаного кола знайде натуральні сторони трикутника.

Вхідні дані
Файл circle.dat містить лише одне натуральне число — радіус вписаного кола, який не перевищує 180.

Вихідні дані
Файл circle.res містить натуральні довжини сторін трикутника: у порядку незростання довжин по одному варіанту в одному рядку. Варіанти впорядкувати таким чином: найбільша сторона не зростає, а для сталої найбільшої сторони середня сторона спадає.

Приклад

circle.datcircle.res
2




29 25 6
20 15 7
17 10 9
13 12 5
10 8 6

6. Многоґранник-3, 35 балів
Всі ґрані многоґранника — правильні многокутники. Кількості ґраней і ребер не перевищують відповідно 20 і 36. Всі ґрані многоґранника занумеровано послідовними натуральними числами, починаючи з 1. Ребра також занумеровано послідовними натуральними числами, починаючи з 1. При цьому менший номер суміжної ґрані не спадає, а для сталого меншого номера суміжної ґрані більший номер зростає. Для правильного 4-ґранника перелік у такому порядку пар суміжних ґраней має вигляд (1;2), (1;3), (1;4), (2;3), (2;4), (3;4).

Завдання
Створити програму polyedr.*, яка зобразить розгортки многоґранника на екрані монітора.

Вхідні дані
j-ий рядок файлу polyedr.dat містить повний перелік номерів ґраней, що мають з j-ою ґранню спільне ребро.

Файл polyedr.res містить дані про розгортки многоґранника — по одному рядку на кожну розгортку, в якому перераховано номери нерозрізаних ребер для відповідної розгортки.

Кожний рядок файлу polyedr.ver взаємно однозначно відповідає вершині многоґранника й містить номери всіх ґраней, що сходяться до цієї вершини (містять цю спільну вершину).

Вихідні дані
Зображення розгортки многоґранника для кожного рядка вхідного файлу polyedr.res має бути таким: чорному тлі білі лінії-ребра, з точністю до 5% на весь екран монітора, з точністю до 5% єдиним масштабом по вертикалі й горизонталі, у центрі зображення кожної ґрані — її номер, у лівому верхньому куті екрану — номер зображення, який знаходиться поза зображенням розгортки. При натисканні клавіші Enter здійснюється перехід до наступної розгортки, а після останньої розгортки програма припинить роботу. Ґрань 1 зображено так:

Приклад

polyedr.datpolyedr.verpolyedr.resзображення («неґативи»)
2 3 4
1 3 4
1 2 4
1 2 3
1 2 3
1 2 4
1 3 4
2 3 4
1 2 3
1 2 5