2 - Hoteli
Vremensko ograničenje | Memorijsko ograničenje |
---|---|
1000ms | 32MB |
Tajvan, drevna ostrvska zemlja, nadaleko je poznata po nindžama, Acer-u i dugačkim i lepim plažama. Duž jedne od takvih plaža nalazi se \(N\) odmarališta, numerisanih brojevima od \(1\) do \(N\), redom, s leva na desno. Rastojanje između dva uzastopna odmarališta je tačno \(1\) km; specijalno, rastojanje između odmarališta broj \(i\) i odmarališta broj \(j\) je \(|i-j|\) kilometara za svako \(1\leq i,j\leq N\).
Ovih dana, aktuelna je vest da sumnjivi ruski biznismeni iz Crne Gore planiraju da u nekim odmaralištima sagrade luksuzne hotele. Za svako odmaralište je poznato da li je u njemu moguće sagraditi hotel ili ne (ukoliko je moguće, nije nužno sagraditi hotel u njemu). Kada se hoteli budu sagradili, odrediće se poredak odmarališta po popularnosti na sledeći način: odmaralište \(i\) će biti popularnije od odmarališta \(j\) ako i samo ako je:
- Rastojanje od odmarališta \(i\) do njemu najbližeg hotela manje od rastojanja odmarališta \(j\) do njemu najbližeg hotela; ili
- prethodno pomenuta rastojanja su ista i važi \(i<j\).
Na primer, ukoliko imamo \(8\) odmarališta i hoteli su sagrađeni u odmaralištima broj \(2\), \(6\) i \(7\) tada je poredak odmarališta po popularnosti (počevši od najpopularnijeg): \(2\), \(6\), \(7\), \(1\), \(3\), \(5\), \(8\), \(4\). Na primer, odmaralište \(6\) je popularnije od odmarališta \(5\) jer je odmaralištu \(6\) najbliži hotel na rastojanju \(0\), dok je odmaralištu \(5\) najbliži hotel na rastojanju \(1\). Slično, odmaralište \(3\) je popularnije od odmarališta \(5\) jer su im najbliži hoteli podjednako udaljeni i važi \(3<5\), itd.
Međutim, stari naturalizovani tajvanac Stanoje Hvang poseduje odmaralište broj \(X\), srećni broj \(P\) i većinu ruskih biznismena pa, sasvim prirodno, želi da se hoteli sagrade tako da odmaralište broj \(X\) bude \(P\)-to po popularnosti. Na koliko načina se to može uraditi?
Opisi funkcija
Potrebno je da implementirate funkciju:
BrojIzgradnji(N, X, P, H[])
;
gde je \(N\) – broj odmarališta, \(X\) – redni broj odmarališta koje poseduje Stanoje, \(P\) – Stanojev srećni broj i \(H\) – niz dužine \(N\) (indeksiran od \(1\)) koji označava u kojim odmaralištima se mogu sagraditi hoteli: ukoliko je \(H_i=1\), u i-tom odmaralištu se može sagradati hotel; u suprotnom je \(H_i=0\). Ova funkcija mora da vrati jedan ceo broj – broj načina na koji se mogu izgraditi hoteli tako da svi pomenuti uslovi budu zadovoljeni po modulu \(1.000.000.007\) \((10^9+7)\).
Primer 1
Neka je \(N=10\), \(X=5\), \(P=4\) i \(H=[0, 0, 0, 1, 0, 1, 0, 0, 1, 1]\). Tada postoji tačno \(4\) načina da se izgrade hoteli tako da odmaralište broj \(5\) bude \(4\). po popularnosti i ti načini su:
Prema tome, u ovom slučaju vaša funkcija mora da vrati \(4 \text{ MOD } 1.000.000.007=4\).
Ograničenja
- \(1 \leq N \leq 300\).
- \(1 \leq X \leq N\).
- \(1 \leq P \leq N\).
- Za svako \(1 \leq i \leq N\) važi \(H[i] \in \{0, 1\}\).
Podzadaci:
- PODZADATAK \(1\) [\(12\) POENA]: \(N\leq 20\).
- PODZADATAK \(2\) [\(13\) POENA]: \(N\leq 25\), \(X=1\) i \(H[i]=1\) za svako \(1\leq i \leq N\).
- PODZADATAK \(3\) [\(18\) POENA]: \(P=N\).
- PODZADATAK \(4\) [\(21\) POENA]: \(N\leq 100\).
- PODZADATAK \(5\) [\(36\) POENA]: Nema dodatnih ograničenja.
Detalji implementacije
Potrebno je da pošaljete tačno jedan fajl, pod nazivom hoteli.c
, hoteli.cpp
ili hoteli.pas
, koji implementira gore pomenutu funkciju. Osim tražene funkcije, vaš fajl može sadržati i dodatne globalne promenljive, pomoćne funkcije i dodatne biblioteke.
Zavisno od programskog jezika koji koristite, vaša funkcija/procedura mora biti sledećeg oblika:
C/C++:
int BrojIzgradnji(int N, int X, int P, int* H);
Pascal:
function BrojIzgradnji(N, X, P : longint; H : array of longint) : longint;
Testiranje i eksperimentisanje
Uz zadatak, obezbeđeni su vam “template” fajlovi (hoteli.c
, hoteli.cpp
, hoteli.pas
) koje možete koristiti i menjati po potrebi. Takođe su vam obezbeđeni programi (grader.c
, grader.cpp
, grader.pas
) koji služe da lakše testirate kodove. Ovi programi učitavaju sa standardnog ulaza sledeće podatke:
- U prvom redu brojeve \(N\), \(X\) i \(P\), redom, razdvojene razmakom;
- U drugom redu niz \(H – N\) brojeva \(H[i]\) razdvojenih razmakom;
zatim pozivaju vašu funkciju BrojIzgradnji
iz odgovarajućeg fajla (hoteli.c
, hoteli.cpp
, hoteli.pas
) sa učitanim parametrima i na kraju vrednost koju vaša funkcija vraća ispisuju na standardni izlaz. Kodove ovih programa možete menjati po potrebi.
Autor | Tekst i test primeri | Analiza rеšenja | Testiranje |
---|---|---|---|
Nikola Milosavljević | Uglješa Stojanović | - | Nikola Milosavljević |
02_hoteli.cpp | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
|