16
Српска Информатичка Олимпијада 16-17. мај 2015. године 1 Проблем 1: Задатак Временско ограничење: 1 секунда Меморијско ограничење: 64 MB Текст проблема Комисија ове године нема времена ни за шта, па ни за смишљање занимљивих текстова проблема. Зато се у тексту овог задатка неће помињати ликови са смешним именима, изостаће прикривена међусобна прозивања чланова Комисије, а неће ту бити ни уобичајеног зафркавања такмичара. Дато је стабло са N чворова означених бројевима од 1 до N, тако да је сваки број употребљен за тачно један чвор. (Стабло је оно што је Комисија до сад углавном називала државом која је повезана путевима тако да између свака два града постоји јединствен пут.) Потребно је направити матрицу у којој је свако поље означено неким бројем од 1 до N, тако да су следећи услови задовољени: За сваки пар повезаних чворова у стаблу мора постојати бар један пар суседних поља у матрици који су означени са истим бројевима као и та два чвора. За сваки пар суседних поља у матрици означених различитим бројевима мора постојати пар повезаних чворова у стаблу који су означени са иста та два броја. За свака два поља у матрици која су означена истим бројем мора постојати низ суседних поља означених тим бројем који почиње и завршава се тим пољима (сва поља са истом ознаком у матрици морају бити повезана). Два поља у матрици су суседна ако деле заједничку страницу. Описи функција Потребно је да имплементирате функцију NapraviMatricu(N, S, T) где је N број чворова у стаблу, а S је низ дужине 2(N-1) у коме су редом наведени парови повезаних чворова у стаблу (први и други елемент низа S су ознаке два повезана чвора, исто то важи за трећи и четврти елемент низа, потом пети и шести, итд.). Функцији се такође прослеђује низ T кроз који треба да вратите ваше решење. Први елемент низа T је број H, број врста конструисане матрице, други елемент је W, број колона те матрице, и наредних H*W елемената су ознаке поља у тој матрици које се наводе ред по ред (најпре се наводи W поља првог реда, потом W поља другог реда, итд.). Преостали елементи низа нису од значаја. Низови S и T су индексирани од 0, што значи да је први елемент ових низова онај са индексом 0. Пример: Нека је N = 5, а S = [1, 2, 2, 3, 2, 4, 4, 5]. Овим је описано следеће стабло. 1 - 2 - 4 - 5 | 3

Проблем 1: Задатакrg.edu.rs/.../informatika/olimpijada/SIO_2015_Zadaci.pdf · 2019-03-27 · Српска Информатичка Олимпијада 16-17. мај

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Проблем 1: Задатакrg.edu.rs/.../informatika/olimpijada/SIO_2015_Zadaci.pdf · 2019-03-27 · Српска Информатичка Олимпијада 16-17. мај

Српска Информатичка Олимпијада 16-17. мај 2015. године

1

Проблем 1: Задатак

Временско ограничење: 1 секунда Меморијско ограничење: 64 MB

Текст проблема Комисија ове године нема времена ни за шта, па ни за смишљање занимљивих текстова проблема.

Зато се у тексту овог задатка неће помињати ликови са смешним именима, изостаће прикривена

међусобна прозивања чланова Комисије, а неће ту бити ни уобичајеног зафркавања такмичара.

Дато је стабло са N чворова означених бројевима од 1 до N, тако да је сваки број употребљен за

тачно један чвор. (Стабло је оно што је Комисија до сад углавном називала државом која је повезана

путевима тако да између свака два града постоји јединствен пут.)

Потребно је направити матрицу у којој је свако поље означено неким бројем од 1 до N, тако да су

следећи услови задовољени:

За сваки пар повезаних чворова у стаблу мора постојати бар један пар суседних поља у

матрици који су означени са истим бројевима као и та два чвора.

За сваки пар суседних поља у матрици означених различитим бројевима мора постојати пар

повезаних чворова у стаблу који су означени са иста та два броја.

За свака два поља у матрици која су означена истим бројем мора постојати низ суседних

поља означених тим бројем који почиње и завршава се тим пољима (сва поља са истом

ознаком у матрици морају бити повезана).

Два поља у матрици су суседна ако деле заједничку страницу.

Описи функција Потребно је да имплементирате функцију

NapraviMatricu(N, S, T)

где је N број чворова у стаблу, а S је низ дужине 2(N-1) у коме су редом наведени парови повезаних

чворова у стаблу (први и други елемент низа S су ознаке два повезана чвора, исто то важи за трећи и

четврти елемент низа, потом пети и шести, итд.).

Функцији се такође прослеђује низ T кроз који треба да вратите ваше решење. Први елемент низа T

је број H, број врста конструисане матрице, други елемент је W, број колона те матрице, и наредних

H*W елемената су ознаке поља у тој матрици које се наводе ред по ред (најпре се наводи W поља

првог реда, потом W поља другог реда, итд.). Преостали елементи низа нису од значаја. Низови S и T

су индексирани од 0, што значи да је први елемент ових низова онај са индексом 0.

Пример: Нека је N = 5, а S = [1, 2, 2, 3, 2, 4, 4, 5]. Овим је описано следеће стабло.

1 - 2 - 4 - 5 | 3

Page 2: Проблем 1: Задатакrg.edu.rs/.../informatika/olimpijada/SIO_2015_Zadaci.pdf · 2019-03-27 · Српска Информатичка Олимпијада 16-17. мај

Српска Информатичка Олимпијада 16-17. мај 2015. године

2

Примери матрица које задовољавају постављене услове:

5 4 2 3 5 4 2 2 4 4 2 1

1 1 2 2 1 2 2 4 2 2 4 4 3 2 4 5

