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

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

Школа олімпійського резерву з інформатики
КОМБІНАТОРНІ ОБ'ЄКТИ PDF Печать E-mail
Добавил(а) Administrator   
15.11.11 11:41

Тема. КОМБІНАТОРНІ ОБ'ЄКТИ

Тема. Комбінаторні задачі

Комбінаторика - розділ математиків, в якому вивчаються найпростіші «з'єднання» чисел.

1) Формули комбінаторики

Задачі:

1.        Скількома способами можна скласти розклад на день з  5 різних предметів, якщо в класі вивчається 10 предметі?

2.        Скільки різних чотирицифрових чисел можна скласти з чотирьох різних заданих цифр, не повторюючи їх?

3.        Скільки діагоналей має опуклий n-кутник?

1.Перестановки - з'єднання, які можна скласти з  n предметів, міняючи всіма можливими способами їх порядок.

2.Розміщення - з'єднання, що містять по  n предметів з числа  m даних, що розрізняються або порядком предметів, або самими предметами.

3. Комбінації - з'єднання, що містять по  n предметів з  m, що розрізняються один від одного, принаймні, одним предметом.

Додаткові завдання:

1. Скількома способами можна розподілити n тем наукових робіт серед m учнів (тем більше, ніж учнів). Написати програму.

2. Перевірити справедливість рівності для m<10.

3. Скількома способами можна розмістити n осіб за столом, біля якого поставлено n стільців?  Написати програму.

4. Двоє хлопчиків Роман і Діма мають по N друзів (1<=N<=200). Вирішили вони позмагатися хто з них більше організує вечірок. Роман вирішив запрошувати кожен раз до себе в гості по K (1<= K<= N) друзів, а Діма - по М (1<= М<= N) друзів. Хто з хлопчиків більше організує вечірок і на скільки, якщо вони домовились, що кожен раз компанія має бути іншою.

Наприклад.

Якщо є четверо друзів (1, 2, 3, 4) і вони мають приходити в гості по троє, то таких вечірок буде чотири ( (1, 2, 3); (1, 2, 4); (1, 3, 4); (2, 3, 4) ).

5. Скількома способами можна вибрати делегацію в складі n представників з m чоловік. Написати програму.

6. Побудувати трикутник Паскаля з n рядків

Тема. Перебір з поверненням

ПОСТАВ_І_ВПРАВО -  ставить туру в клітинку з заданими координатами і переміщає  горизонтальний покажчик на одну позицію вправо , а вертикальний  установлює на першу позицію (процедура)

ЗНІМИ_І_ВЛІВО -  знімає туру з даної клітки і переміщає  горизонтальний покажчик  на одну позицію вліво , вертикальний покажчик встановлює в позицію тури, на яку тепер  указує горизонтальний покажчик ( процедура )

ПРАВИЛЬНА_КЛІТИНКА -  логічна функція. Повертає  істина, якщо туру можна поставити в дану клітку, і хибно, якщо поставити в клітинку не можна.

ВЛІВО - переміщає горизонтальний покажчик на одну позицію вліво і установлює вертикальний покажчик на туру в  цій  вертикалі (процедура).

 

ВИВЕДЕННЯ -   виводить на  екран результат (процедура)

 

Тепер наш алгоритм може бути представлений так:

алг Пошук_з_поверненням

 

поч

П_Г:=1

П_В:=1

ПОСТАВ_І_ВПРАВО    П_В:= П_В+1

поки П_Г<>0

пц          поки ( не ПРАВИЛЬНА_КЛІТИНКА ) і (П_Г < n+1)

пц

П_В:=П_В+1

кц

якщо П_В < n+1

то ПОСТАВ_І_ВПРАВО

інакше ЗНІМИ_І_ВЛІВО

все

якщо П_Г =n+1

то ВИВЕДЕННЯ

ВЛІВО

все

кц

до П_Г=0

кін

Деталі

Вибiр складається з N деталей. Є N верстатiв, на кожному з яких можна виготовити будь-яку деталь. Для кожних верстату та деталей вiдомий час t[i,k] виготовлення k-ї деталi на i-му верстатi. Напишiть програму, яка визначить, на якому верстатi слiд виготовити кожну де- таль, щоб одночасно почавши виготовляти всi деталi, завершити виго- товлення всмх деталей якнайшвидше.

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

1) Iмена файлiв програми, вхiдних та вихiдних даних: DETAILS.???, DETAILS.DAT, DETAILS.SOL, де ??? - PAS, BAS, C, CPP (в залежностi вiд мови програмування).

