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

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

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

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

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

Задача тижня 06.02.12 – 12.02.12

Zadacha_tyzhnya_khopka_zadacha_tyzhnyaZadacha_tyzhnya_khopka_2_analiz_rezultativZadacha_tyzhnya_khopka_3_reytyngZadacha_tyzhnya_khopka_4_arhiv

 

Стовпчикова огорожа

 

Подвір’я дідуся однією стороною, довжина якої 100 метрів, виходить до лісу. Дідусь вирішив відгородити свій двір від лісу, але не капітальною огорожею, а тільки окремими стовпчиками. Він установив перший стовпчик на краю межі й доручив своїм онукам кожного разу, повертаючись з прогулянки в лісі, приносити дерев’яні стовпчики й додавати їх до огорожі – хто куди захоче. Так з часом і почала утворюватися стовпчикова огорожа.

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

Вхідні дані

Значення К – ціле число від 1 до 5000 (кількість стовпців, установлених онуками), вводиться з клавіатури або задається як константа;

значення Ri (i = 1, 2, …, К) – цілі числа від 10 до 10000 (значення відстаней (у сантиметрах) від дідова стовпчика до онукових стовпців у порядку їх установлення), вводяться з клавіатури або з файлу.

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

Значення Rmax – найбільша відстань між сусідніми стовпчиками (у сантиметрах).

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

 

КRi (i = 1, 2, …, К)Rmax
112020
23100 70 1555
35100 45 10 65 90
4680 30 160 105 200 190
5910 580 850 1000 140 350 200 710 950
62010000 450 6000 10 900 8000 1500 3450 2400 9600 6900 4800 100 5510 1100 1900 9100 7300 3900 8100

 

 

Аналіз розв’язку задачі «Стовпчикова огорожа»

 

Варіант 1.

Оскільки вхідні значення Ri невпорядковані, їх слід зберегти у масиві R для того, щоб відсортувати за зростанням. Після сортування потрібно, використовуючи цикл, знайти Rmax як максимальну різницю між сусідніми елементами масиву:

 

Rmax = R[1];
для i від 2 до K
початок циклу
якщо R[i] – R[i-1] > Rmax
то Rmax = R[i] – R[i-1];
кінець циклу

 

Варіант 2.

Цей варіант розроблений за мотивами рішення одного з учасників задачного марафону. На жаль, автор припустився помилки, але оригінальність ідеї була оцінена одним додатковим балом.

Ідея розв’язку не спирається на упорядкування масиву R. Для кожного онукова стовпчика (зовнішній цикл по i від 1 до K) визначаються його відстані до найближчого стовпчика «зліва» (poz) і «справа» (otr). Це реалізується в результаті виконання внутрішнього циклу по j, знову ж таки від 1 до K, де ситуація i = j пропускається. Знайдені значення відстаней poz і otr порівнюються із поточним значенням Rmax (шукана максимальна відстань між стовпчиками), і найбільше з них стає значенням Rmax.

Звернемо увагу на те, що для «запуску» внутрішнього циклу, змінним poz і otr необхідно надати початкові значення, які б напевно перевищували будь-яку різницю R[i]-R[j]. Ми скористалися системною константою maxint – найбільшим значенням цілої типу integer.

Залишається подбати про перший стовпчик, який поставив дідусь, і перевірити його відстань до найближчого онукова стовпчика R0. Цю перевірку доречно здійснити в рамках зовнішнього циклу.

Після виходу із зовнішнього циклу залишається порівняти значення R0 і Rmax, щоб більше з них надати змінній Rmax і вивести відповідь на екран.

 

Rmax=0; R0= R[1];
для i від 1 до K
початок циклу
якщо R[i] < R0
то R0= R[i];
poz=maxint; otr=maxint;
для j від 1 до K
початок циклу
якщо i<>j
то
початок
якщо (R[i]-R[j] >0) and (R[i]-R[j] <poz)
то poz=R[i]-R[j];
якщо (R[i]-R[j] <0) and (R[j]-R[i] <otr)
то otr=R[j]-R[i];
кінець
кінець циклу
якщо (poz>Rmax) and (poz<maxint)
то Rmax=poz;
якщо (otr>Rmax) and (otr<maxint)
то Rmax=otr;
кінець циклу
якщо R0>Rmax
то Rmax= R0;

 

Зауваження 1. Зазначимо, що не можна уникнути пошуку двох значень – poz і otr та спростити задачу пошуком однієї відстані, наприклад, d = abs (R[i]-R[j]), оскільки нас цікавить найбільше значення з двох відстаней до найближчих стовпчиків.

Зауваження 2. Можна перевірку дідова стовпчика здійснювати не окремо, а разом з онуковими. Для цього слід збільшити масив R на 1 елемент з нульовим значенням і, відповідно, цикли виконувати від 1 до K+1.

 

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

 

КRi (i = 1, 2, …, К)Rmax
112020
23100 70 1555
35100 45 10 65 9035
4680 30 160 105 200 19055
5910 580 850 1000 140 350 200 710 950230
62010000 450 6000 10 900 8000 1500 3450 2400 9600 6900 4800 100 5510 1100 1900 9100 7300 3900 81001050

 

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

 

Учасник Кількість балів
1RomaN4
2SERGEY1
3forsh34
4Юрий Дончик4
5ALEX Z4
6Kolgatin Andrey4