2 2 2 2 1 2 2 2 2 2 2 2 3 2 2 4 4 2 2 2 5 4 2 2 2 Приметите да поља са ознакама 3 и 4 нису суседна.

За матрицу из првог примера одговарајући низ T, који функција треба да врати је

[3, 4, 5, 4, 2, 3, 5, 4, 2, 2, 4, 4, 2, 1].

Примери матрица које не задовољавају постављене услове:

5 4 2 3 5 4 2 1 3 и 1 нису повезани у стаблу, а суседни су у матрици.

1 1 1 1 2 2 2 2 3 2 4 4 4 и 5 су повезани у стаблу, а нису суседни у матрици (јер у матрици не постоји поље са ознаком 5).

2 1 2 2 2 3 2 4 2 5 Поља са ознаком 2 нису повезана.

Ограничења N ≤ 100

Ниједна димензија конструисане матрице не сме бити већа од 1000. (Низ T ће имати

2+1000*1000 елемената.)

Бодовање Решење које не испуњава неки од услова бодује се са 0 поена. Уколико решење испуњава све услове

број бодова за сваки тест пример одређује се на основу величине конструисане матрице и то:

Ако је бар једна димензија већа од 10N на том тест примеру добијате 0 поена.

Иначе, број бодова се рачуна на основу формуле: min (1.0, 0.12 + 0.88 ∗ 𝑁

max(H,W)) ∗ 𝑋, где је

𝑋 максимални број поена које можете освојити по тест примеру.

Укупан број поена једнак је збиру поена за сваки тест пример.

Page 3: Проблем 1: Задатакrg.edu.rs/.../informatika/olimpijada/SIO_2015_Zadaci.pdf · 2019-03-27 · Српска Информатичка Олимпијада 16-17. мај

Српска Информатичка Олимпијада 16-17. мај 2015. године

3

Детаљи имплементације Потребно је да пошаљете тачно један фајл, под називом zadatak.c, zadatak.cpp или zadatak.pas, који

имплементира горе поменуту функцију. Осим тражене функције, ваш фајл може садржати и додатне

глобалне променљиве, помоћне функције и додатне библиотеке.

Зависно од програмског језика који користите, ваша функција/процедура мора бити следећег

облика:

C/C++ void NapraviMatricu(int N, int *S, int *T);

Pascal procedure NapraviMatricu(N : Integer; var S, T : array of Integer);

Уколико радите у C/C++-у, потребно је на почетку фајла ставити #include “zadatak.h” а уколико

радите у Pascal-у, потребно је на почетку фајла ставити Unit zadatak; (ово је већ додато у фајловима

који су вам обезбеђени).

Тестирање и експериментисање Уз задатак, обезбеђени су вам “template” фајлови (zadatak.c, zadatak.cpp, zadatak.pas) које можете

користити и мењати по потреби. Такође су вам обезбеђени програми (grader.c, grader.cpp,

grader.pas) који служе да лакше тестирате кодове. Ови програми учитавају са стандардног улаза

следеће податке:

Из првог реду учитавају број N,

Из сваког од наредних N-1 редова учитавају по два броја који представљају пар повезаних

чворова у стаблу,

а затим позивају вашу функцију NapraviMatricu из одговарајућег фајла (zadatak.c, zadatak.cpp,

zadatak.pas) са учитаним подацима, и на крају конструисану матрицу коју ваша функција враћа

исписују на стандардни излаз. Kодове ових програма можете мењати по потреби.

Page 4: Проблем 1: Задатакrg.edu.rs/.../informatika/olimpijada/SIO_2015_Zadaci.pdf · 2019-03-27 · Српска Информатичка Олимпијада 16-17. мај

Српска  Информатичка  Олимпијада  16-­‐17.  мај  2015.  године        

   1  

 

 

Проблем  2:  Куле  

Временско  ограничење:   1  секунди  Меморијско  ограничење:   64  MB    

Текст  проблема  Чланови  Тајне  Комисије,  мали  Перица  и  мали  Тукс,  у  паузама  између  припреме  задатака  и  спремања  испита   воле   да   играју   друштвену   игру   ”Куле”.   Правила   игре   подразумевају   да   у   почетку   на  располагању  имамо  неки  број  коцкица,  наслаганих  једна  на  другу,  у  облику  куле.    

Један  потез  подразумева  да  Перица  издели  кулу  на  две  или  више  мањих  кула,  и  поређа  такве  куле  у  низ;  Тукс  затим  мора  да  одабере  једну  од  тих  мањих  кула,  која  ће  се  користити  за  наредне  потезе  (све  остале  куле  се  одбацују).  Уколико  је  Тукс  одабрао  𝑘-­‐ту  кулу  у  низу,  Перица  је  у  обавези  да  му  исплати  𝒌𝟐   динара   (нпр.   уколико   је   Тукс   одабрао   трећу   кулу,   Перица  мора   одмах   да  му   да   девет  динара).  Игра  се  завршава  у  оном  моменту  када  тренутна  кула  има  само  једну  коцкицу.  

Како   је   одвећ   познато   да   чланови   Тајне   Комисије   немају   времена   ни   за   шта   (а   самим   тим   ни   за  играње   игара),   Перица   и   Тукс   су   одлучили   да,   уместо   да   одиграју   партију   ”Кула”,   поверују   један  другом  да  би  обојица  играли  оптимално,  и  да  Перица  одмах  исплати  Туксу  износ  који  би  освојио  под  тим  условом.  Замолили  су  вас  за  помоћ  у  одређивању  овог  износа.  

