Сайт підготовки до олімпіади з інформатики

програмування в С++

Школа олімпійського резерву з інформатики
Алгоритми для роботи з рядками PDF Печать E-mail
Добавил(а) Гісь   
06.05.11 12:28

06 травня 2011року

Алгоритми для роботи з рядками

 

Перестановка слів

   Поменяйте в строке имя и фамилию человека.

 

Технічні умови

   Вхідні дані

   Вхідний файл містить один рядок, у якому записані прізвище та ім'я людини (відокремлені  рівно одним пропуском).

   Вихідні дані

   У вихідний файл виведіть цю ж інформацію, проте спочатку ім'я, а потім прізвище, також відокремлені рівно одним пропуском.

 

Інформація про задачу

Ліміт часу: 0.1 секунди
Ліміт пам`яті: 64 MB
Бали за пройдений тест: 10
Складність: 1%
81/82

Приклад

Приклад вхідних даних

Pupkin Vasya

Приклад вихідних даних

Vasya Pupkin

 

 

Довгий корінь

   Для заданого натурального числа А потрібно знайти найбільше число В таке, що B2 ≤ A.

 

Технічні умови

   Вхідні дані

   У вхідному файлі записано натуральне число A (A ≤ 10100).

   Вихідні дані

   У вихідний файл виведіть максимальне натуральне число B, квадрат якого не перевищує A. Число B слід виводити без лідируючих нулів.

 

Інформація про задачу

Ліміт часу: 2 секунди
Ліміт пам`яті: 64 MB
Бали за пройдений тест: 4.7619
Складність: 54%
16/35

Приклад

Приклад вхідних даних

17

Приклад вихідних даних

4

 

КМП

   Знайти всі входження рядка T у рядок S.

 

Технічні умови

   Вхідні дані

   У першому рядку вхідного файлу записано рядок S, у другому рядку вхідного файлу записано рядок T. Довжини рядків більші 0 і менші 50000, рядки містять лише латинські літери.

   Вихідні дані

   Виведіть номери символів, починаючи з яких рядок T входить у рядок S у порядку зростання. Як це за звичай прийнято у програмістів, нумерація символів починається з нуля.

 

Інформація про задачу

Ліміт часу: 2 секунди
Ліміт пам`яті: 64 MB
Бали за пройдений тест: 11.1111
Складність: 10%
36/40

Приклад

Приклад вхідних даних

ababbababa
aba

Приклад вихідних даних

0 5 7

 

Рядки

   Хлопчик Кирило написав одного разу на аркуші паперу рядочок, який складався з великих та маленьких латинських літер, а після цього пішов грати у футбол. Коли ж він повернувся, то виявив, що його друг Дмитро написав під його рядочком ще один рядочок такої ж двожини. Дмитро стверджує, що свій рядочок він отримав циклічнм зсувом рядочка Кирила на декілька кроків праворуч (циклічний зсув рядка abcde на 2 позиції праворуч дасть рядок deabc). Проте Дмитро відомий тим, що може випадково помилитись у великій кількості обчислень, тому Кирил у розгубленості - чи вірити Дмитру? Допоможіть йому! За заданими рядками виведіть мінімально можливий розмір зсуву або -1, якщо Дмитро помилився.

 

Технічні умови

   Вхідні дані

   Перші два рядки вхідного файлу містять рядки Кирила та Дмитра відповідно. Довжини рядків однакові, не перевищують 10000 і не рівні 0.

   Вихідні дані

   У вихідний файл виведіть єдине число - відповідь на поставлену задачу.

 

Інформація про задачу

Ліміт часу: 2 секунди
Ліміт пам`яті: 64 MB
Бали за пройдений тест: 11.1111
Складність: 30%
23/33

Приклад

Приклад вхідних даних

abcde
deabc

Приклад вихідних даних

2

 

Циклічний рядок

   Рядок S було записано багато разів підряд, після чого з отриманого рядка взяли підрядок і дали вам. Ваша задача визначити мінімально можливу довжину початкового рядка S.

 

Технічні умови

   Вхідні дані

   У першому і єдиному рядку вхідного файлу записано рядок, який містить лише латинські літери, довжина рядка не перевищує 50000 символів.

   Вихідні дані

   У вихідний файл потрібно вивести одне число - відповідь до задачі.

Інформація про задачу

Ліміт часу: 2 секунди
Ліміт пам`яті: 64 MB
Бали за пройдений тест: 11.1111
Складність: 25%
3/4

Приклад

Приклад вхідних даних

abababa

Приклад вихідних даних

2

 

 
Розв'язуйте задачі PDF Печать E-mail
Добавил(а) Administrator   
22.04.11 14:15

www.e-olimp.com.ua

1. Розклад трицифрового числа

   Розкласти дане трицифрове число на цифри.

Технічні умови

   Вхідні дані

   У єдиному рядку задано трицифрове ціле число.

   Вихідні дані

   Вивести кожну цифру з нового рядка. Порядок виведення наведено у прикладі.

Інформація про задачу

Ліміт часу: 1 секунда
Ліміт пам`яті: 64 MB
Бали за пройдений тест: 2
Складність: 18%
189/231

