Кафедра інформатики

Харківський національний педагогічний університет імені Г.С. Сковороди

Кафедра інформатики

Харківський національний педагогічний університет імені Г.С. Сковороди

Задача тижня 2011

Задача тижня 27.02.12 – 04.03.12

Zadacha_tyzhnya_khopka_zadacha_tyzhnyaZadacha_tyzhnya_khopka_2_analiz_rezultativZadacha_tyzhnya_khopka_3_reytyngZadacha_tyzhnya_khopka_4_arhiv

 

Міжпланетний рейс

 

У деякій країні проводився відбір учасників першого міжпланетного пасажирського рейсу. Кожному з N кандидатів було надано його унікальний особистий номер (натуральне число від 1 до N). Спеціальна комп’ютерна програма створила список із цих номерів, розташувавши їх у випадковому порядку, і розпочала рахувати їх по колу, починаючи з номера 1. Якщо порядковий номер при рахуванні співпадає із значенням особистого номеру, то відповідний кандидат займає місце в космічному кораблі, а його особистий номер виключається зі списку номерів, і рахування розпочинається заново з наступного номеру в списку. Програма завершує відбір кандидатів, якщо в результаті чергового обходу кола номерів не було відібрано жодного кандидата.

1. Створіть програму знаходження кількості учасників рейсу та їх особистих номерів.

Вхідні дані

Значення N – ціле число від 1 до 100, вводиться з клавіатури або задається як константа.

Вихідні дані (виводяться на екран)

Значення K – кількість учасників першого міжпланетного пасажирського рейсу – космічних туристів;

значення Tj (j = 1, 2, …, К) – перелік особистих номерів цих учасників (туристів) у порядку їх вибору програмою.

2. Заповніть тестову таблицю за результатами роботи програми:

 

NRi (i = 1, 2, …, N)КTi (i = 1, 2, …, K)
193 7 8 9 1 5 6 2 441 4 5 2
299 1 2 4 6 7 5 8 351 5 6 3 2
3102 3 6 8 9 1 5 7 10 4
495 1 2 3 8 7 9 4 6
5102 1 4 9 5 6 3 7 10 8
6109 5 1 10 2 6 7 3 4 8
7112 9 7 1 10 11 3 4 6 5 8
8119 11 7 10 5 6 1 4 8 2 3
9112 4 7 1 3 10 5 6 11 8 9
103030 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, визначаючи їх місця в масиві за допомогою датчика випадкових чисел. Якщо місце, визначене датчиком, зайняте, зміщуємося в наступне, доки не знайдемо вільного місця.

для i від 1 до N
початок циклу
R[i]=0;
кінець циклу;
для i від 1 до N
початок циклу
z=random(N)+1;
поки R[z]0
початок циклу
z=z+1;
якщо z>N то z=1;
кінець циклу;
R[z]=i;

кінець циклу

Зауважимо, що для тестування розробленої програми значення елементів масиву R слід буде вводити з клавіатури або з файлу.

Крок 2. Потрібно знайти позицію елемента (змінна i) зі значенням 1.

i=1;
поки R[i] 1
початок циклу
i = 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) (це означає, що весь список переглянуто, коло замкнулося, а жодного кандидата не переведено в туристи).

Цілком доцільно перегляд масиву організувати в циклі з постумовою (повторювати…до).

K = 0; p = 1; m = i;
повторювати
якщо R[i]=p
то
початок
K = K+1;

T[K] = p;

R[i] = 0;

p = 1;

m = i;
кінець
інакше
якщо R[i]0
то p = p+1;
i = i+1;
якщо i > N то i = 1;

до (i =m) OR (K = N);

 

Таблиця за результатами роботи програми:

 

NRi (i = 1, 2, …, N)КTi (i = 1, 2, …, K)
193 7 8 9 1 5 6 2 441 4 5 2
299 1 2 4 6 7 5 8 351 5 6 3 2
3102 3 6 8 9 1 5 7 10 451 4 7 2 5
495 1 2 3 8 7 9 4 611
5102 1 4 9 5 6 3 7 10 841 8 7 2
6109 5 1 10 2 6 7 3 4 851 2 3 6 5
7112 9 7 1 10 11 3 4 6 5 861 3 7 5 2 4
8119 11 7 10 5 6 1 4 8 2 361 7 4 2 5 3
9112 4 7 1 3 10 5 6 11 8 911
103030 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 1341 4 25

 

Журі оцінило надіслані розв’язки наступним чином:

 

Учасник Кількість балів
1SERGEY4
2Юрий Дончик3