Описи  функција  Потребно   је   имплементирати   функцију   𝐼𝑧𝑛𝑜𝑠(𝐿,𝑁 … , 𝑆𝑜𝑙 … ,𝑁! ,𝑁!! ,𝐶![… ]);   ова   функција   се  позива   само   једном   на   почетку   програма   и   означава   да   треба   одредити   износ   који   Перица   мора  исплатити  Туксу,  уколико   је  почетна  кула  имала  𝑁  коцкица   (𝑵   је  задат  као  низ  цифара  дужине  𝑳).  Тражени  износ  треба  ”попунити”  у  низ  𝑆𝑜𝑙,  такође  у  виду  низа  цифара.  Ваша  функција  мора  да  као  повратну  вредност  врати  дужину  низа  𝑆𝑜𝑙,  тј.  број  цифара  решења.    

Ваше  решење  такође  треба  да  одреди  први  потез  који  Перица  повлачи,  уколико  резултује  у  мање  од  1000  кула.  У  променљиву  𝑁!   је  потребно  сместити  број  мањих  кула  у  првој  оптималној  подели;  уколико  је  овај  број  већи  од  1000,  уписати  -­‐1.    

Уколико   је   оптималан  број  мањих   кула  мањи  или   једнак   1000,   низ  𝐶!   треба   ”попунити”  низовима  цифара  висина  ових  кула   (крај   једног  таквог  низа  цифара  означити  бројем  -­‐1).  На  пример,  уколико  желите   да   направите   поделу   на   куле   висина   10   и   4,   онда   𝐶! = [1, 0,−1, 4,−1].   Величину   низа   𝐶!  треба  сместити  у  променљиву  𝑁!!.  

Уколико  има  више  оптималних  првих  подела,  одредите  било  коју.  Низове  индексирати  од  0!  

Пример:  Претпоставимо  да  је  ваш  програм  добио  наредбу  да  изврши:  𝐼𝑧𝑛𝑜𝑠 1, 7 , 𝑆𝑜𝑙,𝑁! ,𝑁!! ,𝐶! .  

У   овом   случају,   решење   је   𝑆𝑜𝑙 = [8],  𝑁! = 2,  𝑁!! = 4,  𝐶! = [5,−1,2,−1];   повратна   вредност   ваше  функције  треба  да  буде  1.  

У   једном   од   могућих   оптималних   решења,   Перица   најпре   дели   кулу   на   две   куле   висина   5   и   2.  Уколико   Тукс   одабере   другу   кулу   (висине   2),   добија   одмах   4   динара,   и   Перица   је   након   тога  

Page 5: Проблем 1: Задатакrg.edu.rs/.../informatika/olimpijada/SIO_2015_Zadaci.pdf · 2019-03-27 · Српска Информатичка Олимпијада 16-17. мај

Српска  Информатичка  Олимпијада  16-­‐17.  мај  2015.  године        

   2  

 

приморан   да   ову   кулу   подели   на   две   куле   висине   1,   након   чега   Тукс   поново   добија   4   динара   (8  укупно).  Уколико  Тукс  одабере  прву  кулу,  Перица  може  у  сваком  наредном  потезу  да  дели  кулу  на  две  куле  од  којих  друга  има  висину  1;  у  овом  случају,  Тукс  ће  при  оптималној  стратегији  четири  пута  добити  по  један  динар,  да  би  на  самом  крају  добио  четири  (поново  8  укупно).  

Не  постоји  почетна  подела  куле  висине  7  која  ће  резултовати  у  мањем  износу.  

Ограничења  • 2 ≤ 𝑁 ≤ 10!""  

Подзадаци  и  бодовање  Тест  примери  су  подељени  у  пет  подзадатка,  у  којима  важе  следећа  додатна  ограничења:  

• ПОДЗАДАТАК  1  [10  ПОЕНА]:  𝑁 ≤ 20.  • ПОДЗАДАТАК  2  [15  ПОЕНА]:  𝑁 ≤ 1000.  • ПОДЗАДАТАК  3  [20  ПОЕНА]:  𝑁 ≤ 10!.  • ПОДЗАДАТАК  4  [20  ПОЕНА]:  𝑁 ≤ 10!".  • ПОДЗАДАТАК  5  [35  ПОЕНА]:  Нема  додатних  ограничења.  

Уколико   на   свим   тест   примерима   једног   подзадатка   израчунате   тачан   износ   који  Перица   треба   да  исплати  Туксу,  добијате  60%  поена  за  тај  подзадатак.  Уколико  коректно  одредите  оптималан  први  Перичин  потез  на  свим  тест  примерима  једног  подзадатка,  добијате  40%  поена  за  тај  подзадатак.  

Детаљи  имплементације  Потребно   је   да   пошаљете   тачно   један   фајл,   под   називом   kule.c,   kule.cpp   или   kule.pas,   који  имплементира  горе  поменуту  функцију.  Осим  тражене  функције,  ваш  фајл  може  садржати  и  додатне  глобалне  променљиве,  помоћне  функције  и  додатне  библиотеке.  

Зависно   од   програмског   језика   који   користите,   ваша   функција/процедура   мора   бити   следећег  облика:  

C/C++   int  Iznos(int  L,  int*  N,  int*  Sol,  int*  Nk,  int*  NC1,  int*  C1);  

Pascal   function  Iznos(L  :  longint;  var  N,  Sol  :  array  of  longint;  var  Nk,  NC1  :  longint;  var  C1  :  array  of  longint)  :  longint;  

 

Уколико  радите  у  C/C++-­‐у,  потребно  је  на  почетку  фајла  ставити  #include  “kule.h”  а  уколико  радите  у  Pascal-­‐у,  потребно  је  на  почетку  фајла  ставити  Unit  kule;  (ово  је  већ  додато  у  фајловима  који  су  вам  обезбеђени).  