Приклад

Приклад вхідних даних

198

Приклад вихідних даних

1
9
8

 

2. Задача Іосифа Флавія

   Існує легенда, що Іосиф Флавій - відомий історик першого століття - вижив і став відомим завдяки математичній обдарованості. У ході іудейської війны він у складі загону з 41 іудейського воїна був загнаний римлянами у печеру. Віддаючи перевагу самовбивство полону, воїни вирішили вишукуватись у коло і послідовно вбивати кожного третього з живих до тих пір, доки не залишиться жодної людини. Проте Іосиф розом з одним зі своїх еднодумців вважав подібний кінець безглуздим - він швидко вирахував спасительні місця у порочному колі, на які поставив себе і свого товариша. І лише тому ми знаємо його історію.

   У нашому варіанті ми почнемо з того, що вшукуємо у коло N чоловік, пронумерованих числами від 1 до N, і будемо виключати кожного k-ого до тих пір, доки не вціліє лише одна людина. (Наприклад, якщо N=10, k=3, то спочатку помре 3-й, потім 6-й, потім 9-й, потім 2-й, потім 7-й, потім 1-й, потім 8-й, за ним - 5-й, і потім 10-й. Таким чином, вціліє 4-й.)

Технічні умови

   Вхідні дані

   У вхідному файлі задано натуральні числа N і k. 1N500, 1k100.

   Вихідні дані

   Вихідний файл повинен містити єдине число - номер людини, що залижилась в живих.

Інформація про задачу

Ліміт часу: 1 секунда
Ліміт пам`яті: 64 MB
Бали за пройдений тест: 9.09091
Складність: 6%
60/64
Класифікація: Сортування та послідовності

Приклад

Приклад вхідних даних

10 3

Приклад вихідних даних

4

 

3. Сортування часу

   Відсортуйте час згідно заданому критерію.

Технічні умови

   Вхідні дані

   У вхідному файлі записано спочатку число N (1N100), а потім N моментів часу. Кожен момент часу задається 3 цілими числами - години (від 0 до 23), хвилини (від 0 до 60) і секунди (від 0 до 60).

   Вихідні дані

   У вихідний файл виведіть моменти часу, упорядковані в порядку неспадання (момент часу також виводиться у вигляді трьох чисел, ведучі нулі виводити не потрібно).

 

Інформація про задачу

Ліміт часу: 1 секунда
Ліміт пам`яті: 64 MB
Бали за пройдений тест: 1.96078
Складність: 13%
53/61
Класифікація: Сортування та послідовності

Приклад

Приклад вхідних даних

4
10 20 30
7 30 00
23 59 59
13 30 30

Приклад вихідних даних

7 30 0
10 20 30
13 30 30
23 59 59

 

4. Велике сортування

   Відсортуйте N заданих чисел у неспадаючому порядку.

Технічні умови

   Вхідні дані

   Задано число N (1N100000), а потім в одному чи декількох рядках N натуральних чисел з діапазону від 1 до 100.

   Вихідні дані

   Виведіть у одному рядку N чисел у неспадаючому порядку.

Інформація про задачу

Ліміт часу: 0.1 секунди
Ліміт пам`яті: 64 MB
Бали за пройдений тест: 7.14286
Складність: 27%
43/59
Класифікація: Сортування та послідовності

Приклад

Приклад вхідних даних

5
3 1 2 4 2

Приклад вихідних даних

1 2 2 3 4

 

5. Градуйований лексикографічний порядок

   Розглянемо цілі числа від 1 до n. Назвемо вагою числа його суму цифр, і позначимо вагу числа x як w(x).

   Потім упорядкуємо числа у так званому градуйованому лексикографічному порядку. Нехай задано два числа a та b. Якщо w(a) < w(b), то число a йде у градуйованому лексикографічному порядку до числа b. Якщо ж w(a) = w(b), тоді число a йде у градуйованому лексикографічному порядку до числа b якщо і лише якщо десяткове подання числа a лексикографічно менше десятикового подання числа b.

   Наприклад, у цьому порядку:

·                     число 120 йде до числа 4;

·                     число 555 йде до числа 78;

·                     число 20 йде до числа 200.

   За заданими n і k, знайдіть номер числа k і число, яке знаходиться на k-му місці, у градуйованому лексикографічному упорядкуванні натуральних чисел від 1 до n.

 

Технічні умови

   Вхідні дані

   У вхідному файлі записані числа n і k (1kn1018).

   Вихідні дані

   У першому рядку вихідного файлу виведіть номер числа k.

   У другому рядку виведіть число, яке знаходиться на k-му місці.

Інформація про задачу

Ліміт часу: 3 секунди
Ліміт пам`яті: 32 MB
Бали за пройдений тест: 4.7619
Складність: 50%
1/2
Класифікація: Сортування та послідовності