2) Перший рядок вхiдного файлу мiстить кiлькiсть текстiв. Перший рядок кожного тексту мiстить кiлькiсть верстатiв та деталей N(1<=N<=50). Кожен з наступних N рядкiв мiстить тривалостi виготов- лення деталей на вiдповiдному верстатi t[i,1], t[i,2],...,t[i,N], вiдокремленi комами. Кожне з цих чисел натуральне i не перевершує 100.

3) Коректнiсть вхiдних даних гарантується.

4) У вихiдний файл для кожного тесту треба послiдовно вивести в один рядок. Номери деталей, якi треба виготовити вiдповiдно на 1-му, 2-му,..., N-му верстатах, вiдокремивши їх пропусками. В наступний ря- док треба вивести час вiд початку до завершення виготовлення всiх де- талей.

5) Для кожного тесту досить знайти один розв'язок.

Приклад вхiдного та вихiдного файлiв

Вхiдний(DETAILS.DAT):

2

2

3,2

1,2

3

3,3,3

3,3,3

3,3,3

Вихiдний  (DETAILS.SOL):

2 1

2

1 2 3

3

Греко-латинський квадрат

Греко-латинським квадратом називається квадрат N x N, в кожному рядку, в кожному стовпці і в кожній діагоналі якого містяться всі цілі числа від 1 до N. Приклад такого квадрата 4 х 4.

Написати програму, яка:

n будує хоча б один квадрат порядку N;

In.txt

4

Out.txt

1              2              3              4

4              3              2              1

2              1              4              3

3              4              1              2

 
Оголошення PDF Печать E-mail
Добавил(а) Administrator   
02.11.11 10:05

Увага!!!

В п'ятницю, 04 листопада 2011 року, заняття школи обдарованих учнів буде проводити студент ВНУ.
Запрошую на заняття

 
Лексичний перебір PDF Печать E-mail
Добавил(а) Administrator   
02.11.11 09:24

Лексичний перебір

1.Повернемось до перебору:

а). Ми мали:   1,2,3

1,3,2

2,1,3

2,3,1

3,2,1

3,1,2

 

б). А якщо ми маємо

3,8,7

Як утворити всі можливі перестановки?

1. Утворити перестановки 1,2,3 і використати їх як індексний масив.

 

в) Маємо                                            1,1,2

1,2,1

2,1,1

2. Побудуємо лексичний перебір для довільних  елементів масиву

X=3 2 4 2 4 3 1

а) Рухаємось справа наліво. Крок вперед можна зробити, якщо  наступне число більше за попереднє. Ми зупинилися перед числом 2. Це число потрібно помітити.

X=3  2  4  2 4   3 1

 

б) Рухаємось справа наліво. Крок вперед можна зробити, якщо   число менше за знайдене число(2). Ми зупинилися перед числом 3. Це число потрібно помітити.

X= 3  2  4  23 1

 

в) Переставляємо знайдені числа.

 

X= 3  2  4  32 1

г) Запишемо числа, розміщені після першого знайденого в зворотному порядку.

X=3  2  4  3 1  2  4

функція наступна : логічна

поч.

і:=n

пошук:=хибно

1)

 

4)

і:=k+1; j:=n;

поки І>j пц

t:=x[j]; x[j]:=x[і]; x[і]:=t; іnc(і);

і:=і+1;

кц.

все

наступна:=пошук;

кін.

поч

x[1..n]; ввести х ; поки наступна                 пц вивести х кц кін.

 
Функції для опрацювання рядків PDF Печать E-mail
Добавил(а) Administrator   
02.11.11 09:11

Функції для опрацювання рядків

Модуль string.h

strlеn(<рядок>) - визначає фактичну кількість символів у  рядку, застосовується у виразах;

strcat(rl, r2) - команда з'єднання рядків г1, г2 в один ря­док, результат присвоює змінній г1;

strncat(M, г2, п) - до змінної г1 додає перших n символів рядка г2, команда;

strcpy(r1, r2) - копіює символи з рядка г2 в рядок г1, команда;

strncpy(r1, r2, n) - копіює перших n символів рядка г2 в рядок r1, команда;

strchr(r1, <символ>) - визначає перше входження деякого символу у рядок r1 так: повертає рядок, який починається від першого входження заданого символу до кінця рядка r1, застосовується у виразах;

strrchr(r1, <символ>) - визначає останнє входження зада­ного символу у рядок, застосовується у виразах;

strspn(r1, r2) - визначає номер першого символу, який входить у рядок г1, але не входить