Тестирање  и  експериментисање  Уз  задатак,  обезбеђени  су  вам  “template”  фајлови  (kule.c,  kule.cpp,  kule.pas)  које  можете  користити  и  мењати  по  потреби.  Такође  су  вам  обезбеђени  програми  (grader.c,  grader.cpp,  grader.pas)  који  служе  да  лакше  тестирате  кодове.  Ови  програми  учитавају  са  стандардног  улаза  стринг  који  представља  низ  цифара  броја  𝑁,  𝐶𝑖𝑓[...].    

Затим  позивају  функцију   𝐼𝑧𝑛𝑜𝑠(𝐿,𝐶𝑖𝑓, 𝑆𝑜𝑙,𝑁! ,𝑁!! ,𝐶!)   и   исписују   на   стандардни  излаз   садржај   низа    𝑆𝑜𝑙,  као  и  вредност  променљиве  𝑁!  и  садржај  низа  𝐶!.  Низови  се  исписују  без  размака;  унутар  низа  𝐶!  уместо  -­‐1  се  исписују  размаци.  

Page 6: Проблем 1: Задатакrg.edu.rs/.../informatika/olimpijada/SIO_2015_Zadaci.pdf · 2019-03-27 · Српска Информатичка Олимпијада 16-17. мај

Српска Инфпрматичка Олимпијада 16-17. мај 2015. гпдине

1

Прпблем 3: Аутпбуси

Временскп пграничеое: 1.5 секунди Мемпријскп пграничеое: 1024 MB

Текст прпблема Тајна Кпмисија ни пвпг пута није имала времена да такмичаре ппведе у пбилазак Бепграда.

Међутим, ппште је ппзнатп да Бепград има квалитетан јавни градски превпз, и да је пвај превпз

бесплатан за све такмичаре кпји на себи имају значку на кпјпј пише СИО 2015. Да би такмичар

пстварип правп на бесплатан превпз, дпвпљнп је да впзачу ппкаже значку. Међутим, Кпмисија је

забринута за безбеднпст такмичара, па жели да за неке парпве ппчетне и крајое станице зна кпликп

различитих аутпбуских линија ппстпји, такп да је мпгуће дпћи пд те ппчетне дп те крајое станице.

Свака аутпбуска линија је пписана низпм станица - мпгуће је ппнављаое станица. Свака станица има

свпј идентификаципни брпј кпји је прирпдан и маои или једнак . За неку линију и неки пар

станица кажемп да је мпгуће -тпм линијпм дпћи пд дп акп и самп акп се у низу станица за ту

линију станица ппјављује бар једнпм пре некпг ппјављиваоа станице .

Описи функција Вашпј функцији прпслеђује се , брпј аутпбуских линија; , низ кпји пписује дужину сваке

линије тј. брпј станица, затим низ , кпји је дпбијен надпвезиваоем низпва станица за све аутпбусе;

, брпј упита; два низа и - у -тпм упиту ппчетна станица је , а крајоа , и дат вам је низ

кпји ваша функција треба да пппуни: у уписати пдгпвпр на -ти упит.

Дпдатнп, пзначимп дужину низа са . Сви низпви су индексирани пд нуле.

Пример: Нека је брпј аутпбуских линија , и нека су те линије пписане низпвима .

Онда је низ , и низ . Нека је брпј упита и нека су упити

( ) ( ) ( ) ( ). Онда је и . Ваша функција треба низ да

пппуни следећим вреднпстима: .

За упит ( ), решеое је 1 – једина аутпбуска линија кпд кпје се станица пзначена брпјем 1 ппјављује

пре станице пзначене брпјем 3 је линија .

За упит ( ), решеое је 3 – свакпм линијпм се мпже дпћи пд станице 2 дп станице 4.

За упит ( ), решеое је 2 – другпм линијпм је немпгуће дпћи пд 1 дп 4 а препсталим двема јесте.

За упит ( ), решеое је 0 – ниједнпм линијпм се не мпже дпћи пд 4 дп 1.

Page 7: Проблем 1: Задатакrg.edu.rs/.../informatika/olimpijada/SIO_2015_Zadaci.pdf · 2019-03-27 · Српска Информатичка Олимпијада 16-17. мај

Српска Инфпрматичка Олимпијада 16-17. мај 2015. гпдине

2

Ограничеоа

Ппдзадаци и бпдпваое ПОДЗАДАТАК 1 [9 ПОЕНА]:

ПОДЗАДАТАК 2 [14 ПОЕНА]:

ПОДЗАДАТАК 3 [16 ПОЕНА]:

ПОДЗАДАТАК 4 [26 ПОЕНА]:

ПОДЗАДАТАК 5 [35 ПОЕНА]: Нема дпдатних пграничеоа

Детаљи имплементације Пптребнп је да ппшаљете тачнп један фајл, ппд називпм autobusi.c, autobusi.cpp или autobusi.pas,

кпји имплементира гпре ппменуту функцију. Осим тражене функције, ваш фајл мпже садржати и

дпдатне глпбалне прпменљиве, ппмпћне функције и дпдатне библиптеке.

Зависнп пд прпграмскпг језика кпји кпристите, ваша функција/прпцедура мпра бити следећег

пблика:

C/C++ void resi(int n, int *duzine, int *a, int q, int *x, int *y, int *resenja);

Pascal procedure resi(n : longint; var duzine, a : array of longint; q : longint; var x, y, resenja : array of longint);

Укпликп радите у C/C++-у, пптребнп је на ппчетку фајла ставити #include “grader.h” а укпликп радите