Приклад

Приклад вхідних даних

20
10

Приклад вихідних даних

2
14

 

 

 
Синтаксичний розбір і лексичний аналіз виразів PDF Печать E-mail
Добавил(а) Гісь   
22.04.11 14:12

Синтаксичний розбір і лексичний аналіз виразів

Однієї з головних причин, що лежать в основі появи мов програмування високого рівня, з'явилися обчислювальні задачі, що вимагають великих об'ємів рутинних обчислень. Тому до мов програмування пред'являлися вимоги максимального наближення форми запису обчислень до природної мови математики. В зв'язка з цей одній з перших областей системного програмування сформувалося дослідження способів виразів. Тут отримані численні результати, проте найбільше розповсюдження отримав метод трансляції за допомогою зворотного польського запису, який запропонував польський математик Я. Лукашевіч.

Зворотна польська нотація

Нехай заданий простий арифметичний вираз вигляду:

(A+B)*(C+D)-E                (1)

Представимо цей вираз у вигляді дерева, в якому вузлам відповідають операції, а гілкам - операнди. Побудову почнемо з кореня, як який вибирається операція, що виконується останньої. Лівій гілці відповідає лівий операнд операції, а правої гілки - правий. Дерево виразу (1) показано на рис. 1.

                           -
                          / \
                         /   \
                        *     E
                       / \
                      /   \
                     /     \
                    /       \
                   +         +
                  / \       / \
                 /   \     /   \
                А     B   С     D
                       рис. 1

Зробимо обхід дерева, під яким розумітимемо формування рядка символів з символів вузлів і гілок дерева. Обхід скоюватимемо від найлівішої гілки управо і вузол переписувати у вихідний рядок тільки після розгляду всіх його гілок. Результат обходу дерева має вигляд:

AB+CD+*E-                (2)

Характерні особливості виразу (2) полягають в проходженні символів операцій за символами операндів і у відсутності дужок. Такий запис називається зворотним польським записом.

Зворотний польський запис володіє поряд чудових властивостей, які перетворюють її на ідеальну проміжну мову при трансляції. По-перше, обчислення виразу, записаного в зворотному польському записі, може проводитися шляхом однократного перегляду, що є вельми зручним при генерації об'єктного коду програм.  наприклад, обчислення виразу (2) може бути проведено таким чином:

|-----|----------------------|-----------------------|
|  #  |    Аналізований      |    Дія                |
| п/п |       рядок          |                       |
|-----|----------------------|-----------------------|
|  0  |  А B + С D + * E -   |       r1=A+B          |
|  1  |  r1 З D + * E -      |       r2=C+D          |
|  2  |  r1 r2 * E -         |       r1=r1*r2        |
|  3  |  r1 E -              |       r1=r1-E         |
|  4  |  r1                  |  Обчислення закінчено |
|-----|----------------------|-----------------------|
Тут r1, r2 - допоміжні змінні. 

По-друге, отримання зворотного польського запису з початкового виразу може здійснюватися вельми просто на основі простого алгоритму, запропонованого Дейкстpой. Для цього вводиться поняття стекового пріоритету операцій(табл. 1):

        Таблиця 1
|----------|-----------|
| Операція | Пріоритет |
|----------|-----------|
|    (     |     0     |
|    )     |     1     |
|   +|-    |     2     |
|   *|/    |     3     |
|   **     |     4     |
|----------|-----------|

Є видимим початковий рядок символів зліва направо, операнди переписуються у вихідний рядок, а знаки операцій заносяться в стек на основі наступних міркувань:

а) якщо стек порожній, то операція з вхідного рядка переписується в стек;

б) операція виштовхує із стека всі операції з великим або рівним пріоритетом у вихідний рядок;

в) якщо черговий символ з початкового рядка є відкриваюча дужка, то він проштовхується в стек;

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

Процес отримання зворотного польського запису виразу (1) схемно представлений :

Cимвол

1

2

3

4

5

6

7

8

9

10

11

12

13

 

Вхідний рядок

(

A

+

B

)

*

(

C

+

D

)

-

E

 

Стан стека

