Gondole (Gondola) - International Olympiad in Informatics
Transkrypt
Gondole (Gondola) - International Olympiad in Informatics
InternationalOlympiadinInformatics2014 13-20thJuly2014 Taipei,Taiwan gondola Day-2tasks Language:pl-PL Gondole(Gondola) GondoleMao-KongnależądonajpopularniejszychatrakcjiTaipei.Tensystemgondoliskładasięz zamkniętejwpierścieńszyny,pojedynczejstacjioraz gondoli,ponumerowanychkolejnood1do , któreporuszająsięwkółkoposzyniewustalonymkierunku.Potym,jakgondola przejedzieprzez stację,kolejnągondoląnastacjijestgondola ,jeśli ,orazgondola1,jeśli . Gondolemogąsięjednakpsuć.Szczęśliwiedostępnajestnieograniczonaliczbazapasowychgondoli, ponumerowanychkolejno , ,itd.Gdygondolazepsujesię,zostajeonazastąpiona (dokładniewtymsamymmiejscuszyny)przezpierwsządostępnągondolęzapasową,tj.gondolę zapasowąonajmniejszymdostępnymnumerze.Przykładowo,jeśliwsystemiejestpięćgondolii gondola1popsujesię,zostanieonazastąpionagondolą6. Uwielbiaszspędzaćczas,stojącnastacjiioglądająckolejnoprzejeżdżająceprzezniągondole. Ciągiemgondolowymnazywamysekwencję numerówgondoli,któreprzejeżdżająkolejnoprzez stację.Mogłosięzdarzyć,żeprzedTwoimprzyjazdemniektóregondolezepsułysię(izostały zastąpioneprzezgondolezapasowe),jednakżadnagondolaniepsujesię,podczasgdyprzebywaszi obserwujeszjenastacji. Zauważ,żewzależnościodtego,któragondolajakopierwszawjeżdżanastację,tasamakolejność gondolinaszyniemożedaćróżneciągigondolowe.Dlaprzykładu,jeśliżadnagondolajeszczesięnie popsuła,zarówno(2,3,4,5,1),jaki(4,5,1,2,3)sąmożliwymiciągamigondolowymi,natomiast(4,3, 2,5,1)niemożebyćtakimciągiem(ponieważgondolewystępująwzłejkolejności). Jeśligondola1popsujesię,jakociąggondolowymożemyzaobserwowaćm.in.ciąg(4,5,6,2,3).Jeśli jakokolejnapopsujesięgondola4,zostanieonazastąpionaprzezgondolę7,comożeprowadzićdo ciągugondolowego(6,2,3,7,5).Jeślidalejpopsujesięgondola7,zastąpijągondola8,akońcowym ciągiemgondolowymmożebyćnp.(3,8,5,6,2). popsutagondola 1 4 7 nowagondola 6 7 8 możliwyciąggondolowy (4,5,6,2,3) (6,2,3,7,5) (3,8,5,6,2) Ciągiemzastąpieńnazywamyciągnumerówkolejnychgondol,któreuległypopsuciu.Ciągiem zastąpieńdlapowyższegoprzykładubędziewięc(1,4,7).Powiemy,żeciągzastąpień prowadzido ciągugondolowego ,jeślipotym,jakpopsująsiękolejnogondolewymienionewciągu ,możemy zaobserwowaćciąggondolowy . Sprawdzaniegondolowościciągu WtrzechpierwszychpodzadaniachTwójprogrampowiniensprawdzić,czydanyciągmożebyć ciągiemgondolowym.Wponiższejtabeliznajdująsięprzykładyciągówgondolowychoraztakich,które 1/4 niemogąbyćciągamigondolowymi.Napiszfunkcjęvalid. valid(n,inputSeq) n:długośćciągu. inputSeq:tablicarozmiaru ;inputSeq[i]to -tyelementciągu,dla . Wynikiemfunkcjipowinnobyć1,jeślidanyciągjestciągiemgondolowym,a0w przeciwnymprzypadku. Podzadania1,2,3 podzadanie liczbapunktów inputSeq 1 5 każdaliczbaod1do występujedokładnieraz 2 5 inputSeq[i] 3 10 inputSeq[i] Przykłady podzadanie 1 1 1 1 2 3 3 inputSeq (1,2,3,4,5,6,7) (3,4,5,6,1,2) (1,5,3,4,2,7,6) (4,3,2,1) (1,2,3,4,5,6,5) (2,3,4,9,6,7,1) (10,4,3,11,12) wynikfunkcji 1 1 0 0 0 1 0 uwagi 1niemożewystąpićtużprzed5 4niemożewystąpićtużprzed3 dwiegondoleonumerze5 ciągzastąpieńto(5,8) 4niemożewystąpićtużprzed3 Wyznaczanieciąguzastąpień WtrzechkolejnychpodzadaniachTwójprogrampowinienodtworzyćprzykładowyciągzastąpień, któryprowadzidozadanegociągugondolowego.Jeśliistniejewielemożliwychciągówzastąpień, możeszwybraćdowolnyznich.Napiszfunkcjęreplacement. replacement(n,gondolaSeq,replacementSeq) n:długośćciągugondolowego. gondolaSeq:tablicarozmiaru ;jestzagwarantowane,żegondolaSeqtociąg gondolowy,agondolaSeq[i]to -tyelementtegociągu,dla . Wynikiemfunkcjipowinnobyć ,tojestdługośćciąguzastąpień. 2/4 replacementSeq:tablicawystarczającodużanato,byprzechowaćcałyciągzastąpień; funkcjapowinnaumieścić -tyelementciąguzastąpieńwpolureplacementSeq[i],dla . Podzadania4,5,6 podzadanie liczbapunktów gondolaSeq 4 5 gondolaSeq[i] 5 10 gondolaSeq[i] 6 20 gondolaSeq[i] Przykłady podzadanie 4 4 5 gondolaSeq wynikfunkcji replacementSeq (3,1,4) 1 (5,1,2,3,4) 0 (2,3,4,9,6,7,1) 2 (2) () (5,8) Zliczanieciągówzastąpień WczterechostatnichpodzadaniachTwójprogrampowinienwyznaczyćliczbęróżnychciągów zastąpień,któreprowadządopodanegociągu(którymożebyćlubniebyćciągiemgondolowym), modulo1,000,000,009.NapiszfunkcjęcountReplacement. countReplacement(n,inputSeq) n:długośćciągu. inputSeq:tablicarozmiaru ;inputSeq[i]to -tyelementciągu,dla . Jeślidanyciągjestciągiemgondolowym,funkcjapowinnawyznaczyćliczbęciągów zastąpień,któreprowadządotegociągugondolowego(któramożebyćogromniasta),i podaćwwynikutęliczbęmodulo1,000,000,009.Jeślidanyciągniejestciągiem gondolowym,wynikiemfunkcjipowinnobyć0.Jeślidanyciągjestciągiemgondolowym odpowiadającymsytuacji,żeżadnagondolaniepopsułasię,wynikiemfunkcjipowinnobyć 1. Podzadania7,8,9,10 podzadanie liczba punktów 7 5 8 15 inputSeq inputSeq[i] inputSeq[i] iconajmniej gondoli niepopsułosię. spośród 3/4 podzadanie liczba punktów inputSeq 9 15 inputSeq[i] 10 10 inputSeq[i] Przykłady podzadanie inputSeq wynikfunkcji ciągzastąpień 7 8 (1,2,7,6) 2 (2,3,4,12,6,7,1) 1 (3,4,5)lub(4,5,3) (5,8,9,10,11) 9 (4,7,4,7) 0 10 (3,4) 2 inputSeqniejestciągiemgondolowym (1,2)lub(2,1) Implementacja Powinieneśzgłosićdokładniejedenplikonazwiegondola.c,gondola.cpplubgondola.pas.W tymplikupowinnaznaleźćsięimplementacjawszystkichtrzechfunkcjiopisanychpowyżej(nawetjeśli planujeszrozwiązaćtylkoniektórepodzadania),onastępującychsygnaturach.Wprzypadkuprogramu wC/C++powinieneśtakżezałączyć(include)pliknagłówkowygondola.h. ProgramywC/C++ intvalid(intn,intinputSeq[]); intreplacement(intn,intgondolaSeq[],intreplacementSeq[]); intcountReplacement(intn,intinputSeq[]); ProgramywPascalu functionvalid(n:longint;inputSeq:arrayoflongint):integer; functionreplacement(n:longint;gondolaSeq:arrayoflongint; varreplacementSeq:arrayoflongint):longint; functioncountReplacement(n:longint;inputSeq:arrayoflongint): longint; Przykładowyprogramsprawdzający Przykładowyprogramsprawdzającywczytujedanewnastępującymformacie: wiersz1:T,numerpodzadania,któreTwójprogrammarozwiązać( ). wiersz2:n,długośćciąguwejściowego. wiersz3:JeśliTjestrówne4,5lub6,wiersztenzawieragondolaSeq[0],..., gondolaSeq[n-1].WprzeciwnymraziewiersztenzawierainputSeq[0],..., inputSeq[n-1]. 4/4