у Pascal-у, пптребнп је на ппчетку фајла ставити Unit autobusi; (пвп је већ дпдатп у фајлпвима кпји су

вам пбезбеђени).

Page 8: Проблем 1: Задатакrg.edu.rs/.../informatika/olimpijada/SIO_2015_Zadaci.pdf · 2019-03-27 · Српска Информатичка Олимпијада 16-17. мај

Српска Инфпрматичка Олимпијада 16-17. мај 2015. гпдине

3

Тестираое и експериментисаое На распплагаоу су вам темплејт фајлпви кпје мпжете кпристити и меоати пп пптреби. Такпђе су вам

пбезбеђени ппмпћни прпграми () кпји служе да лакше тестирате кпдпве. Ови прпграми учитавају

ппдатке са стандарднпг улаза, ппзивају вашу функцију и исписују низ решеоа на стандардни

излаз. Кпдпве пвих прпграма мпжете меоати пп пптреби. Фпрмат улаза за прпграме је следећи:

У први ред уписати брпј аутпбуских линија . У други ред уписати брпјева - дужине аутпбуских

линија. За наредних редпва, у -ти уписати брпјева, пзнаке станица. У наредни ред

уписати - брпј упита. За наредних редпва, у -ти уписати два брпја и , идентификаципне

брпјеве ппчетне и крајое станице.

Изглед улаза за гпре пписан пример је следећи:

3

4 2 4

1 2 3 4

2 4

2 3 1 4

4

1 3

2 4

1 4 4 1

Page 9: Проблем 1: Задатакrg.edu.rs/.../informatika/olimpijada/SIO_2015_Zadaci.pdf · 2019-03-27 · Српска Информатичка Олимпијада 16-17. мај

Српска Информатичка Олимпијада 16-17. мај 2015. године

1

Проблем 4: Мудрац

Временско ограничење: 0.5 секунди Меморијско ограничење: 64 MB

Текст проблема Тајна комисија нема времена ни за шта а самим тим ни за смишљање задатака за СИО. Због тога су

превалили далеки пут до Казахстанских планина (за то имају времена) и затражили од чувеног

мудраца-програмера из пећине Диџита Програмбајева да им смисли задатак. И он им рече:

“Људи, на почетку, првог дана, имао сам 𝐴 камила. Сваког наредног дана добијам још онолико

камила колико је једнака највећа цифра броја мојих камила дан пре тога. Обратите пажњу да ја све

то стално посматрам по модулу 𝑀 тј. уколико је 𝑎𝑖 број камила које имам 𝑖-тог дана, тада важи

𝑎𝑖+1 = (𝑎𝑖 + највећа цифра броја 𝑎𝑖) 𝑚𝑜𝑑 𝑀.

Уколико је прошло 𝑁 дана, одредити колико има километара између Астане и Алма-Атија. Ето.”

Чланови комисије су се мало збунили неочекиваним крајем задатка па су решили да га мало измене:

за дате природне бројеве 𝐴, 𝑀 и 𝑁, израчунајте колико камила има мудрац на крају 𝑵-тог дана.

Описи функција Потребно је да имплементирате функцију

𝐵𝑟𝑜𝑗𝐾𝑎𝑚𝑖𝑙𝑎(𝐴, 𝑀, 𝑁)

где je 𝐴 – број камила првог дана, 𝑀 – модуо по коме се посматрају чланови низа и 𝑁 – број дана

који су прошли. Ова функција мора да врати један цео број из сегмента [0, 𝑀 − 1] – број камила које

поседује мудрац на крају 𝑁-тог дана.

Пример: Нека је 𝐴 = 123, 𝑀 = 134 и 𝑁 = 6. Уколико са 𝑎𝑖 означимо број камила 𝑖-тог дана, тада важи:

𝑎1 = 𝐴 = 123, 𝑎2 = (123 + 3) 𝑚𝑜𝑑 134 = 126, 𝑎3 = (126 + 6) 𝑚𝑜𝑑 134 = 132, 𝑎4 = (132 +

3) 𝑚𝑜𝑑 134 = 1, 𝑎5 = (1 + 1) 𝑚𝑜𝑑 134 = 2, 𝑎6 = (2 + 2) 𝑚𝑜𝑑 134 = 4. Према томе, у овом случају

ваша функција мора да врати број 4.

Ограничења 1 ≤ 𝐴 < 𝑀 ≤ 1018

1 ≤ 𝑁 ≤ 1018

Подзадаци и бодовање ПОДЗАДАТАК 1 [5 ПОЕНА]: 𝑁 ≤ 106

ПОДЗАДАТАК 2 [12 ПОЕНА]: 𝑀 ≤ 106

Page 10: Проблем 1: Задатакrg.edu.rs/.../informatika/olimpijada/SIO_2015_Zadaci.pdf · 2019-03-27 · Српска Информатичка Олимпијада 16-17. мај

Српска Информатичка Олимпијада 16-17. мај 2015. године

2

ПОДЗАДАТАК 3 [25 ПОЕНА]: 𝐴 = 1, 𝑀 = 201520152015 и 𝑁 ≤ 109.

ПОДЗАДАТАК 4 [41 ПОЕНА]: 𝐴, 𝑁 ≤ 1017, 𝑀 = 1018.

ПОДЗАДАТАК 5 [17 ПОЕНА]: Нема додатних ограничења.

Детаљи имплементације Потребно је да пошаљете тачно један фајл, под називом mudrac.c, mudrac.cpp или mudrac.pas, који

имплементира горе поменуту функцију. Осим тражене функције, ваш фајл може садржати и додатне

глобалне променљиве, помоћне функције и додатне библиотеке.

Зависно од програмског језика који користите, ваша функција/процедура мора бити следећег

облика:

C/C++ long long BrojKamila(long long A, long long M, long long N);

Pascal function BrojKamila(A, M, N : int64) : int64;

Уколико радите у C/C++-у, потребно је на почетку фајла ставити #include “mudrac.h” а уколико радите

у Pascal-у, потребно је на почетку фајла ставити Unit mudrac; (ово је већ додато у фајловима који су

вам обезбеђени).

Тестирање и експериментисање Уз задатак, обезбеђени су вам “template” фајлови (mudrac.c, mudrac.cpp, mudrac.pas) које можете

користити и мењати по потреби. Такође су вам обезбеђени програми (grader.c, grader.cpp,

grader.pas) који служе да лакше тестирате кодове. Ови програми учитавају са стандардног улаза

следеће податке:

У првом и једином реду бројеве 𝐴, 𝑀 и 𝑁, редом, раздвојене размаком

а затим позивају вашу функцију BrojKamila из одговарајућег фајла (mudrac.c, mudrac.cpp, mudrac.pas)

са учитаним параметрима и на крају вредност коју ваша функција враћа исписују на стандардни

излаз. Kодове ових програма можете мењати по потреби.

Page 11: Проблем 1: Задатакrg.edu.rs/.../informatika/olimpijada/SIO_2015_Zadaci.pdf · 2019-03-27 · Српска Информатичка Олимпијада 16-17. мај

Српска Информатичка Олимпијада 16-17. мај 2015. године

1

Проблем 5: ГПС

Временско ограничење: 1 секунда Меморијско ограничење: 256 MB

Текст проблема Тајна комисија нема времена ни за шта а самим тим ни за планирање путовања од своје тајне базе

до места одржавања СИО-а. Можемо претпоставити да се наша држава састоји од 𝑁 градова

(нумерисаних бројевима од 1 до 𝑁) и 𝑀 двосмерних ауто-путева између неких од њих, при чему је

за сваки ауто-пут познато време потребно да се он пређе. Комисија се налази у граду број 1 а СИО

се одржава у граду број 𝑁.

Међутим, комисија вози последње чудо технологије - Мазду 323 са уграђеним ауто-возачем,

системом за навигацију (ГПС), даљинским блокирањем ауто-путева и сертификатом да је бољи

аутомобил од Ниссан Кашкаија. Једна од (многих) могућности овог аутомобила је следећа: уколико

се тренутно налазимо у граду 𝑋 и у ГПС унесемо град 𝑌, тада, уколико од града 𝑿 до града 𝒀 постоји

јединствена најкраћа путања (која може користити више ауто-путева и пролазити кроз више

градова), ауто-возач ће нас одвести том јединственом најкраћом путањом до града 𝑌. Нажалост, ми

можемо користити ГПС само ако је неки од градова 𝑿 или 𝒀 управо 𝟏 или 𝑵 (још увек није унешено

довљно података). Наравно, осим коришћења ГПС-а/ауто-возача, могуће је возити Мазду на

класичан начин. Такође (видети опис могућности Мазде), могуће је блокирати највише један ауто

пут пре почетка путовања и на тај начин утицати на израчунавања ГПС-а.

Циљ комисије је да стигне из града 1 до града 𝑁 за најкраће могуће време (први приоритет) али да

притом што мање времена вози на класичан начин, без ГПС-а (други приоритет). На вама је да

израчунате колико најмање времена се Мазда мора возити на класичан начин, при чему можете

одлучити да ли ћете у обзир узимати могућност блокирања ауто-пута (видети опис функције и

бодовање).

Описи функција Потребно је да имплементирате функцију

𝑁𝑎𝑗𝑘𝑟𝑎𝑐𝑎𝑉𝑜𝑧𝑛𝑗𝑎(𝑁,𝑀, 𝑔1[… ], 𝑔2[… ], 𝑡[… ])

где je 𝑁 – број градова (градови су нумерисани од 1 до 𝑁), 𝑀 – број ауто-путева а g1, g2 и 𝑡 низови

дужине 𝑀 који описују ауто-путеве: за свако 𝑖 = 1,𝑀̅̅ ̅̅ ̅̅ , 𝑖-ти ауто-пут повезује градове 𝑔1[i] и 𝑔2[𝑖] и

путовање по њему траје 𝑡[𝑖] минута. Ауто-путеви су двосмерни а сви низови су индексирани од 1.

За максималан број поена, ваша функција мора да врати један цео број – најмање време које

комисија мора возити на класичан начин уколико има право да блокира највише један ауто пут. За

мањи број поена, ваша функција може вратити најмање време које комисија мора возити на

класичан начин уколико нема права да блокира ауто путеве; у том случају је потребно вратити

резултат са предзнаком “-” (минус). Уколико је решење 0, не мора се стављати предзнак.

Page 12: Проблем 1: Задатакrg.edu.rs/.../informatika/olimpijada/SIO_2015_Zadaci.pdf · 2019-03-27 · Српска Информатичка Олимпијада 16-17. мај

Српска Информатичка Олимпијада 16-17. мај 2015. године

2

Пример: Нека је 𝑁 = 8, 𝑀 = 11, 𝑔1 = [1, 1, 5, 3, 3, 4, 6, 6, 4, 1, 8], 𝑔2 = [5, 3, 7, 7, 4, 7, 2, 8, 6, 2, 2] и 𝑡 = [12, 10, 5,

8, 10, 3, 2, 7, 3, 30, 5]. Ови подаци одговарају следећој мапи (градови су приказани као кружићи а

ауто-путеви као линије; поред сваког ауто пута је дато време потребно да се он пређе).

Најмање времена потребно да се стигне из града 1 у град 8 (без обзира ко вози) је 30 минута.

