of 41 /41
Komitet Główny Olimpiady Informatycznej Gimnazjalistów V OLIMPIADA INFORMATYCZNA GIMNAZJALISTÓW Zawody indywidualne Treści i opracowania zadań Projekt współfinansowany ze środków Unii Europejskiej w ramach Europejskiego Funduszu Społecznego.

V OLIMPIADA INFORMATYCZNA GIMNAZJALISTÓW

  • Author
    ngodat

  • View
    253

  • Download
    4

Embed Size (px)

Text of V OLIMPIADA INFORMATYCZNA GIMNAZJALISTÓW

  • Komitet Gwny Olimpiady Informatycznej Gimnazjalistw

    V OLIMPIADA INFORMATYCZNA GIMNAZJALISTWZawody indywidualne

    Treci i opracowania zada

    Projekt wspfinansowany ze rodkw Unii Europejskiej w ramach Europejskiego Funduszu Spoecznego.

  • Olimpiada Informatyczna Gimnazjalistw jest corocznym przedmiotowym konkursem przeznaczonym dla uczniw szk gimnazjalnych, organizowanym przez Ministerstwo Edukacji Narodowej. Przedsi wzi cie realizuje Stowarzyszenie Talent partner MEN, wsp organizatorem jest miasto Gdynia.

    Celem g wnym Olimpiady Informatycznej Gimnazjalistw jest zainteresowanie informatyk uczniw szk gimnazjalnych, poprzez szlachetn rywalizacj w rozwi zywaniu ciekawych i inspiruj cych zada i problemw informatycznych, z zastosowaniem podej cia algorytmicznego i podejmowania decyzji z wykorzystaniem komputera.

    Olimpiada Informatyczna Gimnazjalistw przeprowadzana jest w dwch rodzajach zawodw: indywidualnych i dru ynowych.

    Zawody indywidualne rozgrywane s w trzech etapach. Rozwijaj kreatywno , wytrwa o w d eniu do celu i umiej tno podejmowania samodzielnych decyzji. Opiek merytoryczn nad zawodami indywidualnymi sprawuje Instytut Informatyki Uniwersytetu Warszawskiego.

    etap I ma charakter otwarty i polega na samodzielnym rozwi zywaniu przez uczestnika zada ustalonych dla tych zawodw oraz przekazaniu rozwi za w podanym terminie.

    etap II i III polega na rozwi zywaniu zada w warunkach kontrolowanej samodzielno ci.

    Zawody dru ynowe sk adaj si z etapu szkolnego, etapu okr gowego i centralnego. Uczniowie tworz czteroosobowe zespo y. Przedmiotem zawodw dru ynowych s zadania dotycz ce zastosowania informatyki w innych naukach cis ych. Za pomoc specjalnie przygotowanej platformy edukacyjnej mo liwa jest systematyczna praca i przygotowywanie si do zawodw przy pomocy udost pnianych poprzez witryn materia w.

    etap I sk ada si z rund treningowych i dwch rund konkursowych (konkurs szkolny i powiatowy).

    etap II (okr gowy) i III (centralny) zawodw dru ynowych przeprowadzany jest w warunkach kontrolowanej samodzielno ci. Do etapu centralnego przechodzi najlepsza dru yna z ka dego wojewdztwa i najlepsze dru yny z ca ego kraju.

    Gala fina owa tegorocznej Olimpiady obj ta zosta a Honorowym Patronatem Prezydenta Rzeczypospolitej Polskiej Bronis awa Komorowskiego. V Olimpiada Informatyczna Gimnazjalistw obj ta zosta a patronatami honorowymi Ministerstwa Edukacji Narodowej i Prezydenta Miasta Gdyni, a tak e patronatem Fundacji Rozwoju Systemu Edukacji.

    Wi cej informacji na temat projektu: http://www.oig.edu.pl/

    Projekt wspfinansowany ze rodkw Unii Europejskiej w ramach Europejskiego Funduszu Spoecznego.

  • Etap I

    Projekt wspfinansowany ze rodkw Unii Europejskiej w ramach Europejskiego Funduszu Spoecznego.

  • Zadanie: PAR

    Park

    V OIG, etap I. Plik rdowy par.* Dostpna pami: 32MB. 10.017.02.2011

    Bajtocki Park Narodowy synie z dugiego (cho niezbyt szerokiego) pasma grskiego, rozcigajcego si przezcay park z zachodu na wschd. Co roku przyjedaj do niego tumy turystw, ktrzy czsto nie s zbytrozgarnici. Dlatego zarzd parku postanowi przygotowamap caego pasma, podzielon na fragmenty rwnejdugoci. Przy kadym punkcie podziau zarzd zamierza umieci wysoko tego punktu oraz dwie inne liczby:wysoko najwyszego punktu podziau na zachd od niego oraz na wschd od niego.Caa mapa jest ju waciwie gotowa. Pozostaje jedynie obliczy maksymalne wysokoci na zachd i na

    wschd od kadego punktu podziau. Zarzd parku poprosi Ci o napisanie programu, ktry wyznaczy tewartoci.

    Wejcie

    W pierwszym wierszu standardowego wejcia znajduje si jedna liczba cakowita n (1 n 1 000 000) ozna-czajca dugo pasma grskiego. W kadym z nastpnych n wierszy znajduje si po jednej liczbie cakowitejwi (1 wi 1 000 000 000) oznaczajcej wysoko i-tego punktu podziau. Punkty te podane s w kolejnociz zachodu na wschd.W testach wartych przynajmniej 40% punktw zachodzi dodatkowy warunek n 10 000.

    Wyjcie

    Twj program powinien wypisa na standardowe wyjcie dokadnie n wierszy, odpowiadajcych kolejnympunktom podziau (w kolejnoci z zachodu na wschd). W kadym z tych wierszy powinny znale si dwieliczby cakowite ai oraz bi oddzielone pojedynczym odstpem wysoko najwyszego punktu podziau nazachd od punktu i oraz na wschd od niego. W przypadku, gdy na zachd od punktu i nie ma szczytuwyszego ni wi, przyjmujemy ai = wi. Podobnie, jeli na wschd od punktu i nie ma szczytu wyszego niwi, to przyjmujemy bi = wi.

    Przykad

    Dla danych wejciowych:

    5

    1

    3

    2

    4

    3

    poprawnym wynikiem jest:

    1 4

    3 4

    3 4

    4 4

    4 3

    v. 1.02 Park

  • Opracowanie: PAR

    Park

    1 Rozwizanie

    W zadaniu dany jest cig liczb naturalnych w1, w2, . . . , wn, reprezentujcy wysokoci kolejnych punktw podziaumapy. W tym cigu dla kadej liczby i od 1 do n naley obliczy:1. maksimum z liczb w1, . . . , wi

    2. maksimum z liczb wi, . . . , wnMoemy to zrobi bezporednio:

    for i := 1 to n do begin

    maxz := w[i];

    for j := 1 to i - 1 do begin

    if (w[j] > maxz) then maxz := w[j];

    end

    maxw := w[i];

    for j := i + 1 to n do begin

    if (w[j] > maxw) then maxw := w[j];

    end

    wypisz(maxz, maxw);

    end

    Niestety to rozwizanie jest zbyt powolne, poniewa dla kadego i powyszy algorytm przeglda wszystkie innekomrki tablicy w[], co sprawia, e koszt czasowy wyniesie O(n2) (tzn. e algorytm wykona mniej wicej n2 poje-dynczych operacji). Zgodnie z treci zadania, za takie rozwizanie mona byo uzyska 40% punktw.Aby przyspieszy dziaanie programu, wystarczy zauway, e obliczone maksima dla pewnego przedziau mog

    nam posuy w szybkim wyznaczeniu maksimum dla przedziau zawierajcego jedn komrk wicej:

    max{w1, . . . , wi} = max(max{w1, . . . , wi1}, wi)

    max{wi, . . . , wn} = max(wi,max{wi+1, . . . , wn})

    To spostrzeenie pozwala nam napisa szybki algorytm, ktry jest ju rozwizaniem wzorcowym.

    maxz := 0;

    maxw := 0;

    for i := 1 to n do begin

    if w[i] > maxz then maxz := w[i];

    z[i] := maxz;

    end;

    for i := n downto 1 do begin

    if w[i] > maxw then maxw := w[i];

    w[i] := maxw;

    end;

    for i := 1 to n do begin

    wypisz(z[i], w[i]);

    end;

    2 Uwaga na temat strumieni w C++

    Aby mie pewno, e program bdzie wystarczajco szybko dziaa w jzyku C++, warto si jeszcze upewni, e wewaciwy sposb dokonujemy operacji wejcia i wyjcia, tzn. we waciwy sposb wczytujemy i wypisujemy dane. Otoperacje przy pomocy strumieni (cin >> oraz cout

  • Zadanie: SKR

    Skracalne liczby pierwsze

    V OIG, etap I. Plik rdowy skr.* Dostpna pami: 32MB. 10.017.02.2011

    Przypomnijmy, e liczba pierwsza to taka dodatnia liczba cakowita, ktra ma dokadnie dwa rne dzielniki:jedynk i sam siebie. Mwimy, e liczba a jest prefiksem liczby b, jeli liczba a powstaje przez usunicie pewnejliczby cyfr z koca liczby b. Na przykad, liczba 1231 jest prefiksem liczby 12314433. Skracalna liczba pierwszato taka liczba, ktrej wszystkie prefiksy niezerowej dugoci s liczbami pierwszymi. Przykadowo, liczba 23jest skracaln liczb pierwsz, gdy jej niepuste prefiksy 2 i 23 s liczbami pierwszymi.Twoim zadaniem jest napisanie programu, ktry dla zadanych dwch liczb cakowitych dodatnich a, b

    (a b) wyznaczy, ile jest liczb cakowitych, ktre s skracalnymi liczbami pierwszymi i nale do domknitegoprzedziau [a, b].

    Wejcie

    W jedynym wierszu standardowego wejcia znajduj si dwie liczby cakowite a, b (1 a b 1018).Moesz zaoy, e testach wartych 50% punktw zachodzi dodatkowo warunek b 1 000 000.

    Wyjcie

    W jedynym wierszu standardowego wyjcia powinna znale si jedna liczba cakowita bdca liczb skracal-nych liczb pierwszych nie mniejszych od a i nie wikszych od b.

    Przykad

    Dla danych wejciowych:

    20 24

    poprawnym wynikiem jest:

    1

    Wyjanienie do przykadu: W przedziale [20, 24] jest tylko jedna skracalna liczba pierwsza i jest ni 23.

    v. 1.02 Skracalne liczby pierwsze

  • Opracowanie: SKR

    Skracalne liczby pierwsze

    1 Wprowadzenie

    Zadanie polega na wyznaczeniu, ile jest skracalnych liczb pierwszych nalecych do pewnego zadanego przedziau.Skracalna liczba pierwsza to taka liczba, ktrej kady prefiks (w tym rwnie caa liczba) jest liczb pierwsz.

    2 Rozwizanie

    Zanim zabierzemy si za rozwizywanie zadanego problemu, zastanwmy si, jak mona w miar szybko i prostosprawdzi, czy liczba jest pierwsza.

    2.1 Sprawdzanie czy liczba jest pierwsza

    Niech n bdzie pewn liczb, ktrej pierwszo chcielibymy zbada. Zauwamy, e jeli n nie jest liczb pierwsz, tomusz istnie dwie liczby a, b (1 < a b < n) takie, e ab = n. Dodatkowo a

    n. Gdyby tak nie byo, to ab > n.

    To daje od razu nastpujcy algorytm:

    x := sqrt(n);

    czyJestPierwsza := TAK;

    for a := 2 to x do

    if (n mod a = 0) then czyJestPierwsza := NIE;

    Zoono powyszego algorytmu to O(n).

    2.2 Prawdziwe zadanie

    Majc ju takie narzdzie w rku, jestemy w stanie rozwiza nasze zadanie. Dla kadej liczby z zakresu sprawdzamy,czy jest pierwsza, nastpnie czy ta liczba bez ostatniej cyfry jest pierwsza itd.Takie rozwizanie jest jednak duo za wolne. Sprbujmy je przyspieszy. W tym celu mog nam si przyda

    nastpujce spostrzeenia:

    Spostrzeenie 1.

    Jedynymi jednocyfrowymi skracalnymi liczbami pierwszymi s 2, 3, 5, 7.

    Spostrzeenie 2.

    Jeli skracalna liczba pierwsza jest co najmniej dwucyfrowa, to musi koczy si na 1, 3, 7, 9.Gdyby tak nie byo, to byaby podzielna albo przez 2, albo przez 5.

    Korzystajc z powyszych spostrzee, moemy naszkicowa algorytm, ktrego zadaniem bdzie wygenerowaniewszystkich skracalnych liczb pierwszych. Bdziemy korzysta z kolejki, w ktrej bdziemy trzyma skracalne liczbypierwsze. Na pocztku znajd si w niej 2, 3, 5, 7. Za kadym razem bierzemy element z kolejki, dodajemy go dozbioru skracalnych liczb pierwszych, a nastpnie prbujemy t liczb wyduy (doklejajc na jej koniec jedn z cyfr:1, 3, 7, 9), po czym sprawdzamy, czy liczba, jak uzyskalimy, jest pierwsza, i w przypadku pozytywnej odpowiedzidodajemy j do kolejki. Liczba ta bdzie faktycznie skracaln liczb pierwsz, gdy liczba ta jest pierwsza, a wszystkiejej prefiksy s liczbami pierwszymi (to sprawdzilimy ju wczeniej).Pseudokod wyglda nastpujco:

    kolejka := {2, 3, 5, 7};

    while (kolejka nie pusta) do

    pobierz element x z kolejki;

    dodaj x do listy skracalnych liczb pierwszych;

    if (czyJestPierwsza(10 * x + 1)) then dodajDoKolejki(10 * x + 1);

    if (czyJestPierwsza(10 * x + 3)) then dodajDoKolejki(10 * x + 3);

    if (czyJestPierwsza(10 * x + 7)) then dodajDoKolejki(10 * x + 7);

    if (czyJestPierwsza(10 * x + 9)) then dodajDoKolejki(10 * x + 9);

    done;

    v. 1.10 Skracalne liczby pierwsze

  • Uruchamiajc program oparty na tym algorytmie, jestemy w stanie sprawdzi, ile jest wszystkich skracalnych liczbpierwszych. W przypadku, gdy kolejka jest pusta, oznacza to, e nie ma ju adnego kandydata, ktrego moglibymyrozszerzy o jedn cyfr, czyli nie ma ju adnej wikszej skracalnej liczby pierwszej.Na pierwszy rzut oka wydaje si, e zaproponowany algorytm moe dziaa dosy wolno i wygenerowa bardzo

    duo interesujcych nas liczb. . .Jednak po wykonaniu tego algorytmu otrzymujemy, e skracalnych liczb pierwszych jest 83, a najwiksza z nich

    nie przekracza 108. Moemy wic wygenerowa wszystkie szukane liczby, a nastpnie wpisa je w swoje rozwizanie(tablica 83 staych), lub te generowa je na bieco.

    3 Wyzwanie

    Warto spojrze na zadanie Liczby antypierwsze z VIII Olimpiady Informatycznej, ktre mona rwnie prbowarozwizywa w pokazany powyej sposb.

    v. 1.10 Skracalne liczby pierwsze

  • Zadanie: URZ

    Urzdnicy

    V OIG, etap I. Plik rdowy urz.* Dostpna pami: 32MB. 10.017.02.2011

    WBajtocji ostatnimi czasy nie dzieje si najlepiej. Do wadzy doszed opanowany obsesyjnym strachem o swojeycie krl Bitogrom. Ju w kilka dni po objciu tronu ukaza on swoje bezwzgldne oblicze, cinajc piciudworzan podejrzanych o spiskowanie przeciw niemu. Na wszystkich urzdnikw w pastwie pad strach o wasneycie. Mieli oni wiadomo, e kady donos przeoonego prowadzi do szybkiej egzekucji. Spraw pogarszafakt, e donosiciel stawa si zaufanym czowiekiem krla, ktremu tym samym nie grozi ju wyrok skazujcy.W zastraszonym rodowisku urzdnikw pastwowych bya to wystarczajca motywacja, eby donie naktrego ze swoich podwadnych.Sytuacja w urzdach bardzo zmartwia profesora Bajtoszewskiego, ktry przewidywa zwizane z ni utrud-

    nienia w dziaaniu sektorw pastwowych. Poprosi Ci, aby obliczy, ilu maksymalnie urzdnikw moe zostastraconych wskutek donosw. Profesor wyjani Ci dokadniej zasady funkcjonowania pastwa:

    Kady z n urzdnikw w pastwie ma unikatowy identyfikator bdcy liczb cakowit z przedziau [1, n].

    Kady przeoony ma numer mniejszy od numerw wszystkich swoich podwadnych.

    Przeoonym wszystkich urzdnikw jest premier Bajtocji, ktry ma numer 1 i, tym samym, nie maprzeoonego.

    Kady urzdnik donosi na co najwyej jednego ze swoich podwadnych, poniewa po pierwszym donosiejest on ju zaufanym czowiekiem krla.

    W Bajtocji panuje zasada: podwadny mojego podwadnego jest moim podwadnym, co w praktyceoznacza, e urzdnik moe donie na urzdnika, dla ktrego jest przeoonym tylko porednio.

    Wejcie

    W pierwszym wierszu standardowego wejcia znajduje si jedna liczba cakowita n (1 n 1 000 000)oznaczajca liczb urzdnikw. W drugim wierszu znajduje si n 1 liczb cakowitych, z ktrych i-ta oznaczanumer przeoonego urzdnika o numerze i+ 1.W testach wartych cznie co najmniej 40% punktw zachodzi dodatkowo warunek n 1 000.

    Wyjcie

    W pierwszym i jedynym wierszu standardowego wyjcia powinna znale si jedna liczba cakowita, bdcamaksymaln liczb urzdnikw, ktrzy mog zosta straceni w wyniku donosw.

    Przykad

    Dla danych wejciowych:

    4

    1 2 2

    poprawnym wynikiem jest:

    2

    Wyjanienie do przykadu: Urzdnik numer 1 donosi na urzdnika numer 3, a urzdnik numer 2 na urzd-nika numer 4.

    v. 1.10 Urzdnicy

  • Opracowanie: URZ

    Urzdnicy

    Rozwizanie wzorcowe

    Rozwizanie tego zadania polega na zastosowaniu pewnej czsto powtarzajcej si w programowaniu techniki mianowicie programowania dynamicznego.Trudno jest, patrzc na ca struktur pastwa Bajtocji, od razu stwierdzi, jaka jest maksymalna moliwa liczba

    ofiar terroru krla Bitogroma. Jednak zastanwmy si, czy mona to zadanie podzieli na mniejsze podzadania, ktrestosunkowo atwo mona czy w coraz wiksze. Ot zauwamy, e hierarchia urzdnikw w naturalny sposb dzielisi na coraz mniejsze czci.Wemy na przykad dowolnego urzdnika u i zamy, e jego bezporedni podwadni to u1, u2, . . . , uk. Kady

    z nich ma zbir swoich wszystkich (porednich i bezporednich) podwadnych, ktry razem z nim samym tworzypewn specyficzn podstruktur pastwa nazwijmy j poddrzewem urzdnika ui

    . Szczegln cech poddrzewajest to, e ma ono bardzo podobn struktur do caego drzewa, czyli caej hierarchii urzdnikw w pastwie mogoby np. samo w sobie tworzy dane wejciowe w niniejszym zadaniu. Dalej, kady z bezporednich podwadnychu moe mie wasnych bezporednich podwadnych, ktrzy maj wasne poddrzewa. I tak struktura pastwa tworzydrzewo zaczynajce si od premiera, kady z jego bezporednich podwadnych ma wasne poddrzewo itd. a dojdziemydo urzdnikw na samym dole hierarchii, ktrych poddrzewa s zoone z nich samych.Aby posuy si programowaniem dynamicznym, najpierw musimy uoglni nasz problem obliczeniowy. Zamiast

    pyta si o maksymaln liczb ofiar w caym pastwie, sprbujmy obliczy maksymaln liczb donosw w kadympoddrzewie. Niech rozw[u] oznacza maksymaln liczb ofiar w poddrzewie urzdnika u. Chcemy wic nie tylkoobliczy rozw[1] (co jest odpowiedzi w zadaniu), ale te rozw[u] dla wszystkich innych urzdnikw u.Dlaczego niby uoglnienie problemu ma nam pomc w jego rozwizaniu? Ot dlatego, e teraz wystarczy nam

    znalezienie sposobu na obliczanie rozw[u] w dwch prostych przypadkach: kiedy u nie ma adnych podwadnych;

    kiedy podwadnymi u s u1, u2, . . . , uk, k 1 oraz znamy wartoci rozw[u1], rozw[u2], . . . , rozw[uk].Jeli znajdziemy metod na rozwizanie tych dwch mniejszych zada, to wystarczy, jeli przejrzymy wszyst-

    kich urzdnikw od najwikszych numerw do numeru 1 wtedy przegldajc kadego kolejnego, znajdziemy siw jednej z powyszych sytuacji. W ten sposb bdziemy mogli budowa rozwizania maych problemw, otrzymujcrozwizania coraz wikszych, a na kocu rozwiemy cay wielki problem, postawiony w zadaniu.Jak wic moemy obliczy rozw[u] w powyszych dwch przypadkach? Jeli u nie ma adnych podwadnych,

    to wtedy oczywicie rozw[u] = 0, poniewa nie doniesie on sam na siebie. Zamy teraz, e u ma bezporednichpodwadnych u1, u2, . . . , uk, k 1 i przyjmijmy, e realizujemy scenariusz zapisany w kadej z komrek tablicyrozw[] odpowiadajcych bezporednim podwadnym u. Oznaczmy s = rozw[u1] + . . .+ rozw[uk]. Wtedy mamydwie moliwoci:

    Kady urzdnik w poddrzewie u (oprcz niego samego) donis na kogo bd by ofiar donosu. Jest to rwno-znaczne temu, e liczba 2s+1 jest rozmiarem caego poddrzewa u (liczb urzdnikw w nim si znajdujcych).Wtedy rozmiar ten jest nieparzysty i niemoliwym jest, by w tym drzewie dokonano wicej ni s donosw moemy wic wtedy bezpiecznie przyj, e u nie donosi na nikogo, oraz rozw[u] = s.

    W przeciwnym wypadku liczba 2s+1 jest mniejsza ni rozmiar caego poddrzewa, a wic jest w nim urzdnik,na ktrego u moe donie, dajc sumaryczn liczb donosw rwn s + 1. Wikszej liczby donosw w tympoddrzewie nie mona osign, bo to by oznaczao, e w pewnym poddrzewie ui mona osign wicej ofiarni rozw[ui].

    Otrzymujemy wic prosty sposb na obliczenie rozw[u]. Jeli 2s+1 jest rwne rozmiarowi poddrzewa u, to rozw[u] =s, a w przeciwnym wypadku rozw[u] = s+ 1.Pozostaje jeszcze problem szybkiego obliczania wielkoci poddrzew. Nachalne przechodzenie caego poddrzewa

    kadego urzdnika zajmie w sumie czas kwadratowy ze wzgldu na n, co jest zbyt kosztowne. Jednak i tutaj moemyposuy si programowaniem dynamicznym. Oznaczmy przez size[u] rozmiar poddrzewa u i rozpatrzmy dwaprzypadki, takie jak poprzednio:

    u nie ma adnych podwadnych wtedy size[u] = 1;

    bezporednimi podwadnymi u s u1, u2, . . . , uk, k 1 wtedy size[u] = 1 + size[u1] + . . .+ size[uk].

    W ten sposb otrzymujemy rozwizanie o koszcie czasowym O(n).

    Motywacja do takiej nazwy wypywa ze struktury caej administracji w pastwie; jeeli bowiem narysujemy na kartce wszystkichurzdnikw od 1 do n od gry do dou kartki i poprowadzimy linie pomidzy kadym urzdnikiem (oprcz premiera) i jego szefem, topowstanie rysunek przypominajcy odwrcone drzewo; zbir wszystkich podwadnych zadanego urzdnika ma podobn struktur, ktrazawiera si w strukturze caego pastwa dlatego nazywamy j poddrzewem.

    v. 1.00 Urzdnicy

  • Zadanie: WYS

    Wycig

    V OIG, etap I. Plik rdowy wys.* Dostpna pami: 64MB. 10.017.02.2011

    Wycig Tour de Bajtocja jest organizowany co roku na trasie z miasta A do miasta B. Ze wzgldu na dziurbudetow, w tym roku wycig odbdzie si tylko na pewnym odcinku trasy. Nie jest jeszcze ustalone, jaki tobdzie odcinek, cho ustalona jest ju jego dugo.Na caej trasie rozstawione s znaki ograniczajce prdko jazdy. Ograniczenie obowizuje do momentu

    zmiany tego ograniczenia przez inny znak. Wycig Tour de Bajtocja znany jest z obowizku przestrzeganiaogranicze prdkoci.Organizatorzy zastanawiaj si, jaki fragment trasy (o dugoci m) wybra, aby przestrzegajc ogranicze

    prdkoci, mona byo go jak najszybciej przejecha.Zostae poproszony o napisanie programu, ktry wyznaczy najkrtszy czas przejechania takiego fragmentu

    trasy.

    Wejcie

    W pierwszym wierszu standardowego wejcia znajduj si trzy liczby cakowite n, m oraz d (1 n 1 000 000,1 m d 109), pooddzielane pojedynczymi odstpami, oznaczajce odpowiednio liczb znakw ustawio-nych na trasie, dugo odcinka, na ktrym powinien odby si wycig, oraz dugo trasy z A do B.Nastpne n wierszy zawiera opisy kolejnych znakw ustawionych na trasie. Opis znaku skada si z dwch

    liczb cakowitych si, vi (0 si d, 1 vi 1 000 000), oddzielonych pojedynczym odstpem, oznaczajcychodpowiednio odlego i-tego znaku od miasta A oraz ograniczenie prdkoci obowizujce od ustawienia tegoznaku. Moesz zaoy, e 0 = s1 < s2 < . . . < sn.W testach wartych przynajmniej 50% punktw zachodz dodatkowe warunki n 1 000 oraz d 1 000 000.

    Wyjcie

    W pierwszym i jedynym wierszu standardowego wyjcia Twj program powinien wypisa jedn liczb rze-czywist zaokrglon do dokadnie trzech cyfr po kropce dziesitnej, oznaczajc najkrtszy moliwy czasprzejechania trasy dugoci m. Wybierany odcinek trasy nie moe wykracza poza tras z miasta A do miastaB.

    Przykad

    Dla danych wejciowych:

    3 4 7

    0 30

    2 50

    4 40

    poprawnym wynikiem jest:

    0.090

    A B405030

    0 1 2 3 4 5 6 7

    Wyjanienie do przykadu: Optymalna trasa zaczyna si w odlegoci 2 od miasta A. Czas przejechaniatej trasy jest rwny 2

    50+ 240= 9100.

    Wskazwka: Aby unikn bdw zaokrgle, do oblicze polecamy uywa typw rzeczywistych podwjnejprecyzji (double) oraz standardowych procedur/funkcji sucych do wypisywania liczb rzeczywistych z zadanprecyzj.

    v. 1.05 Wycig

  • Opracowanie: WYS

    Wycig

    1 Rozwizanie brutalne

    Najprostszym rozwizaniem zadania jest rozpatrzenie wszystkich moliwych tras dugoci m i dla kadej z nichobliczenie czasu potrzebnego na jej przejazd.Do takiego rozwizania przydaaby si tablica, z ktrej moglibymy odczytywa ograniczenie prdkoci na jed-

    nostkowym kawaku trasy. Wyznaczenie takiej tablicy jest stosunkowo proste.Moemy przy kadym wczytanym znaku uaktualnia czas przejazdu od miejsca ustawienia znaku, a do koca

    trasy.Pseudokod takiego rozwizania mgby wyglda nastpujco:

    wczytaj(n, m, d);

    wynik := INF;

    for i := 1 to n do begin

    wczytaj(s, v);

    for j := s to d - 1 do

    predkosc[j] := v;

    end;

    for i := 0 to d - m do begin

    akt := 0.0;

    for j := i to i + m - 1 do

    akt := akt + 1.0 / predkosc[j];

    if akt < wynik then

    wynik := akt;

    end;

    wypisz(wynik);

    Takie rozwizanie dziaa zdecydowanie za wolno. Zoono czasowa wynosi O(d(d + n +m)), gdy zbudowanietablicy z ograniczeniami prdkoci zajmuje czas O(dn), a obliczenie czasu potrzebnego na przejazd kadej moliwejtrasy wymaga wykonania O(dm) operacji.

    2 Rozwizanie powolne

    Zamy, e mamy obliczony czas potrzebny na przejechanie odcinka (i, i + m). Aby obliczy czas przejazdu dlaodcinka (i+1, i+m+ 1), moemy wykorzysta obliczony czas dla powtarzajcej si czci. Powtarzajc si czcibdzie (i + 1, i+m). Wystarczy wic, e odejmiemy czas przejechania odcinka (i, i+ 1) oraz dodamy czas odcinka(i+m, i+m+ 1).Aby polepszy zoono caego rozwizania naleaoby jeszcze ulepszy generowanie tablicy do odczytywania

    prdkoci na jednostkowym kawaku trasy.Mona to zrobi w do prosty sposb. Na pocztku zapisujemy prdkoci tylko dla jednostkowych kawakw

    trasy, zaczynajcych si w miejscu ustawiania znakw. Nastpnie przechodzimy ca tras i uaktualniamy prdkocidla pozostaych miejsc.Pseudokod mgby wyglda nastpujco:

    wczytaj(n, m, d);

    for i := 1 to n do begin

    wczytaj(s, v);

    predkosc[s] := v;

    end;

    for i := 0 to d - 1 do

    if predkosc[i] = 0 then

    predkosc[i] := predkosc[i - 1];

    akt := 0.0;

    for i := 0 to m - 1 do

    akt := akt + 1.0 / predkosc[i];

    wynik := akt;

    for j := m to d - 1 do begin

    akt := akt - 1.0 / predkosc[j - m] + 1.0 / predkosc[j];

    if akt < wynik then

    v. 1.00 Wycig

  • wynik := akt;

    end;

    wypisz(wynik);

    Zoono takiego rozwizania poprawia si do O(n+ d), gdy ustawienie wszystkich znakw zajmuje czas O(n),a wygenerowanie tablicy z ograniczeniami prdkoci i czne obliczanie czasw przejazdw wszystkich poprawnychodcinkw to czas rzdu O(d).

    3 Rozwizanie wzorcowe

    Zauwamy, e jedyne fragmenty trasy, ktre warto rozpatrywa, to te, ktre kocz si lub rozpoczynaj w miejscuzmiany ograniczenia prdkoci.Faktycznie, rozwamy fragment, ktry nie zaczyna ani nie koczy si w miejscu ustawienia znaku. Wtedy jeli

    ograniczenie prdkoci na jednym kawaku jest mniejsze ni na drugim, to moemy przesuwa fragment, poprawiajcczas przejechania trasy. Jeli natomiast ograniczenie prdkoci jest takie same, to przesuwajc fragment w jedn zestron, nie pogorszymy czasu przejechania tego fragmentu, a bdzie si on zaczyna lub koczy w miejscu ustawieniaznaku.Pocztki wszystkich fragmentw moemy wyznaczy podczas wczytywania danych. Pseudokod ich wyznaczenia

    moe wyglda nastpujco.

    wczytaj(n, m, d);

    for i := 1 to n do begin

    wczytaj(s, v);

    if s - m > 0 then

    nowyPoczatek(s - m);

    if s + m < d then

    nowyPoczatek(s);

    end;

    // dodajemy fragment, ktry koczy si w miejscu zakoczenia caej trasy

    nowyPoczatek(d - m);

    Aby mc efektywnie rozwiza zadanie, powinnimy uporzdkowa niemalejco pocztki tras. Mona je posorto-wa sortowaniem szybkim w czasie O(n logn) lub zauway, e powstan nam dwa posortowane cigi, ktre moemyscali w czasie O(n).Majc posortowany cig wszystkich pocztkw fragmentw tras, moemy przej do obliczania wyniku. Zrobimy

    to podobnie jak w rozwizaniu powolnym do obliczania czasu pomidzy dwoma fragmentami wykorzystamypowtarzajce si fragmenty tras (odejmujc pocztek i dodajc koniec). Naley tylko skaka o wiksze fragmenty do wyznaczonych pocztkw tras. Dopracowanie szczegw technicznych tego skakania pozostawiamy Czytelnikowi.Zoono takiego rozwizania jest liniowa. Wszystkich pocztkw tras bdzie maksymalnie 2n, wic przegldajc

    tylko takie fragmenty i uaktualniajc je w czasie staym, mamy liniowy czas rozwizania caego rozwizania.

    v. 1.00 Wycig

  • Zadanie: ZAP

    Zapaki

    V OIG, etap I. Plik rdowy zap.* Dostpna pami: 32MB. 10.017.02.2011

    Bajtek bawi si zapakami. Na jednym z kocw zapaki znajduje si gwka pokryta mas uatwiajc zapon.Bajtek uoy zapaki w linii prostej jedna obok drugiej, w taki sposb, e kady koniec zapaki ssiadujez kocem pewnej innej zapaki, oprcz dwch skrajnych zapaek, ktre ssiaduj tylko jednym kocem.

    Przykadowe uoenie zapaek.

    Bajtek chciaby podpali pierwsz zapak (skrajn z lewej) tak aby wszystkie zapaki spaliy si. Pierwszzapak zapali on przy uyciu zapalniczki, moe wic to zrobi bez wzgldu na jej uoenie. Natomiast midzykolejnymi zapakami ogie przeniesie si tylko, jeli co najmniej jedna z tych zapaek w miejscu poczeniabdzie zwrcona gwk. Zastanawiamy si, ile minimalnie zapaek musimy odwrci, aby wszystkie zapakispaliy si, jeli podpalimy pierwsz zapak.

    Wejcie

    Pierwszy wiersz standardowego wejcia zawiera jedn liczb cakowit n (1 n 1 000 000) oznaczajcliczb zapaek Bajtka. Drugi wiersz opisuje uoenie kolejnych zapaek zawiera cig n liczb cakowitychx1, x2, . . . , xn, przy czym xi oznacza zwrot i-tej zapaki w cigu: 0 jeli gwka zapaki znajduje si z lewejstrony, za 1 jeli gwka zapaki znajduje si z prawej strony.W testach wartych cznie co najmniej 50% punktw zachodzi dodatkowo warunek n 10 000.

    Wyjcie

    Pierwszy i jedyny wiersz standardowego wyjcia powinien zawiera jedn liczb cakowit rwn minimalnejliczbie zapaek, jakie naley odwrci.

    Przykad

    Dla danych wejciowych:

    5

    1 0 0 1 1

    poprawnym wynikiem jest:

    2

    v. 1.01 Zapaki

  • Opracowanie: ZAP

    Zapaki

    1 Wprowadzenie

    Rozwizanie zadania opiera si na obserwacji, e poprawne ustawienia zapaek mog by tylko takie, e w pewnymmiejscu ssiaduj dwie gwki zapaek, a nastpnie z obydwu stron wszystkie zapaki zwrcone s w tym samymkierunku.Dlaczego tylko takie przypadki s poprawne? Rozwamy miejsce i, w ktrym ssiaduj dwie gwki zapaek.

    Zauwamy, e na pozycji i + 1 oraz i 1 musi znajdowa si co najmniej jedna gwka zapaki. Jest tylko jednamoliwo ustawienia ssiednich zapaek w taki sposb. W zwizku z tym kada nastpna, ssiednia zapaka, ktrchcemy dooy, musi by ustawiona w tym samym kierunku. To pokazuje, e moe by maksymalnie jedna parazapaek zwrconych do siebie gwkami.Pozostaj przypadki, w ktrych nie ma adnej takiej pary. Poprawne ustawienie otrzymujemy tylko wtedy, gdy

    wszystkie zapaki s uoone w tym samym kierunku. Mona przyj, e w tym przypadku dwie gwki zapaekssiaduj na pozycji 0 albo n.

    2 Rozwizanie powolne

    Pierwszym, narzucajcym si rozwizaniem moe by rozwaenie wszystkich n + 1 przypadkw. Zakadamy, e nakolejnych pozycjach: 0, 1, 2, . . . , n ssiaduj dwie gwki zapaek, i w czasie liniowym obliczamy liczb zapaek, ktremusimy obrci, aby doprowadzi do takiej sytuacji.Zaimplementowanie takiego rozwizania jest stosunkowo proste. Jeli rozwaamy i-t pozycj, to pierwsze i za-

    paek musi by obrcone gwk w prawo, a wszystkie nastpne w lewo. Wystarczy wic zliczy te zapaki, ktre snieodpowiednio obrcone.Przykadowy pseudokod mgby wyglda nastpujco:

    wczytaj(n, zapalki[]);

    wynik := n;

    for i := 0 to n do begin

    ile := 0;

    for j := 1 to i do

    // zwikszam, jeli zapaka jest obrcona w lewo

    ile := ile + 1 - zapalki[j];

    for j := i + 1 to n do

    // zwikszam, jeli zapaka jest obrcona w prawo

    ile := ile + zapalki[j];

    wynik := min(wynik, ile);

    end;

    wypisz(wynik);

    Takie rozwizanie jest niestety za wolne. Jego zoono wynosi O(n2), poniewa dla kadej pozycji ssiednichgwek zapaek, szukamy liniowo liczby zapaek, ktre musimy obrci. Zgodnie z treci zadania, za takie rozwizaniemona byo uzyska 50% punktw.

    3 Rozwizanie wzorcowe

    Zastanwmy si, jak dla pozycji i odpowiedzie szybko na pytania:

    ile z pierwszych i zapaek jest obrconych w lewo?

    ile z ostatnich n i zapaek jest obrconych w prawo?

    Jeli umielibymy odpowiada na takie pytania szybciej ni liniowo, to moglibymy to wykorzysta do zliczenia leobrconych zapaek, zamiast robi to w brutalny sposb jak powyej.Wygenerowanie takich odpowiedzi jest cakiem proste. Moemy je obliczy i zapamita zaraz po wczytaniu da-

    nych. Wyznaczymy tzw. sumy czciowe prefiksowe i sufiksowe.

    W komrce pref[i] bdziemy pamita, ile z i pierwszych zapaek jest obrconych w lewo:

    pref[0] := 0;

    for i := 1 to n do

    pref[i] := pref[i - 1] + 1 - zapalki[i];

    v. 1.00 Zapaki

  • W komrce suf[i + 1] bdziemy pamita, ile z n i ostatnich zapaek jest obrconych w prawo:

    suf[n + 1] := 0;

    for i := n downto 1 do

    suf[i] := suf[i + 1] + zapalki[i];

    Majc wyliczone tablice pref[] i suf[], gwn ptl obliczajc wynik moemy zapisa nastpujco:

    for i := 0 to n do

    wynik := min(wynik, pref[i] + suf[i + 1]);

    Zoono czasowa takiego rozwizania wynosi O(n), gdy dla kadej pozycji ssiednich gwek zapaek, w czasieO(1) obliczamy liczb zapaek, ktre musimy obrci. Czas potrzebny na wyznaczenie tablic pref[] i suf[] wynosirwnie O(n). Zoono pamiciowa tego rozwizania jest liniowa.

    v. 1.00 Zapaki

  • Etap II

    Projekt wspfinansowany ze rodkw Unii Europejskiej w ramach Europejskiego Funduszu Spoecznego.

  • Zadanie: MON

    Monety

    V OIG, etap II. Plik rdowy mon.* Dostpna pami: 16MB. 02.04.2011

    Bajtazar jest niezwykle dumny ze swojej kolekcji rzadkich monet. Zbiera je przez wiele lat, dbajc o to, byadne dwie nie byy podobne. Obecnie ma n monet ponumerowanych w taki sposb, e i-ta moneta ma rozmiardokadnie i.Jako e kolekcja Bajtazara ostatnio powikszya si, by on zmuszony kupi nowy klaser. Jest w nim

    dokadnie n przegrd na monety, kada o okrelonym rozmiarze. Oczywicie adnej monety nie mona woydo zbyt maej przegrody. Nic nie stoi jednak na przeszkodzie, by woy j do przegrody wikszej.Bajtazar zastanawia si teraz, do ktrych przegrd woy poszczeglne monety. Po sprawdzeniu wielu

    kombinacji zaintrygowao go rwnie pytanie, na ile sposobw moe zapeni klaser. Poniewa liczba ta moeby bardzo dua, Bajtazarowi wystarczy jej reszta z dzielenia przez 109 + 7. Napisz program, ktry zaspokoijego ciekawo.

    Wejcie

    Pierwszy wiersz standardowego wejcia zawiera jedn liczb cakowit n (1 n 1 000 000). W nastpnymwierszu znajduje si n liczb cakowitych ai (1 ai n) pooddzielanych pojedynczymi odstpami. Liczba aioznacza, jak najwiksz monet mona woy do i-tej przegrody.Moesz zaoy, e w testach wartych co najmniej 50% punktw zachodzi dodatkowo warunek: n 1000.

    Wyjcie

    Twj program powinien wypisa na standardowe wyjcie jedn liczb cakowit reszt z dzielenia liczbysposobw zapenienia klasera przez 109 + 7. Jeli nie istnieje aden sposb zapenienia klasera monetami,prawidowym wynikiem jest 0.

    Przykad

    Dla danych wejciowych:

    4

    4 2 4 2

    poprawnym wynikiem jest:

    4

    v. 1.03 Monety

  • Opracowanie: MON

    Monety

    1 Analiza problemu

    Przypomnijmy, e cig ai (1 i n) oznacza rozmiary przegrd na monety. Jako, e monety Bajtazara majwielkoci dokadnie 1, 2, . . . , n, zadanie sprowadza si do obliczenia wszystkich kolejnoci liczb 1, 2, . . . , n, takich, ei-ta z kolei liczba jest mniejsza lub rwna ai.

    2 Rozwizanie brutalne

    Najprostszym rozwizaniem jest wygenerowanie wszystkich kolejnoci liczb 1, 2, . . . , n (czyli permutacji) i dla kadejz nich sprawdzenie powyszego warunku. Niestety liczba permutacji zbioru zoonego z n elementw wynosi n!, czyli1 2 . . . (n 1) n, co nawet dla niewielkich n moe by ogromn liczb (10! = 3628800, 15! = 1307674368000).Mona co prawda przerywa obliczenia, jeli zauwaymy, e ktra nierwno nie jest speniona i nie generowawicej permutacji, ale nawet takie rozwizanie nie ma szans zmieci si w limitach czasowych.

    3 Rozwizanie wzorcowe

    Jak wida musimy by sprytniejsi. Najpierw zauwamy, e wynik nie zaley od kolejnoci liczb ai. Dlaczego tak jest?Jak ju powiedzielimy kolejno liczb 1, 2, . . . , n opisuje poprawne zapenienie klasera wtedy i tylko wtedy gdy i-taz kolei liczba jest mniejsza lub rwna ai. Wyobramy sobie sytuacj, e zamieniamy midzy sob pewne przegrdki,ale wraz z nimi przesuwamy monety, ktre prbowalimy do nich woy. Wtedy poprawne przyporzdkowanieoczywicie si nie popsuje, a niepoprawne nadal pozostanie niepoprawne.Skoro nie musimy dba o kolejno liczb ai, to moemy przeglda je w najwygodniejszej kolejnoci czyli nie-

    malejcej. Do najmniejszej przegrdki moemy woy oczywicie a1 najmniejszych monet. Do drugiej przegrdkizmieci si a2 monet, ale pamitajmy, e jedn ju zuylimy, zatem pierwsze 2 przegrdki zapenimy na a1(a2 1)sposobw. Moe dalej bdzie podobnie?Zamy, e k 1 pierwszych przegrdek jest ju zapenione. Kad niewykorzystan monet mniejsz lub rwn

    ak moemy woy na k-te miejsce, a takich monet jest ak k + 1. Dziki temu otrzymujemy elegancki wzr nawynik: a1(a2 1)(a3 2) (an n + 1). Zauwamy, e klasera nie da si zapeni tylko wtedy, gdy ak < k dlapewnego k. Zgadza si to z naszym wzorem, bo kolejne czynniki mog zmniejsza si maksymalnie o 1 i ak < kpociga pojawienie si 0 w iloczynie.Zanim zaczniemy pisa rozwizanie zwrmy uwag na haczyk jeli po prostu wymnoymy powysze n liczb,

    moemy wyj poza zakres liczb 64-bitowych! Aby tego unikn moemy po kadym mnoeniu pamita tylko resztz dzielenia wyniku przez 109 + 7. Oto pseudokod powyszego rozwizania (a modulo b oznacza reszt z dzielenialiczby a przez b).

    sort(a[1]...a[n]);

    wynik = 1;

    dzielnik = 1 000 000 007;

    for i := 1 to n do

    wynik = (wynik * (a[i] - i + 1)) modulo dzielnik;

    return wynik;

    Przedstawiony algorytm dziaa w czasie O(n) czyli liczba operacji jest proporcjonalna do n o wiele szybciej nipierwszy pomys. Nie wolno zapomnie o czasie sortowania liczb ai tu moemy uy sortowania przez zliczanie,ktre rwnie dziaa w czasie O(n). Takie rozwizanie mona znale w plikach mon.cpp oraz mon.pas. Jeli uyjemysortowania w czasie O(n logn), otrzymamy rozwizanie niewiele wolniejsze.

    4 Rozwizanie alternatywne

    Drugie rozwizanie jest nieco trudniejsze do zrozumienia, ale rwnie jest ciekawe. Polega na odwrceniu sposobumylenia. Ot zamiast zastanawia si, ile monet moemy woy do jednego pojemnika, moemy zlicza, do ilupojemnikw moe trafi dana moneta. Oznaczmy przez F (k) liczb sposobw woenia k najmniejszych monet do knajmniejszych przegrdek. Wynikiem dziaania programu bdzie oczywicie F (n). Aby jednak otrzyma algorytm,musimy znale sposb na obliczanie kolejnych wartoci F (k).

    v. 1.00 Monety

  • Najpierw posortujmy przegrdki niemalejco, podobnie jak w poprzednim rozwizaniu. Pocztek obliczania funk-cji F jest prosty: F (1) = 1, poniewa a1 1. Zamy, e znamy F (k 1). Jak wtedy policzy F (k)? Woylimyk 1 monet i musimy znale miejsce na monet wielkoci k. Moliwych miejsc jest tyle, ile przegrdek wielkocico najmniej k wrd pierwszych (czyli najmniejszych) k przegrdek oznaczmy t liczb przez bk. Jeli bk = 0, towida, e si nam nie powiedzie i moemy przerwa obliczenia. Zamy wic, e bk > 0. A co zrobi z monet, ktrabya wczeniej na wybranym miejscu? Ma ona rozmiar mniejszy od k, wic moemy wstawi j w k-t przegrdk(tutaj korzystamy z tego, e posortowalimy dane!).Zatem z kadej poprawnej permutacji pierwszych k1 monet otrzymujemy bk poprawnych permutacji pierwszych

    k monet. Trzeba tutaj pokaza, e w ten sposb nie stworzymy dwukrotnie tej samej permutacji, ale zostawiamy tojakie atwe wiczenie dla czytelnika. Daje nam to wzr F (k) = bkF (k 1) dla k > 1.Zatem wynik to po prostu b2 b3 bn zgadza si to z obserwacj, e jeli ktre bi jest rwne 0 to nie uda nam

    si w aden sposb wypeni klasera.Pozostaje kwestia wyznaczenia liczb bi. Niech ci oznacza pierwsz pozycj, na ktrej aci i (pamitajmy, e cig

    ai jest posortowany niemalejco). Zauwamy, e bi = i ci+1. Liczby ci mona ju policzy w bardzo prosty sposb:

    j := 1;

    for i := 1 to n do

    begin

    while j

  • Zadanie: OBW

    Obwarzanki

    V OIG, etap II. Plik rdowy obw.* Dostpna pami: 32MB. 02.04.2011

    Witek wybra si na jarmark. W mgnieniu oka zlokalizowa stoisko z najlepszymi obwarzankami. Nie za-stanawiajc si dugo, kupi jedn porcj obwarzankw. Warto wiedzie, e Bajtockie obwarzanki s zawszenawlekane na patyk, a nie na kko, jak na wikszoci naszych jarmarkw. Obwarzanki mona zdejmowaz lewego bd prawego koca patyka. Kadego obwarzanka charakteryzuj dwie wartoci: rednica zewntrzna(Z) i rednica wewntrzna (W). Jest to przedstawione na rysunku.Gdy chcemy wyj pewien obwarzanek znajdujcy si pomidzy innymi obwarzankami, to moemy spr-

    bowa przeoy jednego obwarzanka przez drugiego. Uda nam si to tylko wtedy, gdy rednica wewntrznaktrego z tych dwch obwarzankw jest nie mniejsza od rednicy zewntrznej drugiego z nich. W przeciwnymwypadku musimy najpierw zdj obwarzanka z lewej bd prawej strony.Witkowi spodoba si pewien obwarzanek i zastanawia si, ile minimalnie innych obwarzankw bdzie

    musia zdj, zanim dostanie si do swojego wybranego.

    Wejcie

    Pierwszy wiersz standardowego wejcia zawiera dwie liczby cakowite n oraz m (1 m n 1 000 000),oddzielone pojedynczym odstpem i oznaczajce odpowiednio liczb obwarzankw znajdujcych si na patykuoraz numer obwarzanka (liczc od lewej strony), ktrego wybra Witek.W n nastpnych wierszach znajduj si opisy kolejnych obwarzankw nawleczonych na patyk, poczwszy

    od lewej strony. Kady z tych wierszy zawiera dwie liczby cakowite wi oraz zi (1 wi < zi 1 000 000 000)oddzielone pojedynczym odstpem, oznaczajce odpowiednio rednic wewntrzn oraz rednic zewntrzni-tego obwarzanka.Moesz zaoy, e w testach wartych co najmniej 35% punktw zachodzi dodatkowy warunek: n 20 000.

    Wyjcie

    Pierwszy i jedyny wiersz standardowego wyjcia powinien zawiera jedn liczb cakowit rwn minimalnejliczbie dodatkowych obwarzankw, jakie powinien zdj Witek, aby dosta si do wybranego. W wyniku nienaley uwzgldnia obwarzanka wybranego przez Witka.

    Przykad

    Dla danych wejciowych:

    5 3

    5 8

    2 4

    4 6

    1 5

    1 2

    poprawnym wynikiem jest:

    1 W

    Z

    v. 1.05 Obwarzanki

  • Opracowanie: OBW

    Obwarzanki

    1 Wstp

    Pierwszym krokiem w rozwizaniu zadania jest prosta obserwacja, e jeli bdziemy prbowali przesun obwarzanekw jedn ze stron, to nie obchodz nas obwarzanki wystpujce po drugiej stronie. W rozwizaniu sprawdzamy, ilewynosi minimalna liczba obwarzankw, ktre musimy zdj, przesuwajc wybrany obwarzanek oddzielnie w prawi w lew stron, a nastpnie wybieramy minimum z tych wartoci. Od tej pory bez straty oglnoci zakadamy, eprzesuwamy obwarzanek tylko w jedn stron.

    2 Rozwizanie powolne

    Jak obliczy liczb obwarzankw, ktre musimy zdj? eby zdj wybrany obwarzanek z patyka musimy go przesundo jednego z kocw. Podczas pojedynczej prby przesunicia mog zdarzy si dwie sytuacje:

    moemy zamieni miejscami dwa obwarzanki,

    wielkoci ich zewntrznych i wewntrznych rednic nie pozwalaj tego zrobiW pierwszym przypadku, dosy jasne jest, e jeli moemy przesun obwarzanek, to robimy to tym samym

    zmniejsza si liczba przeszkd na drodze obwarzanka.Co powinnimy zrobi w drugim przypadku? Poniewa nie moemy zamieni miejscami tych dwch obwarzankw,

    to musimy zdj je oba. W zwizku z tym powiksza nam si liczba obwarzankw do zdjcia. Przyjmijmy wic, ew kadym momencie trzyma bdziemy list obwarzankw do zdjcia.Rozpatrzmy teraz dowolny kolejny obwarzanek, ktry napotykamy. Jeeli ma on takie rozmiary, e kady z ob-

    warzankw ju znajdujcych si na licie mona przez niego przeoy, to nie ma problemu moe on pozostana patyku, a wic nie dodajemy go do listy. Jeeli natomiast na licie obwarzankw do zdjcia jest przynajmniejjeden taki, ktrego nie mona zamieni miejscami z aktualnie rozpatrywanym, to niestety rozpatrywany obwarzanekrwnie musi si znale na licie do usunicia. Zauwamy, e kiedy skoczymy przegldanie patyka w ustalonymkierunku, to rozwizaniem zadania bdzie kocowa dugo listy obwarzankw do usunicia pomniejszona o 1.Przyjrzyjmy si pseudokodowi rozwizania, liczcego liczb obwarzankw do zdjcia przy zaoeniu, e przesu-

    wamy obwarzanki w prawo (przesuwanie w lewo jest analogiczne):

    wczytaj(n, m, obwarzanek[]);

    dlugosc := 1;

    lista[dlugosc] := obwarzanek[m];

    { przegldamy wszystkich potencjalnych kandydatw do zdjcia }

    for i := m + 1 to n do begin

    czy_moge := true;

    { przegldamy wszystkie obwarzanki dodane do listy }

    for k := 1 to dlugosc do begin

    if (not moge_przelozyc(lista[k], obwarzanek[i])) then

    czy_moge := false;

    end

    { aktualizujemy list, jeli potrzeba }

    if (not czy_moge) then begin

    dlugosc := dlugosc + 1;

    lista[dlugosc] := obwarzanek[i];

    end

    end

    wynik := dlugosc - 1;

    Funkcja sprawdzajca czy mona zamieni miejscami dwa obwarzanki:

    bool moge_przelozyc(obwarzanek a, obwarzanek b)

    return (a.wewnetrzna >= b.zewnetrzna or b.wewnetrzna >= a.zewnetrzna)

    Zoono takiego rozwizania wynosi O(n2), poniewa moe si zdarzy, e kady nowo napotkany obwarzanekbdzie dodany do listy, a co wicej zanim si o tym dowiemy bdziemy musieli przejrze wszystkie elementy listy.Przy ograniczeniach z treci zadania takie rozwizanie jest zdecydowanie za wolne.

    v. 1.01 Obwarzanki

  • 3 Rozwizanie wzorcowe

    Okazuje si, e nie trzeba pamita caej listy obwarzankw do zdjcia. Zamiast tego moemy poczy je wszyst-kie w jeden. Polega to na tym, e jako zewntrzn rednic takiego zbiorczego obwarzanka bierzemy najwikszz zewntrznych rednic, a jako wewntrzn najmniejsz z wewntrznych rednic obwarzankw skadowych. a-two zauway, e zbir obwarzankw nie moe by przeoony przez pewnego obwarzanka wtedy i tylko wtedy, gdyobwarzanek powstay przez sklejenie tego zbioru nie moe zosta przez niego przeoony.Przykadowy pseudokod:

    wczytaj(n, m, obwarzanek[]);

    wynik := 0;

    zbiorczy_obwarzanek := obwarzanek[m];

    { przegldamy wszystkich potencjalnych kandydatw do zdjcia }

    for i := m + 1 to n do begin

    { czymy obwarzanki, jeli potrzeba }

    if (not moge_przelozyc(zbiorczy_obwarzanek, obwarzanek[i])) then begin

    wynik := wynik + 1;

    zbiorczy_obwarzanek := polacz_obwarzanki(zbiorczy_obwarzanek, obwarzanek[i]);

    end

    end

    Funkcja, ktra czy dwa obwarzanki w jeden:

    obwarzanek polacz_obwarzanki(obwarzanek a, obwarzanek b) begin

    obwarzanek zbiorczy;

    zbiorczy.zewnetrzna = max(a.zewnetrzna, b.zewnetrzna);

    zbiorczy.wewnetrzna = min(a.wewnetrzna, b.wewnetrzna);

    return zbiorczy;

    end

    Zoono czasowa takiego rozwizania jest liniowa, poniewa kady obwarzanek przejrzymy tylko jeden raz.

    v. 1.01 Obwarzanki

  • Zadanie: PIO

    Pionek

    V OIG, etap II, dzie prbny. Plik rdowy pio.* Dostpna pami: 64MB. 02.04.2011

    Rozwamy nieskoczon (we wszystkich kierunkach) plansz o kwadratowych polach. Na tej planszy, na poluo wsprzdnych (1, 1) stoi pionek. Pionek ten moe wykonywa dwa typy ruchw: polegajce na przesuniciusi o pewn ustalon liczb pl w prawo bd w lewo oraz polegajce na przesuniciu si o pewn ustalonliczb pl w gr bd w d.Przy takich ograniczeniach mona zwykle doj pionkiem tylko do niektrych pl planszy. Twoim zadaniem

    jest okreli, ile spord takich osigalnych pl mieci si w zadanym prostoktnym fragmencie planszy.

    Wejcie

    W pierwszym wierszu standardowego wejcia znajduj si dwie liczby cakowite n orazm (1 n,m 200 000),oddzielone pojedynczym odstpem i oznaczajce liczby ruchw poziomych i pionowych, jakie moe wykonapionek.W drugim wierszu znajduj si cztery liczby cakowite x1, y1, x2, y2 (10

    9 x1, y1, x2, y2 10

    9), pood-dzielane pojedynczymi odstpami i oznaczajce odpowiednio wsprzdne lewego dolnego i prawego grnegowierzchoka prostoktnego fragmentu planszy, w ktrym naley wyznaczy liczb pl osigalnych. Przyjmu-jemy, e pole (x, y) naley do tego prostokta wtedy i tylko wtedy, gdy x1 x x2 oraz y1 y y2.W kadym z nastpnych n wierszy znajduje si jedna liczba cakowita ai (1 ai 10

    18) oznaczajca liczbpl, o jakie pionek moe przesun si w prawo lub w lewo, wykonujc i-ty poziomy ruch.W kadym z nastpnych m wierszy znajduje si jedna liczba cakowita bj (1 bj 10

    18) oznaczajcaliczb pl, o jakie pionek moe przesun si w gr lub w d, wykonujc j-ty pionowy ruch.Moesz zaoy, e w testach wartych co najmniej 40% punktw zachodzi dodatkowy warunek: n,m 1 000

    oraz x2 x1, y2 y1 1 000 000.

    Wyjcie

    Twj program powinien wypisa w pierwszym i jedynym wierszu standardowego wyjcia jedn liczb cakowitoznaczajc liczb pl w obrbie zadanego prostoktnego fragmentu planszy, do ktrych pionek moe si dosta.

    Przykad

    Dla danych wejciowych:

    1 2

    1 1 10 2

    1

    2

    5

    poprawnym wynikiem jest:

    20

    v. 1.11 Pionek

  • Opracowanie: PIO

    Pionek

    1 Przypadek jednowymiarowy

    Zastanwmy si najpierw, jak wygldaoby zadanie w prostszym, jednowymiarowym przypadku. Wtedy pionek po-ruszaby si po jednowymiarowej, nieskoczonej osi, startowa z punktu 1 i w jednym ruchu mg wykonywa skokidugoci a1, a2, . . . , an. Naleaoby wtedy obliczy liczb osigalnych pl w pewnym przedziale [x1, x2].Aby uproci nasze rozwaania zamy, e punktem pocztkowym jest 0, za przedzia, w ktrym szukamy

    osigalnych pl to [x1 1, x2 1]. Chwila zastanowienia pokazuje, e wynik dla takiego sformuowania zadania jestidentyczny, jak dla oryginalnego.Rozwamy zbir wszystkich pl osigalnych przez pionka z pola 0. Kluczem do rozwizania zadania jest zrozu-

    mienie, jak ma on posta. Okazuje si bowiem, e pola osigalne tworz bardzo regularny wzr na osi.Jeeli n = 1, to zbir X jest po prostu zbiorem wszystkich liczb cakowitych (take ujemnych), podzielnych przez

    liczb ai. Aby je zaznaczy na rysunku, naleaoby zamalowa wszystkie pozycje co a1 pl, poczynajc od zera (idczarwno w prawo jak i w lewo).Trudniej jest, kiedy mamy do dyspozycji wicej rnych ruchw. Mona je bowiem wykonywa naprzemiennie

    i kiedy patrzymy na pewne pole, wcale nie wydaje si jasne, czy mona do niego doj, czy nie. eby nieco poskromit trudno upromy zadanie jeszcze bardziej rozwamy przypadek n = 2. Warto najpierw poeksperymentowa wzi pewne dwie liczby a1, a2 i zaznacza na osi pola osigalne. Na przykad dla liczb 4 i 6 okae si, e osigalnes wszystkie liczby parzyste. Natomiast dla liczb 6 i 9 osigalne s wszystkie liczby podzielne przez 3.Sprbujmy uoglni nasze spostrzeenia. Dosy jasne wydaje si, e jeeli pewna liczba d dzieli zarwno a1 jak i a2,

    to bdzie te dzieli numer kadego osigalnego pola, bo skoro kady skok jest na odlego bdc wielokrotnocid, to dowolna sekwencja krokw przesunie pionek na odlego rwnie bdc wielokrotnoci d.Zastanwmy si teraz, kiedy osigalne bd wszystkie pola w odlegoci podzielnej przez d. Okazuje si, e wtedy,

    kiedy d jest najwikszym wsplnym dzielnikiem a1 i a2. eby to uzasadni posuymy si algorytmem Euklidesa,sucym do obliczania NWD dwch liczb.

    1.1 Algorytm Euklidesa

    Algorytm Euklidesa wyglda nastpujco:

    function NWD(integer a, integer b) {

    while (b > 0) {

    a := a mod b;

    zamien(a, b);

    }

    NWD := a;

    }

    Powyszy pseudokod zakada, e argumenty a i b s dodatnie, za funkcja zamien(x, y) zamienia wartoci zmien-nych x oraz y. To jest klasyczna wersja algorytmu Euklidesa, ktra dziaa bardzo szybko (w czasie O(log(max(a, b))))i t wersj naley posugiwa si w implementacji. atwiej jednak bdzie nam spojrze na rwnowan jej, chociaduo wolniejsz wersj z odejmowaniem:

    function NWD(integer a, integer b) {

    while (b > 0) {

    while (a > b)

    a := a - b;

    zamien(a, b);

    }

    NWD := a;

    }

    Obie wersje algorytmu cay czas przechowuj dwie liczby a i b, ktre cigle malej, ale ich NWD pozostaje taki sam,jak NWD oryginalnych argumentw.Przetumaczmy to na jzyk naszego zadania. Liczby a i b bd reprezentowa moliwe do wykonania skoki.

    Chcielibymy pokaza, e podczas dziaania algorytmu Euklidesa na tych dugociach skokw, zbir pl osigalnychza ich pomoc pozostaje niezmienny. Wtedy wynikiem algorytmu bdzie jeden rodzaj skokw, ktry sam wystarczado osignicia dokadnie tego samego zbioru pl, co skoki a i b.

    v. 1.00 Pionek

  • Dlaczego w czasie algorytmu Euklidesa zbir pl osigalnych przez skoki a i b si nie zmienia? Zauwamy, edruga wersja algorytmu wykonuje tylko jeden rodzaj zmiany liczb a i b mianowicie odjcie jednej liczby od drugiej.Wystarczy wic pokaza, e zbir pl osigalnych przez skoki a i b jest taki sam jak zbir punktw osigalnych przezskoki a i a b. W tym celu wystarczy uzasadni, e skoki a i a b s osigalne przez skoki a i b i odwrotnie. Skoka b jest osigalny w oczywisty sposb przez skoki a i b najpierw skaczemy w prawo o a pl a potem w lewo o bpl. Aby za osign skok b przez skoki a i a b, naley wykona skok a b w lewo a potem a w prawo.Udowodnilimy wic, e zbir pl osigalnych przez skoki a1 i a2 jest taki sam, jak zbir pl osigalnych przez

    skok NWD(a1, a2). Niektrzy ju zapewne przeczuwaj, ku czemu zmierza to spostrzeenie . . .

    1.2 Rozwizanie na osi

    Wanie znalelimy sposb na zmniejszenie liczby rodzajw skokw o jeden, zarazem jednak nie zmieniajc rozwi-zania zadania! Powtarzajc t sztuczk, moemy nastpnie kolejne pary skokw zamienia w jeden tak dugo, a zezbioru {a1, a2, . . . , an} pozostanie nam ju tylko jeden skok. Bdzie on najwikszym wsplnym dzielnikiem wszystkichliczb a1, a2, . . . , an.Tak wic problem sprowadzilimy do przypadku n = 1, kiedy jedyn dugoci skoku jest a. Pozostaje kwestia

    obliczenia liczby liczb podzielnych przez a w przedziale [x1 1, x2 1]. Mona to zrobi na rne sposoby:

    Moemy przejrze wszystkie liczby cakowite w tym przedziale i dla kadej sprawdzi, czy jest ona podzielnaprzez a (czas O(x2 x1)).

    Moemy skonstruowa wzr, ktry pozwoli obliczy j w czasie staym. Niech p = x1 1, k = x2 1 bdkocami przedziau. Liczba wszystkich pl wewntrz przedziau to w = kp+1. Potrzebna nam bdzie jeszczeliczba tych pl wewntrz przedziau, ktre s za ostatnim osigalnym polem w jego wntrzu, czyli s = k mod a.Trzeba tutaj pamita, e k moe by liczb ujemn i dlatego reszt z dzielenia jej przez a naley w jzykuprogramowania zapisa w nastpujcy sposb: ((k mod a) + a) mod a, aby otrzyma waciwy wynik.W kocu od w moemy odj s i otrzymany wynik podzieli przez a zaokrglajc w d. Otrzymana liczba jestliczb osigalnych pl wewntrz przedziau.

    1.3 Zoono

    W adnej z powyszych wersji rozwizania przypadku jednowymiarowego nie wykorzystujemy dodatkowej pamici,wic ich zoono pamiciowa jest staa (mwimy, e algorytmy te dziaaj w miejscu). Rna natomiast moe byich zoono czasowa.Zakadamy, e korzystamy z pierwszej wersji algorytmu Euklidesa, wic jej zoono czasowa bdzie wynosia

    O (n log(max(ai))). Osobn rzecz jest sposb znalezienia liczby liczb podzielnych przez a w zadanym przedziale jego zoono czasowa moe by staa bd liniowa ze wzgldu na dugo przedziau. W przypadku limitw danychz zadania obliczanie jej za pomoc wzoru jest bardzo wane.

    2 Rozwizania przypadku dwuwymiarowego

    Poprzedni rozdzia pokaza, jak obliczy wynik w przypadku jednowymiarowym. Okazuje si, e nasze rozwaaniabardzo atwo przenosz si na oryginaln, dwuwymiarow wersj zadania. Moemy bowiem osobno dla osi pionoweji poziomej znale najwiksze wsplne dzielniki dostpnych dugoci skokw:

    a = NWD(a1, . . . , an)b = NWD(b1, . . . , bn)

    Nastpnie moemy obliczy ostateczny wynik na kilka sposobw:

    Przej po wszystkich punktach kratowych (o wsprzdnych cakowitych) wewntrz zadanego prostokta i dlakadego sprawdzi, czy jego wsprzdne s podzielne przez odpowiednio a i b;

    Obliczy dla kadej osi liczb punktw podzielnych odpowiednio przez a i b w odpowiednich przedziaach (czyli[x1 1, x2 1] dla osi poziomej oraz [y1 1, y2 1] dla osi pionowej) a nastpnie pomnoy wyniki.

    W drugim przypadku moemy otrzyma zoono O(x2 x1 + y2 y1) lub O(1). Oczywicie rozwizanie wzor-cowe korzysta ze wzoru dajcego czas stay. Dziki temu zoono rozwizania wzorcowego jest zdominowana przezalgorytm Euklidesa, a wic wynosi O (n log(maxi(ai, bi))).Uwaga! Poniewa dugoci przedziau s rzdu 109, to ostateczny wynik moe by rzdu 1018. Ponadto liczby ai

    oraz bi rwnie mog by rzdu 1018. Konieczne jest wic zastosowanie liczb 64-bitowych i rozwizania nie korzystajcez nich nie otrzymyway maksymalnej liczby punktw.

    v. 1.00 Pionek

  • Zadanie: TOR

    Tort

    V OIG, etap II. Plik rdowy tor.* Dostpna pami: 64MB. 02.04.2011

    Bajtek obchodzi dzisiaj swoje urodziny. Zdmuchn ju wszystkie wieczki z tortu urodzinowego oraz podzieligo na (n+ 1)2 kawakw. Niestety zrobi to w taki sposb, e niektre kawaki s wiksze, a inne mniejsze odpozostaych. Bajtek wybiera swj kawaek jako pierwszy i chciaby wybra k-ty pod wzgldem wielkoci, czylitaki, e k 1 kawakw jest nie mniejszych od niego, a (n+ 1)2 k kawakw jest nie wikszych.Wiemy, e tort urodzinowy Bajtka ma ksztat prostokta oraz e Bajtek podzieli go n prostymi ciciami

    wzdu jednego z bokw prostokta i n prostymi ciciami wzdu drugiego z bokw. Chcielibymy zna po-wierzchni wybranego przez Bajtka kawaka tortu.

    Wejcie

    W pierwszym wierszu standardowego wejcia znajduj si cztery liczby cakowite a, b, n oraz k pooddzielanepojedynczymi odstpami (1 a, b 109, 0 n 200 000, 1 k (n + 1)2), oznaczajce odpowiedniodugoci bokw tortu, liczb ci wykonanych przez Bajtka w kadym z kierunkw oraz numer szukanegokawaka.Drugi wiersz zawiera cig n liczb cakowitych x1, x2, . . . , xn (0 < x1 < x2 < . . . < xn < a), przy czym xi

    oznacza miejsce i-tego cicia wzdu poziomego boku prostokta (jest to odlego od lewego boku prostokta).Trzeci wiersz zawiera cig n liczb cakowitych y1, y2, . . . , yn (0 < y1 < y2 < . . . < yn < b), przy czym yi

    oznacza miejsce i-tego cicia wzdu pionowego boku prostokta (jest to odlego od dolnego boku prostokta).Moesz zaoy, e w testach o wartoci co najmniej 40% punktw zachodzi dodatkowy warunek: n 1 000.

    Wyjcie

    Pierwszy i jedyny wiersz standardowego wyjcia powinien zawiera jedn liczb cakowit, rwn powierzchnik-tego pod wzgldem wielkoci kawaka tortu.

    Przykad

    Dla danych wejciowych:

    6 7 2 3

    1 3

    1 5

    poprawnym wynikiem jest:

    6

    0

    1

    1 3

    5

    7

    6

    v. 1.3 Tort

  • Opracowanie: TOR

    Tort

    1 Rozwizanie brutalne

    Pierwszym, narzucajcym si rozwizaniem zadania, jest obliczenie powierzchni kadego kawaka tortu, a nastpniewybranie k-tego w kolejnoci. Znalezienie k-tego w kolejnoci elementu moemy zrealizowa poprzez posortowaniewszystkich elementw. Pseudokod takiego rozwizania:

    wczytaj(a, b, n, k, x[], y[]);

    x[0] := y[0] := 0;

    x[n + 1] := a;

    y[n + 1] := b;

    liczba := 0;

    for k := 1 to n + 1 do

    for i := 1 to n + 1 do begin

    liczba := liczba + 1;

    kawalki[liczba] := (x[k] - x[k-1]) * (y[i] - y[i-1]);

    end

    posortuj(kawalki[]);

    wypisz(kawalki[k]);

    Gwnym problemem jaki powstaje przy takim podejciu jest zoono czasowa. Wszystkich kawakw tortubdzie O(n2), wic czas potrzebny na ich posortowanie to O(n2 log(n2)).

    2 Rozwizanie wolne

    Szukanie k-tego w kolejnoci elementu moemy zrealizowa troch szybciej. Istnieje algorytm Hoarea, ktry znajdujego w czasie liniowym wzgldem liczby wszystkich elementw. Zoono spada wtedy do O(n2).W algorytmie Hoarea stosujemy podobn metod jak w sortowaniu Quicksort. Cig wejciowy dzielimy na 2 pod-

    cigi: elementw mniejszych oraz elementw wikszych bd rwnych pewnemu elementowi. Nastpnie w zalenociod liczebnoci wynikowych podcigw wywoujemy rekurencyjnie funkcj dla odpowiedniego podcigu. Rekursjpowtarzamy tak dugo, a w wyniku otrzymamy cig o 1 elemencie.O algorytmie Hoarea mona przeczyta w ksice Algorytmy i struktury danych L. Banachowskiego, K. Diksa

    oraz W. Ryttera w rozdziale 2.8 (Szybkie algorytmy wyznaczania k-tego najwikszego elementu w cigu).

    3 Rozwizanie wzorcowe

    W rozwizaniu wzorcowym zastosujemy troch inne podejcie, ni w poprzednich rozwizaniach. Interesujcy nasrozmiar kawaka tortu bdziemy wyszukiwa binarnie po powierzchni. Wiadomo, e szukana powierzchnia kawakabdzie z przedziau od 1 do a b, gdzie a b to wielko caego tortu.W kadym kroku wyszukiwania dzielimy przedzia (po ktrym szukamy) na dwa. Wybieramy element rodkowy

    s naszego przedziau i w zalenoci od tego, ile kawakw tortu jest nie mniejszych od s, wybieramy przedzia lewy,bd prawy do kolejnych iteracji. Poniewa wielko przedziau zmniejsza si za kadym razem dwukrotnie, to liczbawszystkich podziaw bdzie rzdu O(log(ab)). Jedyne, co nam pozostaje, to znalezienie szybkiego sposobu obliczenia,ile kawakw tortu jest nie mniejszych od s. Przykadowy pseudokod:

    poczatek := 1;

    koniec := a * b;

    { wyszukujemy binarnie powierzchni kawaka }

    while (poczatek < koniec) begin

    s := (poczatek + koniec + 1) / 2;

    if (liczba_nie_mniejszych(s) >= k) then

    poczatek := s;

    else

    koniec := s - 1;

    end

    wypisz(poczatek);

    v. 1.01 Tort

  • 3.1 Zliczanie kawakw

    Zauwamy, e jeli posortujemy dugoci kawakw niemalejco, to dla kadej szerokoci moemy za pomoc wy-szukiwania binarnego znale liczb kawakw nie mniejszych od s. Tym sposobem obliczenie liczby kawakw niemniejszych od s kosztuje nas czas rzdu O(n log(n)), a cae rozwizanie ma zoono O(n log(n) log(ab)).Mona to jednak zrobi jeszcze szybciej. Posortujmy zarwno dugoci, jak i szerokoci niemalejco. Teraz za-

    czniemy szuka liczby kawakw nie mniejszych od s, poczynajc od najmniejszych szerokoci.Zamy, e znamy liczb kawakw nie mniejszych od s dla pewnej szerokoci. Jak moe si ona zmieni dla

    kawakw o wikszej szerokoci? Moe si tylko zwikszy, poniewa wszystkie dugoci kawakw s takie same,a zwikszylimy szeroko. W ten sposb kad dugo i szeroko sprawdzimy dokadnie jeden raz, wic czaswyszukiwania jest rzdu O(n log(n)), ze wzgldu na sortowanie. Zoono caego rozwizania to O(n log(ab)),poniewa a b > n. Pseudokod:

    liczba_nie_mniejszych(s) begin

    wynik := 0;

    k := n;

    { przegldamy szerokoci od najmniejszych do najwikszych }

    for i := 0 to n do begin

    { znajdujemy liczb kawakw, ktrych powierzchnia jest nie mniejsza od s }

    while (k > 0 and szerokosc[i] * dlugosc[k-1] >= s)

    k := k - 1;

    wynik := wynik + n - k;

    end

    liczba_nie_mniejszych := wynik;

    end

    Naley pamita, aby obliczy wczeniej wszystkie szerokoci i dugoci kawakw, zapisa w tablicach szerokosc[],dlugosc[] oraz posortowa je niemalejco. Pozostawiamy to jako proste wiczenie dla czytelnika.

    v. 1.01 Tort

  • Etap III

    Projekt wspfinansowany ze rodkw Unii Europejskiej w ramach Europejskiego Funduszu Spoecznego.

  • Zadanie: BRA

    Bracia

    OIG, etap III. Plik rdowy bra.* Dostpna pami: 32MB. 20.05.2011

    W szeregu ustawio si n chopcw. Wielu z nich jest brami z tych samych rodzin. Z szeregu moemy wyprosipewne osoby, dc do tego, aby bracia z kadego rodzestwa stali obok siebie. Jednak osoby stojce w szeregus bardzo solidarne ze swoimi brami jeeli usunita zostanie dowolna osoba, to wszyscy jej bracia obraajsi i rwnie odchodz z szeregu.Oblicz, jaka jest najwiksza liczba rodzestw, ktre mog pozosta w szeregu w wyniku takich zmian, tak

    aby bracia z kadego pozostaego w szeregu rodzestwa stali obok siebie. Uwaga: jedynak liczy si jak caerodzestwo!

    Wejcie

    Pierwszy wiersz standardowego wejcia zawiera jedn liczb cakowit n (1 n 1 000 000) oznaczajc liczbosb ustawionych w szeregu. Drugi wiersz wejcia zawiera n liczb cakowitych l1, l2, . . . , ln (1 ln 1 000 000)pooddzielanych pojedynczymi odstpami, przy czym li oznacza numer rodzestwa, do ktrego naley i-tychopiec.Moesz zaoy, e w testach wartych przynajmniej 50% punktw zachodzi dodatkowy warunek n 10 000.

    Wyjcie

    Pierwszy i jedyny wiersz standardowego wyjcia powinien zawiera jedn liczb cakowit rwn maksymalnejliczbie rodzestw, jakie mog pozosta w szeregu.

    Przykad

    Dla danych wejciowych:

    6

    1 2 1 2 3 2

    poprawnym wynikiem jest:

    2

    v. 1.01 Bracia

  • Opracowanie: BRA

    Bracia

    1 Wstp

    Kluczowe w rozwizaniu zadania jest spostrzeenie, e zamiast oryginalnego szeregu moemy, nie zmieniajc wyniku,rozwaa szereg, w ktrym znajduje si jedynie pierwszy i ostatni z braci z kadego rodzestwa. Pozycje skrajnychbraci moemy wyznaczy liniowo podczas wczytywania danych w nastpujcy sposb:procedure wczytaj_szereg;

    begin

    wczytaj(n);

    for k := 1 to max_numer_rodzenstwa do poczatek[k] := 0;

    for i := 1 to n do

    begin

    wczytaj(szereg[i]);

    if poczatek[szereg[i]] = 0 then poczatek[szereg[i]] := i;

    koniec[szereg[i]] := i;

    end;

    end;

    2 Rozwizanie dynamiczne

    W jaki sposb wyznaczy maksymaln liczb rodzestw, ktre mog pozosta w szeregu? Sprbujemy posuy siprogramowaniem dynamicznym.Aby zredukowa rozmiar problemu do mniejszego cigu, dla ktrego odpowied moglibymy mie obliczon wcze-

    niej, przypatrzmy si ostatniemu rodzestwu w szeregu. Jeeli zaczyna si ono na pozycji i (a koczy si na pozycjin), to moemy podj jedn z dwch decyzji:

    pozostawimy to rodzestwo w szeregu wtedy pozbawiamy si moliwoci wybrania rodzestw, ktrych repre-zentanci stoj na pozycjach [i+1, n1], a wic pozostaych braci bdziemy mogli wybra jedynie z rodzestw,ktrych ostatni reprezentanci znajduj si na pozycjach [1, i 1];

    wyprosimy ostatnie rodzestwo w tej sytuacji w szeregu bd mogy pozosta rodzestwa na pozycjach[1, n 1].

    Powyszy schemat mona wprost zapisa w postaci nastpujcego programu dynamicznego:

    wczytaj_szereg;

    wynik[0] := 0; { dla pustego szeregu nie moemy wybra nikogo }

    for i := 1 to n do

    begin

    wynik[i] := wynik[i-1];

    if koniec[szereg[i]] = i then

    wynik[i] := max(wynik[i], wynik[poczatek[szereg[i]]-1]+1);

    end;

    wypisz(wynik[n]);

    Zoono takiego rozwizania wynosi (n).

    3 Rozwizanie zachanne

    Okazuje si, e problem ten moemy rozwiza w bardziej bezporedni, mianowicie zachanny, sposb. Ot rozwa-ajmy rodzestwa w kolejnoci rosncych pozycji ostatnich reprezentantw. Jeeli ostatni z braci poprzednio wybra-nego rodzestwa nie znajduje si pomidzy brami z rozwaanego rodzestwa, to rodzestwo to pozostaje w szeregu,w przeciwnym przypadku zostaje z niego usunite.Dlaczego takie podejcie jest poprawne? Niech pr, kr bd odpowiednio pozycj pierwszego i ostatniego brata

    z r-tego rodzestwa. Niech i1, i2, . . . , iw bdzie maksymalnym uporzdkowanym wg rosncych pozycji cigiem ro-dzestw, ktre mog pozosta w szeregu. Jeeli l1 bdzie rodzestwem, ktrego ostatnia pozycja jest najmniejsza, tol1, i2, i3, . . . , iw te jest dopuszczalnym zbiorem rodzestw pozostawionych w szeregu, gdy kl1 ki1 . Analogiczniepostpujemy dla kolejnych rodzestw otrzymujc cig l1, l2, . . . , lw. Zauwamy, e lj dla j = 2, . . . , w istnieje, gdydobrym kandydatem jest ij.Rozwizanie wymaga rozwaania rodzestw w kolejnoci rosncych pozycji ostatnich reprezentantw. Nie musimy

    jednak sortowa rodzestw ich kolejno moemy odczyta z tablicy koniec otrzymujc liniowy algorytm.

    v. 1.10 Bracia

  • wczytaj_szereg;

    wynik := 0;

    granica := 0;

    for i := 1 to n do

    begin

    if (koniec[szereg[i]] = i) and (granica < poczatek[szereg[i]]) then

    begin

    wynik := wynik+1;

    granica := i;

    end;

    end;

    wypisz(wynik);

    Zoono rozwizania to (n).

    v. 1.10 Bracia

  • Zadanie: NAW

    Nawiasy

    V OIG, etap III, dzie prbny. Plik rdowy naw.* Dostpna pami: 32MB. 19.05.2011

    Wyraeniem nawiasowym nazwiemy niepusty cig skadajcy si z nawiasw otwierajcych i zamykajcych.Powiemy, e wyraenie nawiasowe jest poprawne, jeeli kady nawias otwierajcy mona sparowa z nawiasemzamykajcym, wystpujcym po nim, tak aby cig nawiasw znajdujcych si pomidzy nimi rwnie bypoprawnym cigiem nawiasowym.Na przykad (()())() jest poprawnym wyraeniem nawiasowym, ale )( i ()( ju poprawne nie s.Bajtazar w swojej pracy naukowej skorzysta z programu wypisujcego pewne poprawne wyraenie nawia-

    sowe S, majce kluczowe znaczenie dla jego bada. Niestety, sowo to zagino w gszczu innych nawiasw,ktre przez przypadek mogy by wypisane zarwno przed nim, jak i po nim. Bajtazar otrzyma wic sowonawiasowe, ktre zawiera w sobie jako spjny fragment szukane sowo S, jednak nie wie, gdzie si ono zaczynai gdzie koczy.Zrozpaczony, poprosi Ciebie o pomoc w wyznaczeniu wszystkich moliwych pooe poprawnych sw

    nawiasowych w otrzymanym sowie. Ma bowiem nadziej, e jest ich niewiele . . .

    Wejcie

    Pierwszy wiersz standardowego wejcia zawiera jedn liczb cakowit n (1 n 2 000 000), oznaczajcdugo sowa, ktre odczyta Bajtazar. W drugim wierszu znajduje si n nawiasw (bez odstpw) jest toodczytane sowo nawiasowe.Moesz zaoy, e w testach wartych przynajmniej 50% punktw zachodzi dodatkowy warunek n 5 000.

    Wyjcie

    Twj program powinien wypisa na standardowe wyjcie jedn liczb cakowit oznaczajc liczb fragmentwodczytanego sowa, ktre s poprawnymi sowami nawiasowymi.

    Przykad

    Dla danych wejciowych:

    10

    )(())()(()

    poprawnym wynikiem jest:

    5

    v. 1.21 Nawiasy

  • Opracowanie: NAW

    Nawiasy

    1 Wstp

    Wyraenia nawiasowe pojawiaj si bardzo czsto w rnych kombinatorycznych zadaniach, tote warto wiedzie,jak si zabiera do rozwizywania problemw z nimi zwizanych.Ot wygodniej jest myle o cigach zoonych z 1 i -1, zamiast z nawiasw. Niech 1 oznacza nawias otwierajcy,

    za -1 zamykajcy. Wtedy c1 + c2 + . . .+ ck oznacza gboko zagniedenia za k-tym nawiasem.atwo zauway, wyraenie c1c2 . . . cn jest poprawne wtedy i tylko wtedy, gdy gboko w adnym miejscu nie

    spada poniej 0, za po n-tym nawiasie rwna si 0.Mona to zapisa wzorami:

    1k n c1 + c2 + . . .+ ck 0 (1)

    c1 + c2 + . . .+ cn = 0 (2)

    gdzie 1kn oznacza dla wszystkich k takich, e 1 k n.

    2 Rozwizanie szecienne

    Rozwizanie brutalne polega na sprawdzeniu powyszych nierwnoci dla kadego z O(n2) podsw. Zoono cza-sowa rozwizania to O(n3) dla kadego podsowa musimy wykona bowiem O(n) sprawdze.

    3 Rozwizanie kwadratowe

    Zauwamy, e jeli ca + ca+1 + . . .+ cb < 0, to wszystkie poprawne wyraenia zaczynajce si w a musz koczy siprzed b. Prowadzi to do nastpujcego rozwizania dziaajcego w czasie O(n2).Dla kadego a rozpoczynamy sumowanie cigu (ci) od ca. Jeli w ktrym miejscu osigniemy 0, to znaczy,

    e wanie znalelimy kolejne poprawne wyraenie i zwikszamy wynik o 1. Jeli suma rwna si 1, to przery-wamy zliczanie, gdy wiemy, e wszystkie dalsze wyraenia na prawo bd niepoprawne. Oto pseudokod powyszegorozwizania, obliczajcy wynik dla tablicy nawiasw t[1 . . . n] :

    wynik := 0;

    for a := 1 to n do

    begin

    suma := 0;

    i := a;

    while i = 0 do

    begin

    if t[i] = ( then

    suma += 1;

    else // t[i] = )

    suma -= 1;

    if suma = 0 then

    wynik += 1;

    i += 1;

    end;

    end;

    wypisz(wynik);

    3.1 Rozwizanie wzorcowe

    Powysze rozwizanie dziaa nadal zbyt wolno dla podanych limitw na rozmiar danych, wic postarajmy si wykonazliczanie jeszcze sprytniej.

    v. 1.10 Nawiasy

  • Poprawne wyraenie nazwiemy minimalnym, jeli 1k 0. Innymi sowy, gboko w rodkuwyraenia minimalnego musi by cay czas dodatnia.Zauwamy teraz, e kade poprawne wyraenie jest konkatenacj (sklejeniem) kilku wyrae minimalnych.

    Podsuwa to pomys, aby dla kadego wyraenia minimalnego caca+1 . . . cb sprawdzi, ile poprawnych wyrae koczysi w a 1. Oznaczmy t liczb przez s. Wtedy bdziemy mogli doklei kade z nich z lewej do caca+1 . . . cb, dodas + 1 do wyniku i zapamita, e w b koczy si s + 1 poprawnych wyrae (+1 odpowiada samemu wyraeniucaca+1 . . . cb bez doklejania czegokolwiek z lewej strony).Przykad: przeanalizujmy wyraenie (()(()))( znak po znaku. Niech gi oznacza gboko po i-tym nawiasie,

    a wi liczba poprawnych wyrae koczcych si w i. Zaznaczone s koce wyrae minimalnych.

    1 : g1 = 1, w1 = 0

    2 : g2 = 2, w2 = 0

    3 : g3 = 1, w3 = 1 koczy si ()

    4 : g4 = 2, w4 = 0

    5 : g5 = 3, w5 = 0

    6 : g6 = 2, w6 = 1 koczy si ()

    7 : g7 = 1, w7 = 2 koczy si (())

    8 : g8 = 0, w8 = 1 koczy si (()(()))

    9 : g9 = 1, w9 = 0

    Wynikiem dla tego przykadu jest 1 + 1 + 2 + 1 = 5. Zachcamy czytelnika do samodzielnego uoglnieniapowyszej metody.Niecierpliwym od razu przedstawiamy pseudokod korzystajcy ze stosu (czyli struktury danych pozwalajcej na

    dodawanie elementw na szczyt i zdejmowanie ze szczytu). Na zmiennej p bdziemy pamita kolejne wartoci wi. Na-tomiast stos bdziemy wypenia w taki sposb, aby w kadym momencie, w ktrym przeczytalimy pewne wyraenieminimalne ci+1ci+2 . . . cj na szczycie stosu znajdowaa si liczba wi. Oto pseudokod rozwizania wzorcowego:

    p := 0, wynik := 0;

    stos := pusty stos;

    for i = 1 to n do

    begin

    if t[i] = ( then begin

    stos.dodaj(p + 1);

    p := 0;

    end else begin

    // t[i] = )

    if not stos.pusty() then begin

    p := stos.szczyt();

    stos.zdejmij();

    wynik += p;

    end else begin

    p := 0;

    end

    end

    end.

    wypisz(wynik);

    Operacje na stosie mona wykona w czasie staym (np. przez uycie tablicy jako stosu), zatem cay algorytmwykonuje O(n) operacji, co jest wynikiem optymalnym, ze wzgldu na konieczno wczytania caego sowa nawiaso-wego.Na koniec warto jeszcze zauway, e wynik dla n = 2 000 000 moe wykracza poza typ liczb 32-bitowych. Na

    przykad dla sowa ()()()()... wynikiem jest n2

    8 n4. Na szczcie zadeklarowanie zmiennej wynik jako 64-bitowej

    rozwizuje ten problem.

    v. 1.10 Nawiasy

  • Zadanie: TAM

    Tamy

    OIG, etap III. Plik rdowy tam.* Dostpna pami: 64MB. 20.05.2011

    W Bajtocji zbudowano wielki zbiornik wodny. Podzielono go na pewn liczb jednakowej dugoci sektorw.Pomidzy kadymi dwoma ssiednimi sektorami znalaza si tama o pewnej wysokoci. Tamy zbudowano takeprzed pierwszym oraz za ostatnim sektorem.Obecnie poziom wody w caym zbiorniku jest taki sam. Poniewa jednak zacz pada ulewny deszcz,

    poziom wody zacz szybko wzrasta. Krl Bajtocji chce wiedzie, ile czasu upynie, zanim woda przeleje siprzez pierwsz lub przez ostatni tam, wskutek czego pewnikiem dojdzie do zalania Bajtocji. Obliczenie tegoutrudnia fakt, e nad kadym z sektorw deszcz moe pada z rn intensywnoci.Pom krlowi obliczy czas, jaki pozosta do wylania si wody poza zbiornik. Jeeli poziom wody jest rwny

    dokadnie wysokoci tamy, woda jeszcze si nie wylewa. Gdy cz zbiornika ju zalana wod jest ograniczonaz obu stron tamami tej samej wysokoci, woda przelewa si z niej w obie strony rwnie szybko.

    Wejcie

    Pierwszy wiersz standardowego wejcia zawiera jedn liczb cakowit n (1 n 500 000), oznaczajc liczbsektorw, na jakie podzielony jest zbiornik.Drugi wiersz zawiera cig n + 1 liczb cakowitych wi (1 wi 1 000 000) pooddzielanych pojedynczymi

    odstpami, oznaczajcych wysokoci (ponad pocztkowy poziom wody) kolejnych tam.Trzeci wiersz zawiera cig n liczb cakowitych ki (1 ki 1 000 000) pooddzielanych pojedynczymi

    odstpami, oznaczajcych, o ile poziomw woda podnosi si w i-tym sektorze w cigu jednej sekundy.Moesz zaoy, e w testach wartych przynajmniej 75% punktw wysokoci tam s parami rne. Ponadto,

    w czci tych testw, wartych co najmniej 50% punktw, zachodzi warunek n 1 000.

    Wyjcie

    Pierwszy wiersz standardowego wyjcia powinien zawiera jedn liczb cakowit, bdc najmniejsz liczbcakowit nie mniejsz ni liczba sekund, po ktrych woda wyleje si ze zbiornika.

    Przykad

    Dla danych wejciowych:

    4

    3 5 2 6 4

    1 3 3 1

    poprawnym wynikiem jest:

    2

    3

    6

    5

    4

    2

    1 3 3 1

    v. 2.02 Tamy

  • Opracowanie: TAM

    Tamy

    1 Wprowadzenie

    Moemy o naszym zadaniu myle nastpujco: mamy dane podune naczynie z poprzecznymi przegrdkami (ta-mami), dzielcymi je na rzd sektorw. Wysokoci tam mog (w prostszej wersji - musz) by rne. Do kadegosektora wpywa jednostajny strumie, ktry podnosi poziom wody w tym sektorze o ki jednostek na sekund. Naszymzadaniem jest obliczenie czasu, po jakim woda wyleje si z naczynia.Zauwamy, e jeeli pomidzy dwoma tamami (nazwijmy je zewntrznymi) znajduj si jedynie tamy od nich

    nisze, to moemy je poczy w jedno naczynie. Aby woda wylaa si przez jedn z zewntrznych tam, musi najpierwosign poziom rwny wysokoci jednej z nich. Wobec tego nie ma znaczenia, jakie wysokoci maj tamy wewntrzne.

    2 Rozwizanie dla rnych wysokoci tam

    Uzyskujemy w ten sposb cig tam postaci a0, . . . , ak, . . . , an, gdzie a0, . . . , ak jest rosncy, a ak, . . . , an jest malejcy.Zauwamy, e moemy rozwaa te cigi osobno, gdy woda wczeniej wyleje si z caego naczynia ni by przelaasi przez najwyszy punkt, ktrym jest wanie ak. Jeeli drugi z cigw (czyli ak, . . . , an) odwrcimy, otrzymamydwa naczynia o rosncych wysokociach tam, zatem mogce wyla tylko z lewej strony. Ostatecznym rozwizaniembdzie mniejszy spord wynikw dwch podproblemw. Dalej bdziemy rozwaa wycznie jedno z tych naczy.Zauwamy, e jeeli woda z sektora i miaaby wyla si z naczynia, to sektory 1 . . . i musiayby by pene. Musi

    przy tym zachodzi nierwno czas ij=1 kj >

    ij=1 pj, gdzie pj to pojemno j-tego sektora. Zatem wystarczy

    dla kolejnych wartoci i obliczy sum opadw oraz pojemno w sektorach 1 . . . i, aby z powyszego wzoru obliczydokadny czas, po jakim woda si wyleje. Najmniejsza z tych wartoci bdzie wynikiem.Rozwizanie ma zoono czasow (n).

    3 Rozwizanie wzorcowe

    Rozwizanie to jest symulacj przelewania wody, ktra ogranicza si do zdarze znaczcych, czyli przepenie sekto-rw. Kiedy aden z sektorw si nie przepenia, to jedyn rzecz, jaka si dzieje, jest zwikszenie poziomu wody wewszystkich sektorach. Jednak skoro opady s jednostajne, atwo przewidzie moment przepenienia kadego sektora.Zmiana tego momentu moe nastpi jedynie na skutek przepenienia ktrego z ssiednich sektorw. Jednak prze-penienie ssiedniego sektora musiaoby nastpi wczeniej, a w momencie jego przepenienia obliczymy aktualnypoziom wody w rozwaanym sektorze, za tempo jego wzrostu powikszymy o wod spywajc z przepenionegosektora.Rozwizanie wzorcowe buduje kolejk priorytetow zdarze (przepenie sektorw), w ktrej trzymamy numery

    sektorw, ktre kolejno ulegn przepenieniu, zakadajc, e ssiadujce z nim sektory si nie przepeni. Oczywicieczas przepenienia pierwszego sektora w kolejce nie moe ulec zmianie, gdy aden sektor nie moe wczeniej ulecprzepenieniu.Po zdjciu pierwszego elementu z kolejki rozwaamy nastpujce moliwoci: jeeli woda przelewa si z niego poza naczynie, to koczymy;

    w przeciwnym przypadku sprawdzamy, jak wylewajca si z niego woda wpynie na czasy przepenie ssiednichsektorw:

    jeeli sektor ssiadujcy jest przepeniony, to aktualizujemy poziom wody w sektorach, do ktrych spywaz niego woda (jego ssiadach) i czymy go z rozwaanym sektorem,

    nastpnie zwikszamy przyrost wody w sektorach ssiednich i aktualizujemy czasy przepenienia ssiadwrozwaanego sektora oraz odpowiadajce im wartoci w kolejce,

    jeeli sektor przepeni si w jednym kierunku, to moemy go usun, gdy woda, ktra do niego wpyniez ssiada, popynie dalej.

    Algorytm dla kadego przepenienia wykonuje logarytmiczn ilo operacji (obsuga kolejki priorytetowej), a kadysektor moe ulec przepenieniu tylko raz, wic cao dziaa w czasie (n logn).

    v. 1.00 Tamy

  • Zadanie: TYG

    Tygrysy

    V OIG, etap III. Plik rdowy tyg.* Dostpna pami: 32MB. 20.05.2011

    Bajtockie tygrysy to niezwyke zwierzta, a ich nietypowe zwyczaje od zawsze fascynoway zoologw i mate-matykw. Ustalono niedawno, e dziel si one na specyficzne gatunki. Tygrysa nazwiemy k-tygrysem, jelispotkawszy tygrysa mniejszego co najmniej k razy od siebie, zaatakuje go i zje, jednak nie odway si tknadnego wikszego tygrysa.W bajtockim ZOO yje n tygrysw. Niestety miejsce w ZOO jest ograniczone, dlatego te dyrektor stwier-

    dzi, e trzeba tak przydzieli zwierzta do wybiegw, aby zaj ich jak najmniej. Oczywicie nie monaprzy tym dopuci, by jakikolwiek tygrys zosta poarty. Dyrektor ma wyrane problemy z zakwaterowaniemtygrysw, zwrci si wic do Ciebie po pomoc.

    Wejcie

    Pierwszy wiersz standardowego wejcia zawiera jedn liczb cakowit n (1 n 500 000) liczb tygrysww ZOO. Kady z kolejnych n wierszy zawiera opis jednego tygrysa. Opis taki skada si z dwch liczb cakowi-tych ri oraz ki (1 ri 1 000 000 000, 2 ki 1 000 000), oddzielonych pojedynczym odstpem. Oznaczajone, e i-ty tygrys jest ki-tygrysem i ma rozmiar ri.Moesz zaoy, e w przynajmniej 50% przypadkw testowych wystpuj jedynie 2-tygrysy.

    Wyjcie

    Twj program powinien wypisa na standardowe wyjcie dokadnie jedn liczb cakowit najmniejszliczb wybiegw, do ktrych mona bezpiecznie przydzieli tygrysy.

    Przykad

    Dla danych wejciowych:

    5

    8 3

    10 2

    15 2

    18 2

    28 3

    poprawnym wynikiem jest:

    2

    Wyjanienie do przykadu: W powyszym przykadzie tygrysy o rozmiarach 28, 18, 15 mog wystpowana wybiegu number 1, za tygrysy o rozmiarach 10, 8 mog zosta pokazane na wybiegu numer 2.

    v. 1.10 Tygrysy

  • Opracowanie: TYG

    Tygrysy

    1 Analiza problemu

    Sprawdzenie wszystkich moliwych przyporzdkowa tygrysw do wybiegw mona odrzuci na samym pocztku ich liczba dla n = 500 000 byaby ogromna. Lepiej poszuka strategii, ktra pozwoliaby nam przydzieli zwierzta dowybiegw w optymalny sposb. Na pocztku dobrze jest rozway najprostszy przypadek, w kocu oglna strategiamusi dawa dobry wynik rwnie dla niego. Przyjmijmy zatem zaoenie, e wszystkie tygrysy s jednego gatunku,tzn. s 2-tygrysami.

    1.1 Rozwizanie prostego przypadku

    Intuicyjnie wydaje si, e tygrysy o zblionych rozmiarach powinny by trzymane razem. Nasuwa si zatem myl, byposortowa je po rozmiarze. Sortowanie moe by wykonane w czasie O(n log n), wic moemy sobie na to pozwoli.Zacznijmy od najmniejszego tygrysa (o rozmiarze r1) i przydzielmy mu pierwszy wybieg. Nic nie stoi na przeszkodzie,eby zamieszkay z nim wszystkie tygrysy o rozmiarze ri < 2r1, lecz kady nastpny stanowiby ju zagroenie dlanajmniejszego.Moemy powtarza to rozumowanie, za kadym razem wybierajc najmniejszego nieprzydzielonego tygrysa i do-

    bierajc mu bezpieczne towarzystwo. Zastanwmy si teraz, czy obrana strategia daje na pewno minimaln liczbwybiegw.Zamy, e tak nie jest i istnieje inne, lepsze rozwizanie. Niech m oznacza liczb wybiegw otrzyman w po-

    wyszym algorytmie i niech r1, r2 . . . rm oznaczaj rozmiary najmniejszych tygrysw w poszczeglnych wybiegach.Zauwamy, e ri+1 2ri, bo w przeciwnym razie oba tygrysy trafiyby do tego samego wybiegu. W lepszym rozwi-zaniu wybiegw jest mniej ni m, zatem pewne dwa spord wyrnionychm tygrysw musiayby zamieszka razem.Jest to oczywicie niemoliwe, wic lepsze rozwizanie nie moe istnie.

    2 Rozwizanie wzorcowe

    Postarajmy si teraz zmodyfikowa powysz ide, aby dziaaa dla dowolnych gatunkw. Chcielibymy umieszybko znajdowa maksymalne bezpieczne towarzystwo dla najmniejszego bezdomnego tygrysa. Dla i-tego ty-grysa oznaczmy gi =

    ri

    ki (a to najwiksza liczba cakowita nie wiksza ni a). Jest to maksymalny rozmiar

    tygrysa, ktry nie moe czu si bezpieczny przy i-tym. Wybierajc towarzyszy dla r1 musimy teraz upewni si, edla kadego z nich gi < r1. Jak szybko znale takie zwierzta?Nic nie stoi na przeszkodzie, by pamita drug tablic tygrysw, posortowan wzgldem g. Oznaczamy j tg[]

    w odrnieniu od pierwszej tr[]. Schemat jest nastpujcy: znajdujemy najmniejszego nieprzydzielonego tygrysaw tr[], przegldamy wolne tygrysy w tg[] dopki speniona jest nierwno gi < r1 i oznaczamy je jako zameldo-wane, cao powtarzamy dopki s wolne tygrysy. Oto pseudokod rozwizania:

    for i := 1 to n do

    begin

    g[i] := r[i] / k[i];

    tr[i] := i;

    tg[i] := i;

    bezdomny[i] := true;

    end;

    sortuj tr[] wzgldem r[i];

    sortuj tg[] wzgldem g[i];

    j := 1;

    wybiegi := 0;

    for i := 1 to n do

    if (bezdomny[tr[i]]) then

    begin

    inc(wybiegi);

    while (j

  • end;

    wypisz(wybiegi);

    Dowd poprawnoci algorytmu jest bardzo podobny do tego dla prostego przypadku. Rozwizanie to mona znalew pliku tyg.cpp

    3 Inne rozwizania

    3.1 Rozwizanie alternatywne 1

    Zastanwmy si, co by si stao, gdybymy nie sortowali po g i po prostu przegldali tr[], przypisujc najmniejszemutygrysowi wszystkie a do pierwszego i takiego, e r1ki ri. Okazuje si, e . . . to rozwizanie te jest w penipoprawne! Kademu wybiegowi przydzieli tego samego najmniejszego tygrysa, co rozwizanie wzorcowe, jedynieprzydzia reszty zwierzt moe by inny. Cho rozwizanie to jest prostsze w implementacji od wzorcowego, jegopoprawno jest o wiele mniej oczywista. Zaimplementowano je w tyg1.cpp.

    3.2 Rozwizanie alternatywne 2

    Tym razem przegldamy tr[] od najwikszych do najmniejszych. Aby skonstruowa pierwsz klatk idziemy pokolei od najwikszego tygrysa do coraz mniejszych, i dla kadego z nich obliczajmy gi. W kadym momencie tejiteracji pamitamy najwiksz spord gi (jest to najwikszy rozmiar tygrysa, ktry zostaby poarty w tej klatce)i w momencie, gdy napotkamy pierwszego tygrysa mniejszego od utrzymywanego limitu, koczymy kompletowaniepierwszej klatki i kontynuujemy algorytm w ten sam sposb dla pozostaych tygrysw.Poprawno rozumowania wynika znw z podobnego argumentu co wczeniej: adne dwa tygrysy spord zaczy-

    najcych wybiegi nie mog mieszka razem. Kod tego rozwizania umieszczono w pliku tyg2.cpp.

    3.3 Rozwizanie alternatywne 3

    Co by si stao, gdybymy w rozwizaniu wzorcowym nie sortowali tygrysw, tylko wybierali najmniejszego bezdom-nego osobnika, a potem jego towarzystwo zwyczajnie przegldajc wszystkie zwierzta? Algorytm, cho poprawny,pewnie dziaaby zbyt wolno - w czasie O(mn), gdzie m to liczba zajtych wybiegw. Pomylmy jednak jak duemoe by m. Niech r1, r2 . . . rm oznaczaj rozmiary najmniejszych tygrysw w poszczeglnych wybiegach. r1ki rii ki 2, zatem kady kolejny z m tygrysw jest co najmniej 2 razy wikszy od poprzedniego i r12

    m rm, co z koleiprowadzi do m log2rm log210

    9 30. Podane rozwizanie dziaa zatem prawie tak szybko, co wzorcowe.

    v. 1.10 Tygrysy