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), для якої:
будь-яка точка відрізка [a0;b0] належить щонайменше одному з інтервалів
[aj(1); bj(1)],
[aj(2); bj(2)], …,
[aj(k), bj(k)];
нерівності aj(l) < aj(l + 1) < bj(l) справджуються при всіх l = 1, 2, …, (k – 1);
aj (1) < a0 < bj (1) i aj (k) < b0 < bj(k).
Вхідні дані ґарантують існування і єдиність розв'язку.
Приклад
cover.dat | cover.res |
---|---|
2 5 1 3 2 4 3 5 4 6 2 5 | 1 3 2 5 4 6 |
2. Трикутники, 18 балів
Завдання
Створіть програму triangle.*, яка з'ясує, чи можна з даних 4 трикутників утворити трикутник «склеюванням» вздовж сторони.
Вхідні дані
Кожний рядок файлу triangle.dat містить чотири трійки натуральних чисел, які є сторонами даних трикутників і менші за 321.
Вихідні дані
Відповідний рядок файлу triangle.res має містити:
або сторони новоутвореного трикутника у порядку неспадання (якщо такий трикутник існує, то він єдиний);
або запис «No solution», якщо такий трикутник не існує.
Приклад
triangle.dat | triangle.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 таких наборів даних, які відповідають різним розгорткам многоґранника. Перші набори в розумінні такої послідовності перебору розгорток у процесі «доклеювання» ґраней:
перше не розрізане ребро обмежує ґрань 1 і має найменший номер з тих, які ще не розглянуто як перше ребро;
кожне наступне не розрізане ребро вибирається з найменшим номером серед тих, які:
ще не розглянуто як «продовження» для вже вибраних попередніх ребер;
неможливо було вибрати на попередніх кроках склеювання розгортки без порушення її зв'язності.
Якщо кількість одноколірних розгорток менша за 15, то файл polyedr.res містить дані про всі такі розгортки. На кожне число файлу відвести по 3 позиції, останню обов'язково заповнити. Для кожного рядка всі числа записувати в порядку зростання, що не завжди відповідає описаному порядку вибору склеєних ребер.
Файл polyedr.out має містити лише кількість всіх симетрій многоґранника, яка не перевищує 120.
Приклад
polyedr.dat | polyedr.res | polyedr.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 має містити у вказаному порядку, починаючи з першої позиції:
шукану найменшу кількість переміщень n дисків від початкового моменту до кінцевого;
у порядку зростання номери дисків, які розташовані відповідно на стержнях 1, 2, 3 після k переміщень, здійснених за оптимальним щодо кількості переміщень планом.
Диски занумеровано натуральними числами в межах від 1 до n включно у порядку зростання радіусів основ. Вмісти дисків розділено символом «*». Між числами, між числом і роздільником «*» лише 1 пропуск.
Приклади
tower.dat | tower.res |
---|---|
3 1 | 7 * 1 * * 2 3 * |
3 2 | 7 * 1 * 2 * 3 * |
3 3 | 7 * * 1 2 * 3 * |
3 4 | 7 * 3 * 1 2 * * |
3 5 | 7 * 3 * 2 * 1 * |
3 6 | 7 * 2 3 * * 1 * |
3 7 | 7 * 1 2 3 * * * |
5. Вписане коло, 9 балів
Завдання
Створити програму circle.*, яка для натурального радіуса вписаного кола знайде натуральні сторони трикутника.
Вхідні дані
Файл circle.dat містить лише одне натуральне число — радіус вписаного кола, який не перевищує 180.
Вихідні дані
Файл circle.res містить натуральні довжини сторін трикутника: у порядку незростання довжин по одному варіанту в одному рядку. Варіанти впорядкувати таким чином: найбільша сторона не зростає, а для сталої найбільшої сторони середня сторона спадає.
Приклад
circle.dat | circle.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 зображено так:
зображення ґрані 1 має горизонтальну сторону l таку, що зображення ґрані 1 розташоване не нижче цієї сторони;
наступною за l стороною зображення ґрані 1 при обході периметра проти руху годинникової стрілки є зображення ребра, спільного для ґрані 1 і ґрані з найменшим можливим номером. Навіть якщо зображення цієї ґрані на розгортці не має спільної сторони з ґранню 1.
Приклад
polyedr.dat | polyedr.ver | polyedr.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 |