Задача тижня 27.02.12 – 04.03.12
Міжпланетний рейс
У деякій країні проводився відбір учасників першого міжпланетного пасажирського рейсу. Кожному з N кандидатів було надано його унікальний особистий номер (натуральне число від 1 до N). Спеціальна комп’ютерна програма створила список із цих номерів, розташувавши їх у випадковому порядку, і розпочала рахувати їх по колу, починаючи з номера 1. Якщо порядковий номер при рахуванні співпадає із значенням особистого номеру, то відповідний кандидат займає місце в космічному кораблі, а його особистий номер виключається зі списку номерів, і рахування розпочинається заново з наступного номеру в списку. Програма завершує відбір кандидатів, якщо в результаті чергового обходу кола номерів не було відібрано жодного кандидата.
1. Створіть програму знаходження кількості учасників рейсу та їх особистих номерів.
Вхідні дані
Значення N – ціле число від 1 до 100, вводиться з клавіатури або задається як константа.
Вихідні дані (виводяться на екран)
Значення K – кількість учасників першого міжпланетного пасажирського рейсу – космічних туристів;
значення Tj (j = 1, 2, …, К) – перелік особистих номерів цих учасників (туристів) у порядку їх вибору програмою.
2. Заповніть тестову таблицю за результатами роботи програми:
| № | N | Ri (i = 1, 2, …, N) | К | Ti (i = 1, 2, …, K) |
| 1 | 9 | 3 7 8 9 1 5 6 2 4 | 4 | 1 4 5 2 |
| 2 | 9 | 9 1 2 4 6 7 5 8 3 | 5 | 1 5 6 3 2 |
| 3 | 10 | 2 3 6 8 9 1 5 7 10 4 | ||
| 4 | 9 | 5 1 2 3 8 7 9 4 6 | ||
| 5 | 10 | 2 1 4 9 5 6 3 7 10 8 | ||
| 6 | 10 | 9 5 1 10 2 6 7 3 4 8 | ||
| 7 | 11 | 2 9 7 1 10 11 3 4 6 5 8 | ||
| 8 | 11 | 9 11 7 10 5 6 1 4 8 2 3 | ||
| 9 | 11 | 2 4 7 1 3 10 5 6 11 8 9 | ||
| 10 | 30 | 30 20 23 19 18 5 12 8 9 17 25 1 28 26 29 4 15 11 22 27 24 2 3 7 10 16 6 21 14 13 |
Аналіз розв’язку задачі «Міжпланетний рейс»
Вирішення задачі можна розподілити на декілька кроків.
Крок 1. Заповнюємо масив R натуральними числами від 1 до N, розташувавши їх у випадковому порядку.
Для цього можна спочатку створити масив R[i] = i , де i = 1, 2,…, N, а потім у циклі, наприклад, N разів обміняти місцями два довільно вибраних елемента R[j] та R[k], де значення j, k задаються датчиком випадкових чисел. Проте випадкові числа нерівномірно заповнюватимуть проміжок від 1 до N, і перемішування може виявитися недостатньо ефективним.
Покажемо інший варіант створення масиву R. Спочатку елементам масиву R надаємо нульові значення, що означає “місця вільні”. Послідовно заповнюємо масив значеннями від 1 до N, визначаючи їх місця в масиві за допомогою датчика випадкових чисел. Якщо місце, визначене датчиком, зайняте, зміщуємося в наступне, доки не знайдемо вільного місця.
кінець циклу
Зауважимо, що для тестування розробленої програми значення елементів масиву R слід буде вводити з клавіатури або з файлу.
Крок 2. Потрібно знайти позицію елемента (змінна i) зі значенням 1.
кінець циклу
Знайдене значення визначає той номер i елемента масиву R, з якого розпочинається рахування.
Крок 3.
Введемо змінні: K – кількість туристів на борту, T – масив з їх особистими номерами;
m – індекс кандидата в масиві R, з якого починаємо чергове рахування кандидатів.
p – змінна, що відповідає порядковому номеру кандидата у процесі рахування.
Якщо у процесі рахування черговий елемент масиву є таким, що R[i] = p (порядковий і особистий номери збігаються), то збільшуємо кількість K туристів на 1, переносимо значення R[i] (або p) у масив T (тобто T[K] = p), елемент R[i] “забираємо” з масиву (надаємо йому нульового значення (R[i] = 0), його індекс запам’ятовуємо (m = i) і розпочинаємо рахування знову (p = 1) з наступного елемента масиву (i = i +1).
Якщо черговий елемент масиву R[i] дорівнює нулю, значення p не змінюємо і продовжуємо перегляд елементів масиву R.
Перегляд завершується, якщо всі кандидати стали туристами (K = N) або чергове значення індексу масиву співпадає з індексом останнього вибраного туриста (i = m) (це означає, що весь список переглянуто, коло замкнулося, а жодного кандидата не переведено в туристи).
Цілком доцільно перегляд масиву організувати в циклі з постумовою (повторювати…до).
до (i =m) OR (K = N);
Таблиця за результатами роботи програми:
| № | N | Ri (i = 1, 2, …, N) | К | Ti (i = 1, 2, …, K) |
| 1 | 9 | 3 7 8 9 1 5 6 2 4 | 4 | 1 4 5 2 |
| 2 | 9 | 9 1 2 4 6 7 5 8 3 | 5 | 1 5 6 3 2 |
| 3 | 10 | 2 3 6 8 9 1 5 7 10 4 | 5 | 1 4 7 2 5 |
| 4 | 9 | 5 1 2 3 8 7 9 4 6 | 1 | 1 |
| 5 | 10 | 2 1 4 9 5 6 3 7 10 8 | 4 | 1 8 7 2 |
| 6 | 10 | 9 5 1 10 2 6 7 3 4 8 | 5 | 1 2 3 6 5 |
| 7 | 11 | 2 9 7 1 10 11 3 4 6 5 8 | 6 | 1 3 7 5 2 4 |
| 8 | 11 | 9 11 7 10 5 6 1 4 8 2 3 | 6 | 1 7 4 2 5 3 |
| 9 | 11 | 2 4 7 1 3 10 5 6 11 8 9 | 1 | 1 |
| 10 | 30 | 30 20 23 19 18 5 12 8 9 17 25 1 28 26 29 4 15 11 22 27 24 2 3 7 10 16 6 21 14 13 | 4 | 1 4 25 |
Журі оцінило надіслані розв’язки наступним чином:
| № | Учасник | Кількість балів |
| 1 | SERGEY | 4 |
| 2 | Юрий Дончик | 3 |