у рядок г2, застосовується у виразах

strstr(r1, r2) - визначає в рядку г1 підрядок, що починаєть­ся з першого входження рядка г2 у рядок г1, засто­совується у виразах;

strtok(r1, r2) - визначає частину рядка г1, яка закінчується перед першим однаковим символом рядків г1 та г2;

strnset(r1, <символ>, n) - вставляє п разів заданий символ • перед рядком М, застосовується у виразах;

strupr(rl) - перетворює усі малі літери рядка у великі;

strlwr(rt) - перетворює усі великі літери рядка у малі;

strrev(rl) - записує рядок у зворотному порядку.

 

Застосування функцій

Результат

Lviv = "НУ Львівська політехніка"

n = strlen(Lviv)

n = 21

strcat(Un, Lviv)

Un = "НУ Львівська політехніка"

strncat(Un, Lviv, 10)

r1 = "НУ Львівська"

strcpy(r1, Lviv)

r1 = "Львівська Політехніка"

strncpy(r1, Lviv, 10)

r1 = "Львівська"

p = strchr(Lviv, 'П')

p = "політехніка"

p = strrchr(Lviv, Ї)

p = "іка"

n = strspn(Lviv, "Львів")

n = 5

p = strstr(Lviv, "теж")

p = "техніка"

p = strtok(Lviv, "кс")

p = "Львів"

p = strnset(Lviv, 'x', 10)

p = "ххххххххххполітехніка"

p = strupr("I Love You")

p = "і love you"

p = strlwr("I Love You")

p = "I LOVE YOU"