Размотримо случај када не блокирамо ниједан ауто пут: тада нпр. можемо у ГПС-у укуцати град број

7 (то је ок јер је 𝑋 = 1) и како до њега постоји јединствена најкраћа путања (1 → 5 → 7) ауто возач ће

нас одвести тамо. Затим можемо да возимо сами до града 2 (7 → 4 → 6 → 2, укупно 8 минута) а

затим можемо из града 2 укуцати у ГПС град 8 (дакле 𝑌 = 8 па можемо користити ГПС) и ауто возач

нас вози у град 8 јединственом најкраћом путањом 2 → 8. Стигли смо до циља за најкраће могуће

време а при том смо сами возили 8 минута – може се показати да не можемо боље уколико не

блокирамо ауто-путеве. Дакле, уколико ваша функција за овај пример врати број −8, добијате 60%

поена (види бодовање).

Са друге стране, ако желимо да користимо функцију блокирања највише једног ауто-пута, тада,

уколико нпр. блокирамо ауто-пут између 5 и 7, можемо позвати ГПС прво за град 2 (јединствена

најкраћа путања 1 → 3 → 4 → 6 → 2) а затим из града 2 позивамо ГПС за град 8. Укупно смо сами

возили 0 минута што је и оптимално решење за овај пример (и носи 100% поена). Приметимо нпр.

да не би било коректно да уклонимо ауто-пут између 4 и 6 и одмах у ГПС унесемо град 8 јер бисмо

тада до њега стигли за 35 минута а морамо стићи за најкраће могуће време (30 минута).

Ограничења 2 ≤ 𝑁 ≤ 105

1 ≤ 𝑀 ≤ 3 ⋅ 105

За свако 𝑖 = 1,𝑀̅̅ ̅̅ ̅̅ важи 1 ≤ 𝑔1[𝑖], 𝑔2[𝑖] ≤ 𝑁, 𝑔1[𝑖] ≠ 𝑔2[𝑖] и 1 ≤ 𝑡[𝑖] ≤ 109

Између свака два града постоји највише један ауто-пут.

Увек ће постојати начин да се стигне из града 𝟏 у град 𝑵.

Подзадаци и бодовање У сваком подзадатку, уколико ваш програм коректно реши варијанту проблема у коме нема

блокирања ауто-путева (што се закључује на основу предзнака “-“ у повратној вредности функције)

добијате 𝟔𝟎% поена од одговарајућег подзадатка. Уколико сваки тест пример подзадатка ваш

програм решава у варијанти где је могуће блокирати највише један ауто-пут, добијате свих 𝟏𝟎𝟎%

поена тог подзадатка.

Page 13: Проблем 1: Задатакrg.edu.rs/.../informatika/olimpijada/SIO_2015_Zadaci.pdf · 2019-03-27 · Српска Информатичка Олимпијада 16-17. мај

Српска Информатичка Олимпијада 16-17. мај 2015. године

3

ПОДЗАДАТАК 1 [11 ПОЕНА]: 𝑁 ≤ 10

ПОДЗАДАТАК 2 [17 ПОЕНА]: 𝑁 ≤ 250 и 𝑀 ≤ 500.

ПОДЗАДАТАК 3 [20 ПОЕНА]: 𝑁 ≤ 2000.

ПОДЗАДАТАК 4 [21 ПОЕНА]: За свако 𝑖 = 1,𝑀̅̅ ̅̅ ̅̅ важи 𝑡[𝑖] = 1.

ПОДЗАДАТАК 5 [31 ПОЕНА]: Нема додатних ограничења.

Детаљи имплементације Потребно је да пошаљете тачно један фајл, под називом gps.c, gps.cpp или gps.pas, који

имплементира горе поменуту функцију. Осим тражене функције, ваш фајл може садржати и додатне

глобалне променљиве, помоћне функције и додатне библиотеке.

Зависно од програмског језика који користите, ваша функција/процедура мора бити следећег

облика:

C/C++ long long NajkracaVoznja(int N, int M, int* g1, int* g2, int* t);

Pascal function NajkracaVoznja(N, M : longint; var g1, g2, t : array of longint) : int64;

Уколико радите у C/C++-у, потребно је на почетку фајла ставити #include “gps.h” а уколико радите у

Pascal-у, потребно је на почетку фајла ставити Unit gps; (ово је већ додато у фајловима који су вам

обезбеђени).

Тестирање и експериментисање Уз задатак, обезбеђени су вам “template” фајлови (gps.c, gps.cpp, gps.pas) које можете користити и

мењати по потреби. Такође су вам обезбеђени програми (grader.c, grader.cpp, grader.pas) који служе

да лакше тестирате кодове. Ови програми учитавају са стандардног улаза следеће податке:

У првом реду бројеве 𝑁 и 𝑀, редом, раздвојене размаком

У следећих 𝑀 редова бројеве 𝑔1[𝑖], 𝑔2[𝑖], 𝑡[𝑖], редом, раздвојене размаком

а затим позивају вашу функцију NajkracaVoznja из одговарајућег фајла (gps.c, gps.cpp, gps.pas) са

учитаним параметрима и на крају вредност коју ваша функција враћа исписују на стандардни излаз.

Kодове ових програма можете мењати по потреби.

Page 14: Проблем 1: Задатакrg.edu.rs/.../informatika/olimpijada/SIO_2015_Zadaci.pdf · 2019-03-27 · Српска Информатичка Олимпијада 16-17. мај

Српска Информатичка Олимпијада 16-17. мај 2015. године

1

Проблем 6: Одабир

Временско ограничење: 1 секунда Меморијско ограничење: 256 MB