(

(

+
(

+
(

 

*

(
*

(
*

+
(
*

+
(
*

*

-

-

 

Вихідний
рядок

 

A

 

B

+

 

 

C

 

D

+

*

E

-

 

 

Розбір арифметичного(і не тільки) виразу. Класичні алгоритми.

Алгоритм Рутісхаузера

Даний алгоритм є одним з найстаріших. Його особливістю є припущення про повну дужкову структуру виразу. Під повним дужковим записом виразу розуміється запис, в якому порядок дій задається розстановкою дужок. Неявне старшинство операцій при цьому не враховується. Наприклад:

D:=((C-(B*L))+K)

Обробляючи вираз з повною дужковою структурою, алгоритм привласнює кожному символу з рядка номер рівня за наступним правилом:

1. якщо це дужка або змінна, що відкривається, то значення збільшується на 1;

2. якщо знак операції або дужка, що закривається, то зменшується на 1.

Для виразу (А+(В+С)) привласнення значень рівня відбуватиметься таким чином :

      |-------|---------------------------------------|
      |N симв.| 1   2   3    4   5    6   7    8   9  |
      |-------|---------------------------------------|
      |Символи|                                       |
      |рядка  | (   А   +    (   B    *   З    )   )  |
      |-------|---------------------------------------|
      |Номера |                                       |
      |рівнів | 1   2   1    2   3    2   3    2   1  |
      |-------|---------------------------------------|

Алгоритм складається з наступних кроків:

1. виконати розстановку рівнів;

2. виконати пошук елементів рядка з максимальним значенням рівня;

3. виділити трійку - два операнди з максимальним значенням рівня і операцію, яка укладена між ними;

4. результат обчислення трійки позначити допоміжній змінній;

5. з початкового рядка видалити виділену трійку разом з її дужками, а на її місце помістити допоміжну змінну, що позначає результат, із значенням рівня на одиницю менше ніж у виділеної трійки;

6. виконувати п.п.2 - 5 до тих пір, поки у вхідному рядку не залишиться одна змінна, що позначає загальний результат виразу.

Приклад розбору :

          
     |------------|--------------------------------------|
     |Генерируючі |            Вираз                     |
     |   трійки   |                                      |
     |------------|--------------------------------------|
     |            |   ( ( ( ( А + В ) * З ) / D ) - E )  |
     |            | 0 1 2 3 4 5 4 5 4 3 4 3 2 3 2 1 2 1 0|
     |            |                                      |
     |+ А В - > R |      ( ( ( R * З ) / D ) - E )       |
     |            |    0 1 2 3 4 3 4 3 2 3 2 1 2 1 0     |
     |            |                                      |
     |* R З -> S  |          ( ( S / D ) - E )           |
     |            |        0 1 2 3 2 3 2 1 2 1 0         |
     |            |                                      |
     |------------|--------------------------------------|
 
     |------------|-----------------------------------|
     |Генерируючі |            Вираз                  |
     |   трійки   |                                   |
     |------------|-----------------------------------|
     |/ S D -> Q  |         ( Q - E )                 |
     |            |       0 1 2 1 2 1 0               |
     |            |                                   |
     |- Q E -> T  |             T                     |
     |------------|-----------------------------------|

Алгоритм Бауера і Замельзона

З ранніх стекових методів розглядається алгоритм Бауера і Замельзона. Алгоритм використовує два стеки і таблицю функцій переходу. Один стек використовується при трансляції виразу, а другий - під час інтерпретації виразу. Позначення: Т - стек транслятора, Е - стек інтерпретатора.

В таблиці переходів задаються функції, які повинен виконати транслятор при розборі виразу. Можливі шість функцій при прочитанні операції з вхідного рядка:

- f1 - заслати операцію з вхідного рядка в стек Т; читати наступний символ рядка;

- f2 - виділити трійку - узяти операцію з вершини стека Т і два операнди з вершини стека Е; допоміжну змінну, що позначає результат, занести в стек Е; заслати операцію з вхідного рядка в стек Т; читати наступний символ рядка;

- f3 - виключити символ із стека Т; читати наступний символ рядка;

- f4 - виділити трійку - узяти операцію з вершини стека Т і два операнди з вершини стека Е; допоміжну змінну, що позначає результат, занести в стек Е; по таблиці визначити функцію для даного символу вхідного рядка;

- f5 - видача повідомлення про помилку;

- f6 - завершення роботи.

Таблиця переходів для виразів алгебри матиме вигляд(символ $ є ознакою порожнього стека або порожнього рядка):

 |----------|---------------------------------|
 |          |     Операція з вхідного рядка  |
 |          |---------------------------------|
 |          |     $   (   +   -   *   /   )   |
 |----------|---|-----------------------------|
 |Операція  |$  | 6   1   1   1   1   1   5   |
 |на вершині|(  | 5   1   1   1   1   1   3   |
 |стека Т   |+  | 4   1   2   2   1   1   4   |
 |          |-  | 4   1   2   2   1   1   4   |
 |          |*  | 4   1   4   4   2   2   4   |
 |          |/  | 4   1   4   4   2   2   4   |
 |----------|---|-----------------------------|

Алгоритм проглядає зліва направо вираз і циклічно виконує наступні дії: якщо черговий символ вхідного рядка є операндом, то він безумовно переноситься в стек Е; якщо ж операція, то по таблиці функцій переходу визначається номер функції для виконання. Для виразу А+(В-С)*D нижче приводиться послідовність дій алгоритму.

    |-------|--------|-------|-------|----------|
    |стек Е | стік Т |Вхідний|Номер  |   Трійка |
    |       |        |символ |функції|          |
    |-------|--------|-------|-------|----------|
    |$      | $      |  А    |       |          |
    |$A     | $      |  +    |    1  |          |
    |$A     | $+     |  (    |    1  |          |
    |$A     | $+(    |  B    |       |          |
    |$AB    | $+(    |  -    |    1  |          |
    |$AB    | $+(-   |  З    |       |          |
    |$ABC   | $+(-   |  )    |    4  |- B З ->R |
    |$AR    | $+(    |  )    |    3  |          |
    |$AR    | $+     |  *    |    1  |          |
    |$AR    | $+*    |  D    |       |          |
    |$ARD   | $+*    |  $    |    4  |* R D ->Q |
    |$AQ    | $+     |  $    |    4  |+ А Q ->S |
    |$S     | $      |  $    |Кінец  |          |
    |-------|--------|-------|-------|----------|   

 

Задачі

Задача GoTo.

Учні, недавно що почали програмувати, вживають дуже багато операторів GOTO, що є майже неприпустимим для структурованої програми. Допоможіть викладачу інформатики написати програму, яка оцінюватиме ступінь структурованості відладженої програми школяра на мові Pascal, спершу просто підраховувавши кількість операторів GOTO в ній.

В синтаксично вірній програмі ключове слово оператора переходу GOTO може стояти або на початку рядка або після пропуску або після одного з символів — ‘;’, ‘:’, ‘}’, а після нього може стояти або пропуск або переклад рядка або символ ‘{‘ (табуляцію як роздільник розглядати не будемо).

Нагадаємо, що окрім позначення дійсно оператора переходу, слово GOTO може зустрічатися в тексті програми в рядкових константах, укладених в апострофи, або в коментарях, причому для простоти вважатимемо, що коментар завжди починається з символу ‘{‘, а закінчується першим що зустрівся після цього символом ‘}’, при цьому символ ‘{‘ повинен знаходитися не усередині рядкової константи. В цих випадках слово GOTO підраховувати не потрібно. Рядкові і прописні букви в Pascal не помітні.

У вхідному файлі goto.in знаходиться текст програми без синтаксичних помилок на мові Pascal. Розмір програми не перевершує 64К. У вихідному файлі goto.out повинне виявитися одне число – кількість операторів GOTO в цій програмі.

Приклад вхідного файлу:

label 1,2;

var I:byte;

begin

 1: I:=I+1;

    if I>10 then goto 2 else

      writeln(¢ goto ¢); GoTo 1;

 2: if I<10 then goto 1 {else { goto 2;}

end.

Вихідний файл для наведеного приклад

3

Додаткові задачі

1.      Правильність розстановки дужок.

арифметичних виразів за допомогою постфіксної нотації

Література

1.      Ахо А., Сети Р., Ульман Д. Компиляторы. Принципы, технологии, инструменты. М.: Вильямс, 2001.

2.      Бауэр Ф.Л., Гооз Г. Информатика. Вводный курс. Часть 2, М.: Мир, 1990.

3.      Кук Д., Бейз Г. Компьютерная математика. М.: Наука, 1990.

4.      Шень А. Программирование: теоремы и задачи. М.: МЦНМО, 1995.

5.      Грузман М.З. Евристика в інформатиці. Вінниця: Арбат, 1998.

 
Завдання з теми Теорія графів PDF Печать E-mail
Добавил(а) Administrator   
11.03.11 13:48

Прізвище ______________

 

 

Завдання на міні-олімпіаду

 

  

1. За заданими малюнком (20 балів)

 

  а) задайте матрицю суміжності

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

б) знайти ейлеровий шлях; _________________________________________________

в) знайти гамільтонів шлях; ________________________________________________

г) знайти найкоротший гамільтонів шлях; ____________________________________

г) написати програму, яка за описаним графом, виводила довжину ейлеревого шляху, якщо він існує, якщо шлях не існує виводить повідомлення NO.

д) написати алгоритм пошуку та виведення всіх шляхів з вершини I вершину J для графу заданого на малюнку вище.

 

2. Задача 1. (30 балів , алгоритм Флойда)

Вхідні дані задані у файлі Graph.dat у вигляді 1 рядок – N – кількість ребер, M – кількість вершин  (M<=100, N<=10000) , наступні N рядків задають і, j вершини і довжину ребра aij (aij<=10000). У файл Graph.sol вивести  найкоротшу довжину з вершини I в вершину J в форматі I J Dij, та повідомлення NO, якщо шляху не існує. 

Graph.dat

Graph.sol

12

1 2 2

2 7 3

7 6 7

6 5 6

5 3 6

3 1 4

1 5 5

1 4 7

5 4 1

2 4 6

6 4 6

2 6 8

1 2 2

1 3 4

1 4 6

1 5 5

1 6 10

1 7 5

2 3 6

2 4 6

2 5 7

2 6 8

2 7 3

3 4 7

3 5 6

3 6 12

3 7 9

4 5 1

4 6 6

4 7 9

5 6 6

5 7 10

6 7 7

 

 


3. Задача 2. (50 балів , алгоритм Прима)

 Збирання мита.

Король країни Аріїв завоював N міст на території сусідніх держав.

Тепер йому необхідно створити систему збирання мита з завойованих територій. Він хоче збудувати таку систему шляхів між цими містами, щоб до будь-якого міста можна було дістатися (можливо, через інші міста) зі столиці, але у воєнному стані на транспорт виділяється дуже незначна частина фінансів, тому сумарна вартість побудованих шляхів сполучення між містами має бути мінімальною.

Вхідні дані:

Перший рядок вхідного файлу містить натуральне число N (1<=N<=100) – кількість міст у країні, а також цілі числа X та Y – координати столиці.

Наступні N рядків містять через проміжок координати Xi , Yi завойованих міст.

Значення координат по модулю менші 50000.

Вихідні дані:

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

Наступні рядки мають містити у довільному порядку список побудованих доріг у форматі:  =>

При цьому столицю позначте номером 0. Якщо відповідей декілька, виведіть одну довільну з них. Приклади:

TALLAGE.DAT

TALLAGE.SOL

6  0 0

 1  1

-1  1

 0  2

 1 -1

-1 -1

 0 -2

8.485

2 3

3 1

1 0

0 4

4 6

6 5

 

Додаткова задача.

4. Відомий всім форт Буайяр пропонує своїм відвідувачам таке випробування: піднятися по досить нахиленій слизькій площині вгору, щоб дістати ключ. На площині розміщені невеличкі виступи, кожний виступ настільки малий, що поміститися на ньому може лише одна нога. Домовимося, що під час пересування по площині гравець не може перехрещувати ноги (ліву за праву і навпаки). Нехай L максимальна довжина кроку гравця, п — кількість виступів, (хi; yj)і = 1,2, ..., п — координати виступів на площині.

Вважатимемо, що початкове положення гравця: х0 > О, у0 = 0 (стартує з будь-якого місця на підлозі).

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

 

 
Динамічне прогамування на графах PDF Печать E-mail
Добавил(а) Administrator   
11.03.11 13:40

 (динамічне програмування)

 

Найкоротші шляхи

Нехай є n міст, пронумерованих числами від 1 до n. Для кожної пари міст із номерами і, j у таблиці a[і][j] зберігається ціле число - ціна прямого авіаквитка з міста i у місто j. Вважається, що рейси існують між будь-якими містами, a[і,і] = 0 при всіх і, a[і][j] може відрізнятися від a[j,і]. Найменшою вартістю проїзду з і в j вважається мінімально можлива сума цін квитків для маршрутів (у тому числі з пересадженнями), що ведуть з і в j. (Вона не перевершує a[і][j], але може бути менше).

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

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

 

1) Знайти найменшу вартість проїзду з 1-го міста в усі інші .

Позначимо через Мінвар(1,s,к) найменшу вартість проїзду з 1 у s менш чим з k пересадженнями. Тоді виконується таке співвідношення:

Мінвар (1,s,k+1) = найменшому з чисел Мінвар(1,s,k) і

Мінвар(1,і,k) + a[і][s] (і=1..n)

Як відзначалося вище, шуканою відповіддю є Мінвар (1,і,n) для всіх і=1..n.

((0,20,3,4,5,6),

                                 (20,0,5,6,7,8),

                                 (3,5,0,6,7,8),

                                 (4,6,6,0,8,8),

                                 (5,7,7,8,0,9),

                                 (6,8,8,8,9,0));

1 2 -----20

1-3 ---- 3 , 3-2---- 5= 8

min(20,8)=8

 

 

 

флойд

 

for k:=1 to n do

for i:=1 to n do

for j:=1 to n do

if a[i,k]+a[k,j]  a[i,j]:=a[i,k]+a[k,j];

Практична робота:  «Визначення найкоротшого шляху в графі методом динамічного програмування»

Прізвище ______________________________

 

Завдання

Результат

1.                    

Намалювати граф з кількістю вершин N=6

(навантажений, неорієнтований)

 

 

 

 

 

2.                    

Написати матрицю суміжності

Зауваження, якщо немає зв’язку, то записати велике число, наприклад 1000

 

 

 

 

 

1

2

3

4

5

6

1

 

 

 

 

 

 

2

 

 

 

 

 

 

3

 

 

 

 

 

 

4

 

 

 

 

 

 

5

 

 

 

 

 

 

6

 

 

 

 

 

 

 

3.                    

Намалювати каркас мінімальної  ваги (остове дерево)

 

 

 

 

 

 

 

 

4.                    

Скопіювати папку «!Лабораторна 10 динамічне» в свою папку

Занести матрицю в файл graph.dat

 

5.                    

За допомогою програми  ford.dpr відшукати всі мінімальні  шляхи та занести в таблицю

 

1

2

3

4

5

6

1

 

 

 

 

 

 

2

 

 

 

 

 

 

3

 

 

 

 

 

 

4

 

 

 

 

 

 

5

 

 

 

 

 

 

6

 

 

 

 

 

 

6.                    

За допомогою програми  floid.dpr відшукати всі мінімальні  шляхи та занести в таблицю

 

1

2

3

4

5

6

1

 

 

 

 

 

 

2

 

 

 

 

 

 

3

 

 

 

 

 

 

4

 

 

 

 

 

 

5

 

 

 

 

 

 

6

 

 

 

 

 

 

7.                    

За допомогою програми  deikstr.dpr відшукати всі мінімальні  шляхи з вершини start в вершину finish та занести в таблицю

Start

Finish

Шлях

Довжина

1

 

 

 

 

2

 

 

 

 

3

 

 

 

 

4

 

 

 

 

5

 

 

 

 

6

 

 

 

 

8.                    

Порівняти результати таблиць в завданнях 5,6,7

 

 

 

 

 
Жадібні алгоритми PDF Печать E-mail
Добавил(а) Administrator   
11.03.11 13:34

Жадібні алгоритми на графах

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

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

Ознаки того, що задачу можливо вирішити за допомогою жадібного алгоритму:

1.      Задачу можна розбити на підзадачі;

2.      Величини, що розглядаються в задачі, можна дробити так само як і задачу на підзадачі;

3.      Сума оптимальних рішень для двох підзадач дасть оптимальне рішення для всієї задачі.

Приклад задачі

Пасажирський ліфт не може підняти більше W кг. В ліфт намагаються влізти H людина, причому для кожного з них відома його вага: W1, W2 ... WH. Визначити яку максимальну кількість людей зможуть виїхати на ліфті за один раз.

Рішення

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

Тому, для вирішення задачі, відсортуємо людей по їх вазі і будемо, починаючи з найлегшим, поміщати їх в ліфт, поки це ще можна зробити.

Алгоритм пошуку мінімального остового дерева

Алгоритм Дейкстри-Прима

 

 

 
Пошук у ширину та глибину, ейлерів та гамільтонів графи PDF Печать E-mail
Добавил(а) Administrator   
16.02.11 14:25

Задача 1.ластивості Ейлера) Є N поселень. Деякі поселення попарно  з'єднані  стежками. За ними ніякі дві  стежки  загальних  точок  не  мають.  В цілочисельній таблиці СТЕЖКИ [1..N,1..N] задана  інформація  про стежки; кількість стежок між і-m і j-m рівна  значенню  елемента таблиці СТЕЖКИ [і,j]=СТЕЖКИ[j,і]>0 (в тому числі і=j);  Написати алгоритм, який визначає, чи можливо зобразити карту стежок,  не відриваючи олівця від паперу і не малюючи жодної стежки двічі.

Задача 2. (Пошук в глибину)

Турбаза мала для ночівлі N місць, з’єднаних стежками. Туристів можна вести в одну сторону. Довжина стежки – одноденний перехід. Пройти і перевірити всі M-денні маршрути, які починаються на базі K.

 

 graph1

Задача 3. Міжнародна конференція

Вас найняли для того, щоб визначити мiсця дипломатiв за столом обговорень мiжнародної конференцiї. На конференцiю запрошенi по одному дипломату з N рiзних країн свiту. Кожен дипломат знає вiд однiєї до М мов. Дипломати, якi не знають спiльної мови, не можуть розмовляти один з одним. До того ж, деякi країни проголосили, що не будуть пiдтримувати дипломатичних стосункiв  з деякими iншими, тобто представники  цих країн не будуть розмовляти один з одним. Ваше  завдання  полягає в розробцi програми  DIPLOMAT.*, що визначає мiсця за столом для дипломатiв таким чином, щоб кожен мiг розмовляти з обома своїми сусiдами, якi сидять лiворуч та праворуч вiд нього.

Стiл, що використовується, круглий i розрахований на N персон. Дипломат може спiлкуватись з дипломатом, який сидить лiворуч однiєю мовою, а з дипломатом, що сидить праворуч, – iншою.

Вхiднi данi:

В першому рядку текстового          файлу DIPLOMAT.DAT – число N. Далi – N рядкiв, по одному рядку на дипломата. Кожен рядок – послiдовнiсть слiв. Сусiднi слова вiдокремленi пропуском. Кожне слово – це послiдовнiсть великих латинських лiтер. Перше слово – код країни – складається з 3 лiтер. Друге слово           має довжину вiд      1 до 5 лiтер i представляє перелiк мов, на яких може спiлкуватись дипломат. Кожна мова позначена однiєю лiтерою. Далi iде список з не бiльш як N              трилiтерних слiв – кодiв  країн, з якими уряд дипломата  пiдтримує стосунки.

Вихiднi данi:

До файлу DIPLOMAT.SOL треба  вивести список  дипломатiв в порядку розмiщення за  столом  (по одному дипломату в рядку). Кожен рядок складається з 3 слiв: перше – код           мови, якою  дипломат може спiлкуватись з  сусiдом  лiворуч, друге – код країни дипломата, третє – код мови для спiлкування з сусiдом праворуч. Можливе iснування  декiлькох   розв'язкiв. Вам  потрiбно  знайти  один. Якщо розв'язку не iснує, Ваша програма повинна видати таке повiдомлення: NO SOLUTION EXISTS.

Приклад вхiдних даних

Приклад вихiдних даних

10

USA EF CHN GBR USR FRA FRG JPN ISR  POR KOR

CHN CFE USA GBR FRA FRG                                                                                             

GBR ER USA CHN USR FRA FRG JPN ISR POR KOR

USR RF USA GBR FRA FRG                                                                 

FRA F USA CHN GBR USR FRG JPN ISR POR                                     

FRG ERG USA CHN GBR USR FRA JPN ISR POR                                

JPN JHG USA GBR FRA FRG JPN ISR POR KOR                                 

ISR YER USA GBR FRA FRG JPN KOR                                                                               

POR PGE USA GBR FRA FRG JPN                                                                      

KOR KEC USA GBR USR JPN ISR                                        

E USA E

E KOR E

E ISR H

H JPN G

G FRG G

G POR E

E GBR E

E USR F

F FRA F

F CHN E

 

procedure p(ni,v:integer);

var s,ii:integer;

begin

c[ni]:=v;

if(ni=n)then begin

{***** 1}

for ii:=1 to ni do write(c[ii]);

end

else

for ii:=1 to n do

if (a[v,ii]>0)and (f(ni,ii)) then p(ni+1,ii);

end;

 

Практична робота «Пошук у ширину та глибину, ейлерів та гамільтонів графи»

Завдання

Результат

1.                    

Намалювати граф з кількістю вершин N=6

(ненавантажений, неорієнтований)

 

 

 

 

 

2.                    

Написати матрицю суміжності

 

 

 

 

 

 

1

2

3

4

5

6

1

 

 

 

 

 

 

2

 

 

 

 

 

 

3

 

 

 

 

 

 

4

 

 

 

 

 

 

5

 

 

 

 

 

 

6

 

 

 

 

 

 

3.                    

Скопіювати папку «!Лабораторна 9 графи» в свою папку

Занести матрицю в файл graph.dat

 

4.                    

За допомогою програми  graph1.dpr відшукати всі шлях з вершини 1 довжиною 3 (шлях з 4 вершин)

 

5.                    

За допомою програми  graph2.dpr відшукати всі гамільтонові шляхи

 

6.                    

За допомою програми  graph3.dpr відшукати  ейлеровий шлях

 

7.                    

За допомогою програми  graph4.dpr створити навантажений неорієнтований граф та відшукати найкоротший гамільтонів шлях

N

 

3

 

5

 

7

 

9

 

10

 

12

 

13

 

20

 

50

 

100

 

8.                    

Зробіть висновок

 

 

 

 

 

 

 
Розв’язки ІІІ етапу Всеукраїнської учнівської олімпіади з інформатики в 2010-2011 н.р. PDF Печать E-mail
Добавил(а) Гісь І.В.   
07.02.11 11:18

Розв’язки ІІІ етапу Всеукраїнської учнівської олімпіади з інформатики в 2010-2011 н.р.

I - тур

1. Задача  Спіраль             

Розв’язок

  1. Послідовно заповнити прямокутну матрицю і рахувати повороти в процесі заповнення.
  2. Вивести формулу яка залежить від значень N,M (розмірності матриці)

Якщо N<=M то K:=(N-1)*2 інаше K:=2*M-1.

2. Задача  Нулі                     (30 балів)                                           

Розв’язок

  1. Використовуючи алгоритми переведення чисел в різних системах числення переглянути всі десяткові  числа починаючи K^(N-1) з  в кількості K^N) та методом ділення даного десяткового числа з остачею на K  визначити та підрахувати ті числа в яких не зустрічається два нулі підряд.
  2. Вивести динамічну формулу підрахунку

Z:=0; Nz:=K-1;

Для  i:=2 до N пц

                       T:=z;

                       Z:=nz;

                       Nz:=(K-1)*(t+nz);

            Кц.

 

 

3. Задача Монети                (50 балів)      

Розв’язок

  1. Методом перебору, при кількості  монет <=20.
  2. Вивести динамічну формулу

D[0]:=0;

    Для i:=1 до S пц

                       min:=MAXS;

                       дляr j:=0 до N-1 пц

                                   якщо (((i>C[j]) та (D[i-C[j]]>0) та (D[i-C[j]]

                                               min:=D[i-C[j]];

                       якщо min=maxs то D[i]:=0 інакше D[i]:=min+1;

            кц

    кц

 

            вивести (D[S]).


IІ – тур

Задача «Число» (30 балів)

Розв’язок

Послідовно переглянути дві половини масиву та виконати перестановку елементів з використанням допоміжного елементу (подібно сортуванню бульбашки).

 

 

 

 


Страница 24 из 27

Статистика

Пользователей : 261
Статей : 225
Просмотрено статей : 105749

Вход/Регистрация