p = strrev('тexнiкa")

p = "акінхет"

 

 

 
Задачі з теми "Базові структури. Масиви" PDF Печать E-mail
Добавил(а) Administrator   
21.10.11 11:31

Задача 1. «Повороти» (10 балів) Діти заблукали в лісі. Вийшовши з деякої точки з координатами (x;y) вони зробивши N однакових поворотів через однакову кількість метрів повернулися в ту ж саму точку. Визначити кут на який вони відхилялись при кожному повороті.

Приклад файлу

TURN.DAT

TURN.SOL

0 0

1

180

 

 

 

0 0 - координати початкової точки, 1 - кількість поворотів, 180 - кут в градусах на який вони повернули.

  Задача 2. «Одиниці» (20 балів)

Умова. Дано ціле число I записане в десятковій системі числення.

Завдання. Написати програму ONE.*, яка порахує кількість одиниць в його двійковому записі.

Вхідні дані. Вхідний текстовий файл ONE.DAT містить в єдиному число I.

Вихідні дані. Вихідний текстовий файл ONE.SOL містить єдине ціле число - кількість одиниць.

Приклади файлів

ONE.DAT

ONE.SOL

7

3

 

 

 

 

Завдання 3. (30 балів)

Трикутне число - це число кружечків, які можуть бути розставлені у формі рівностороннього трикутника:

 

                                            Т2=3           Т3=6

 Послідовність трикутних чисел Tn для n = 0, 1, 2, 3... починається так: 0, 1, 3, 6,...

Напишіть програму, яка знаходить N-е трикутне число.

Формат вхідних даних: у єдиному рядку вхідного файлу triangle.in записане одне число N (0 ≤ N ≤109).

Формат вихідних даних: у перший рядок вихідного файлу triangle.out виведіть N-е трикутне число.

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

triangle.in

triangle.out

1

1

5

15

 

 

 

 

Задача 4. «Нафтові плями» (40 балів)

Умова. Після аварії на морській нафтовій свердловині в океан вилилося багато нафти. Вона розтеклася по воді, після чого утворилася певна кількість нафтових плям. Для ліквідації наслідків аварії було створено штаб з координації дій. Співробітники штабу зберігають інформацію про плями в комп'ютері у вигляді матриці розмірністю M x N. Комірка матриці містить 0, якщо нафтова пляма в цих координатах відсутня та 1, якщо наявна (2 ≤ M, N ≤ 100). У матриці комірки плям не можуть дотикатися одна до одної ні сторонами, ні кутами.

 

1

0

1

0

0

0

0

1

1

0

1

0

0

0

0

1

0

0

0

1

1

0

1

0

1

Завдання. Для полегшення ліквідації наслідків аварії потрібно написати програму OIL.*, яка знаходитиме загальну кількість плям та кількість плям з однаковою площею.

Вхідні дані. Вхідний текстовий файл OIL.DAT містить в першому рядку два числа M та N,  далі слідують M рядків, у кожному по N цілих чисел розділених пропусками - елементи матриці.

Вихідні дані. Вихідний текстовий файл OIL.SOL містить у першому рядку ціле число k - загальну кількість плям, далі у кожному з рядів міститься по два числа, перше - площа плями, друге - їх кількість. Дані посортувати по площах в порядку зростання.

Приклади файлів

OIL.DAT

OIL.SOL

5 5

1 0 1 0 0

0 0 1 1 0

1 0 0 0 0

1 0 0 0 1

1 0 1 0 1

5

1 2

2 1

3 2

 

 
Олімпіада з програмування для студентів 1-го курсу, випускників шкіл та коледжів PDF Печать E-mail
Добавил(а) Administrator   
21.10.11 11:29

Олімпіада з програмування для студентів 1-го курсу, випускників шкіл та коледжів

 

Олімпіада відбуватиметься в три тури:

Перший тур - заочний, за допомогою системи online-тестування 29 жовтня 2011 року.

Другий тур - очний - грудень 2011 року.

Третій тур - конкурс творчих робіт - березень 2012 року.

 

Перший тур

Для участі в першому турі олімпіади необхідно з 17 по 28 жовтня 2011 р. зареєструватися за адресою olimpiа Данный адрес e-mail защищен от спам-ботов, Вам необходимо включить Javascript для его просмотра. , вказавши прізвище, ім'я, по-батькові, місто, школу або ВНЗ, клас або групу та e-mail. Після реєстрації на електронну скриньку учасника будуть надіслані логін і пароль.

Мови програмування - Паскаль (компілятор FreePascal) або Сі (компілятор gcc).

Щоб учасники олімпіади опанували систему тестування, з 20 жовтня за адресою http://ejudge.lp.edu.ua/cgi-bin/register  будуть розміщені пробні задачі. Інструкція для користувачів знаходиться за адресою http://iknit.lp.edu.ua/files/ejudge.pdf  . З питаннями щодо роботи системи просимо звертатись за адресою olimpiа Данный адрес e-mail защищен от спам-ботов, Вам необходимо включить Javascript для его просмотра. .

Перший тур олімпіади відбудеться 29 жовтня з 9.00 до 18.00 через систему тестування http://ejudge.lp.edu.ua/cgi-bin/register . Ознайомитись з олімпіадними задачами та розпочати виконання можна у будь-який момент вказаного проміжку. О 18.00 система тестування припинить свою роботу і буде сформовано підсумкову таблицю.

Результати першого туру будуть розміщені з 1 листопада на сайті http://iknit.lp.edu.ua  .

Переможці першого туру допускаються до участі у другому та третьому турах. Запрошення до участі у другому турі будуть розіслані на електронні скриньки до 10 листопада.

 

Переможці другого та третього турів нагороджуються цінними призами.

 

Другий тур

Проводитиметься в очній формі на робочих місцях у Національному університеті «Львівська політехніка» на базі системи online-тестування. Виконання олімпіадних задач має здійснюватися за допомогою мов програмування Паскаль (компілятор FreePascal) або Сі (компілятор gcc).

 

Третій тур

Передбачає виконання творчого завдання на одну із запропонованих тем:

розроблення комп'ютерних ігор,

розроблення сайту олімпіади,

розроблення символіки для задач інформаційних технологій.

 

 

 

Партнери олімпіади - компанії-розробники програмного забезпечення:

SoftServe, Eleks, Stek, Lohika, Epam Systems, Global Logic.

 

Оргкомітет

 

Голова оргкомітету - Медиковський Микола Олександрович, директор Інституту комп'ютерних наук та інформаційних технологій Національного університету «Львівська політехніка».

 

Відповідальний секретар - Цимбал Юрій Вікторович, доцент кафедри автоматизованих систем управління Національного університету «Львівська політехніка», роб. тел. (032) 258-26-47, e-mail: Данный адрес e-mail защищен от спам-ботов, Вам необходимо включить Javascript для его просмотра. .

 
Відкрита Всеукраїнська олімпіади з інформатики NetoI-2011 PDF Печать E-mail
Добавил(а) Administrator   
19.10.11 09:50

Розпочато реєстрацію учасників відкритої Всеукраїнської олімпіади з інформатики NetoI-2011. До участі зпрошуються школярі України та взагалі всі бажаючі: учителі, студенти, професійні програмісти. Переможці в номінації ШКОЛЯРІ УКРАЇНИ отримають право участі в 4 етапі Всеукраїнської олімпіади поза квотою своїх регіонів.


 

Відкрита Всеукраїнська олімпіади з інформатики NetoI-2011

http://www.olymp.vinnica.ua/

Тренувальний тур 

Задача DEMO_A

         На площині задано координати двох відрізків AB і CD. Знайти спільну частину проекцій цих відрізків на вісь абсцис.
Вхідні дані
         Ви вводите з клавіатури 8 цілих чисел - координати точок  A, B, C, D. Кожне число не перевищує за абсолютною величиною 1000.
Вихідні дані
         Ви виводите на екран одне число - спільну частину проекцій. Якщо спільна частина - порожня множина, вивести -1, якщо це одна точка - вивести 0.
Приклад вхідних та вихідних даних
Вхід: 2 2 7 5 3 4 8 1
Вихід: 4

Задача DEMO_B

        Скільки натуральних чисел виду 2a3b5ca,b,c - невід'ємні цілі числа) належать відрізку [M;N]?
Вхідні дані
         Ви вводите з клавіатури 2 цілих числа M та N. Кожне з чисел не перевищує за абсолютною величиною 10000.
Вихідні дані
         Ви виводите на екран одне число - шукану кількість чисел.
Приклад вхідних та вихідних даних
Вхід: 10 20
Вихід: 6

Задача DEMO_C

         Дана послідовність N цілих чисел. Знайти найменший додатній елемент цієї послідовності.
Вхідні дані
         Ви вводите з клавіатури кількість чисел N та N цілих чисел - елементів цієї послідовності. Число N не перевищує 10000, кожний елемент послідовності не перевищує за абсолютною величиною 1000.
Вихідні дані
         Ви виводите на екран одне число - шуканий елемент послідовності. Якщо у послідовності немає додатніх елементів - вивести 0.
Приклад вхідних та вихідних даних
Вхід: 7 -4 4 -7 3 0 8 2
Вихід: 2

Задача DEMO_D

         Задано натуральне число N. Знайти найменше та найбільше число, яке складається з тих самих цифр та у такій самій кількості, що і N.
Вхідні дані
         Ви вводите з клавіатури число N (1£ N £2000000000).
Вихідні дані
         Ви виводите в одному рядку найменше число, а через пропуск - найбільше число.

Приклад вхідних та вихідних даних
Вхід: 7051
Вихід: 1057 7510

Задача DEMO_E

         Задано текстовий рядок. Вилучити з нього всі символи, що не є цифрами. Вважається, що рядок містить хоча б одну цифру.
Вхідні дані
         Ви вводите з клавіатури заданий рядок, довжина якого не перевищує 255 символів.
Вихідні дані
         Ви виводите на екран шуканий рядок.
Приклад вхідних та вихідних даних
Вхід: Ф11р88н
Вихід: 1188

Задача DEMO_F

         Дано K клітин шахової дошки. З'ясувати, чи всі вони одного кольору.
Вхідні дані
         Ви вводите з клавіатури кількість контрольних прикладів, потім число К - кількість клітин шахової дошки,а у наступних К рядках - координати клітин (натуральні числа, не більші 8).
Вихідні дані
         Ви виводите на екран для кожного приклада 1, якщо всі клітини одного кольору і 0, якщо це не так.
Приклад вхідних та вихідних даних

 

Вхід:

3

 

3

 

1

2

8

1

8

5

2

 

1

1

1

2

2

 

1

1

2

2

 

 

Вихід: 101

 

 

 
Робота з файлами PDF Печать E-mail
Добавил(а) Administrator   
14.10.11 12:02

Робота з файлами

Pascal

C++

var f1,f2:text;

 

assign(f1,'input.dat');

reset(f1);

 

read(f1,...);

 

close(f1);

 

assign(f2,'output.dat');

rewite(f2);

 

write(f2,...);

 

close(f2);

 

#include <fstream.h>

 

void main()

{

ifstream inp;inp.open("input.dat");

 

int a,b,c;

inp>>a>>b;

 

inp.close();

 

c=a+b;

 

ofstream out;out.open("output.sol");

 

out<<c;

 

out.close();

}

assign(input,'input.dat');

reset(input);

 

read(...);

 

close(input);

 

assign(output,'output.dat');

rewite(output);

 

write(...);

close(output);

#include <fstream.h>

 

ifstream inp("input.dat");

ofstream out("output.sol");

 

void main()

{

int a,b,c;

inp>>a>>b;

c=a+b;

out<<c;

 

}

 


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

Статистика

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

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

Нет