Текст проблема Као и увек што се дешава, сви чланови комисије имају паметнија посла од одабира задатака. Пошто

је то досадан посао, они су нашли савршену формулу за одабир задатак, међутим проблем је што

њих мрзи да напишу програм који ће на основу предлога одабрати задатке.

Они већ имају припремљених предлога задатака за које сматрају да су довољно квалитетни да

буду на такмичењу, међутим нико из комисије неће да се потруди да од тих предлога одабере

задатке за такмичење, те је на вама остало да то урадите.

Задаци су нумерисани бројевима од до и сваком задатку је додељен један број који

представља тежину задатка (што је већи број то је по њима теже решити тај задатак).

Задаци се бирају тако што се насумично одреде два броја и ( ) који представљају интервал

одакле се задаци морају изабрати, тј. не може се изабрати ниједан задатак који је нумерисан

бројем мањим од или већим од (посматрају се задаци на позицијама са

тежинама . Поступак за одабир задатака је такав да се одреди број

из интервала и на такмичењу се дају сви задаци нумерисани бројевима од до

, тј. сви задаци нумерисани бројевима .

Чланови тајне комисије су осмислили савршен начин да оцене тежину такмичења на основу задатака

које су одабрали. Тежина такмичења се рачуна тако што се од одабраних задатака (задаци

нумерисани бројевима од до ) саберу тежине најлакшег и најтежег задатка.

Како је ипак ово Српска Информатичка Олимпијада, они хоће да такмичење буде што теже, те за

дати интервал потребно је да пронађете најтеже такмичење. Прецизније, ако са

означимо тежину такмичења где су дати задаци са тежинама , тј.

потребно је да пронађете максимално за , тј. .

Тајна комисија ће направити тачно комбинација одабира задатака за такмичење, те ће на почетку

такмичења одабрати комбинацију задатака коју ће такмичари добити да решавају.

Ваш задатак је да за сваку комбинацију где су вам дати бројеви и пронађете одговарајуће

.

Описи функција Потребно је имплементирати функцију

где је – број предложених задатака, – низ бројева дужине где представља тежину

предложеног задатка, број комбинација које ће се правити за такмичење, и низови бројева

дужине где су и описани бројеви за ту комбинацију одабира задатака.

Page 15: Проблем 1: Задатакrg.edu.rs/.../informatika/olimpijada/SIO_2015_Zadaci.pdf · 2019-03-27 · Српска Информатичка Олимпијада 16-17. мај

Српска Информатичка Олимпијада 16-17. мај 2015. године

2

је празан низ дужине који ваша функција треба да попуни одговарајућим бројевима, тј. на место

у низу потребно је да се постави тежина најтежег такмичења из интервала .

Сви низови су нумерисани од нуле.

Пример: Нека је ваша функција позвана са следећим параметрима:

Први упит над низом je што одговара делу низа те је

за у овом случају најбоље одабрати број 0, тј. одабрао би се само први задатака са тежином

те би тежина такмичења била .

У другом упиту на низом Т je што одговара целом низу , те у овом случају је

потребно одабрати цео низ, тј. и тежина такмичења у том случају је .

У последњем упиту је се посматра низ и најбоље решење се

добија за , а тежина такмичења у том случају је .

Функција на крају извршавања треба да попуни низ тако да је

.

Ограничења

Подзадаци и бодовање ПОДЗАДАТАК 1 [7 ПОЕНА]:

ПОДЗАДАТАК 2 [20 ПОЕНА]:

ПОДЗАДАТАК 3 [13 ПОЕНА]:

ПОДЗАДАТАК 4 [41 ПОЕНА]:

ПОДЗАДАТАК 5 [19 ПОЕНА]: Нема додатних ограничења

Детаљи имплементације Потребно је да пошаљете тачно један фајл, под називом odabir.c, odabir.cpp или odabir.pas, који

имплементира горе поменуту функцију. Осим тражене функције, ваш фајл може садржати и додатне

глобалне променљиве, помоћне функције и додатне библиотеке.

Зависно од програмског језика који користите, ваша функција/процедура мора бити следећег

облика:

Page 16: Проблем 1: Задатакrg.edu.rs/.../informatika/olimpijada/SIO_2015_Zadaci.pdf · 2019-03-27 · Српска Информатичка Олимпијада 16-17. мај

Српска Информатичка Олимпијада 16-17. мај 2015. године

3

C/C++ void Odabir(int N, int *T, int Q, int *L, int *R, int *F);

Pascal procedure Odabir(N: longint; var T: array of longint; Q: longint; var L, R, F : array of longint);

Уколико радите у C/C++-у, потребно је на почетку фајла ставити #include odabir.h” а уколико радите у

Pascal-у, потребно је на почетку фајла ставити Unit odabir; (ово је већ додато у фајловима који су

вам обезбеђени).

Тестирање и експериментисање Уз задатак, обезбеђени су вам “template” фајлови (odabir.c, odabir.cpp, odabir.pas) које можете

користити и мењати по потреби. Такође су вам обезбеђени програми (grader.c, grader.cpp,

grader.pas) који служе да лакше тестирате кодове. Ови програми учитавају са стандардног улаза

следеће податке:

У првом реду се учитава број

У другом реду се учитава бројева, тј. низ

У трећем реду се учитава број

У сваком од следећих редова се налазе два броја који и

а затим позивају вашу функцију Odabir из одговарајућег фајла (odabir.c, odabir.cpp, odabir.pas) са

учитаним параметрима и на крају вредност коју ваша функција враћа исписују на стандардни излаз.

Kодове ових програма можете мењати по потреби.

У наставку је дат пример учитавања са конзоле за тест пример са папира.

Испис на конзолу је следећи: