Editorial for Kladionica
Submitting an official solution before solving the problem yourself is a bannable offence.
Author:
Analiza problema
Pravolinijsko rešenje se dobija tako što se utakmice numerišu, npr. brojevima od do (ako su lige numerisane brojevima od 1 do , a utakmice u okviru svake lige brojevima od 1 do , onda će utakmica iz lige broj biti numerisana brojem ) i nakon toga svaki tiket posmatra kao podskup skupa . Primetimo da ne mora svaki podskup skupa predstavljati ispravan tiket: može se desiti da je iz nekih liga izabran nedozvoljen broj utakmica. No bez obzira na to, podskupovi se mogu reprezentovati pomoću celih brojeva između 0 i . Svaki broj iz tog opsega se može zapisati u binarnom brojnom sistemu sa najviše cifara (bitova). Ako zapis ima manje od cifara dopuni se nulama (sa leve strane). Cifra nula na mestu određene težine označava da utakmica čija se oznaka poklapa sa težinom nije izabrana u podskup (na tiket), a cifra 1, da je odgovarajuća utakmica izabrana u podskup (na tiket). Prema tome, potrebno je od broja formirati tiket, proveriti da li je tiket ispravan (validan), ako jeste, odrediti dobitak i dodati na zbir dobitaka. Složenost ovog rešenja je . Ovo predstavlja rešenje podzadatka 1.
Podzadatak 3 se takođe može rešiti na poseban način. Pretpostavimo radi pojednostavljenja da imamo samo dve lige. Iz svake lige je moguće uzeti po jednu utakmicu, a dobitak se računa kao proizvod kvota za izabrane utakmice i bonusa za tiket sa dve utakmice. Za svaki tiket će bonus biti isti (jer svaki tiket ima tačno dve utakmice), pa se zbog toga mogu prvo izračunati samo proizvodi kvota za tikete, sabrati i na kraju pomnožiti sa bonusom. Kao što smo rekli, ispravne tikete čine sve kombinacije sastavljene od po jedne utakmice iz obe lige. Zbog distributivnosti množenja u odnosu na sabiranje, zbir proizvoda kvota za sve moguće tikete će biti jednak proizvodu zbira kvota za prvu ligu i zbira kvota za drugu ligu. Ovo se može poopštiti i na slučaj kada postoji više od dve lige, pa se zbir svih dobitaka može odrediti tako što se pomnože zbirovi kvota za sve lige i to na kraju pomnoži sa bonusom (uvek isti broj - broj odigranih utakmica je jednak broju liga). Složenost ovog rešenja je .
Opišimo rešenje koje "pokriva" sve podzadatke. Pretpostavimo opet da imamo samo dve lige. Ako je dozvoljeno iz prve lige uzeti utakmica, a iz druge lige utakmica, onda se bilo koji podskup od utakmica iz prve lige može kombinovati sa bilo kojim podskupom od utakmica iz druge lige, a dobitak će se računati kao proizvod kvota izabranih utakmica i bonusa za odigranih utakmica. Kako je bonus uvek isti, može se opet računati samo zbir proizvoda kvota, pa na kraju dobijeni zbir pomnožiti sa bonusom. Zbog distributivnosti, zbir proizvoda se može dobiti tako što se saberu svi proizvodi od po kvota za prvu ligu, odnosno svi proizvodi od po kvota za drugu ligu i na kraju ta dva zbira pomnože. Ako bi bilo više od dve lige, onda bi se opet zbirove proizvoda (sa istim brojem odigranih utakmica) za pojedine lige množili i nakon toga množili sa odgovarajućim bonusom . Prema tome, potrebno je za početak za svaku ligu i svaku vrednost odrediti zbir svih proizvoda kvota za tačno utakmica odigranih u ligi (označimo te zbirove sa ).
Izraze ćemo izračunati koristeći dinamičko programiranje. Neka je zbir svih proizvoda kvota od tačno utakmica iz lige , pri čemu svi podskupovi sadrže samo utakmice sa rednim brojevima između 1 i (naravno ne nužno sve). Tada će biti zbir svih mogućih proizvoda kvota od po utakmica u ligi broj . Lako se može zaključiti da je \(None\) pr_{i,j}^{(0)}=\begin{cases} 1, &\text{ako je }j=0\ 0, &\text{ako je }j > 0 \end{cases}. \(None\)
Što se tiče zbira svih proizvoda kvota za tačno utakmica gde je svih utakmica iz skupa , primetimo da postoje dve mogućnosti:
- Svih izabranih utakmica su iz skupa , tj. nije izabrana utakmica ,
- Jedna od izabranih utakmica je baš . Onda je preostalih utakmica iz skupa . Pri tome se svaki tiket sa utakmicom može proširiti do tiketa sa utakmica dodavanjem utakmice . Zbog distributivnosti množenja u odnosu na sabiranje, zbir svih proizvoda sa izabranih utakmica, gde je poslednja baš utakmica biće jednak proizvodu kvote za tu utakmicu i zbira proizvoda svih tiketa sa utakmicom (gde su sve te utakmice iz skupa .
Na osnovu ovog razmatranja može se izvesti formula za izračunavanje zbirova: \(None\) pr_{i,j}^{(k+1)}=\begin{cases} pr_{i,j}^{(k)} + pr_{i,j-1}^{(k)} \cdot q_{i,k+1}, &\text{ako je }j\leq k+1\ 0, &\text{ako je }j > k+1 \end{cases}. \(None\) U gornjem izrazu predstavlja kvotu za utakmicu u ligi .
Kada imamo zbirove proizvoda sa fiskiranim brojem utakmica za svaku ligu, onda sličnim postupkom određujemo zbirove proizvoda kvota na tiketu koji sadrži utakmice iz raznih liga. Označimo sa zbir proizvoda svih tiketa koji imaju tačno utakmica iz prvih liga. Tada će važiti da je \(None\) gpr_{1,j}^{(1)} = pr_{1,j}. \(None\) Lako se zaključuje da ako iz prvih liga treba izbrati tačno utakmica, to možemo uraditi tako što iz lige broj izaberemo bilo koji dozvoljeni broj utakmica (ne veći od ) a ostatak dopunimo iz prvih liga. Mi već imamo izračunate zbirove proizvoda kvota za sve moguće brojeve utakmica na tiketu. Ako uvedemo oznake \(None\) c_{i,j} = \begin{cases} 1,&\text{ može izabrati tačno utakmica iz lige }\ 0,&\text{ ne može se izabrati tačno utakmica iz lige } \end{cases}, \(None\) onda se može računati na sledeći način \(None\) g_{k+1,j} = \sum_{j'=1}^{\min(M,j)} c_{k+1,j'}\cdot pr_{k+1,j'}\cdot gpr_{k,j-j'} \(None\) Nakon određivanja svih pomenutih zbirova proizvoda potrebno je samo odgovarajuće zbirove pomnožiti sa bonusima i sabrati: \(None\) \sum_{j}^{N\cdot M} F_j \cdot gpr_{N,j} \(None\) Ovde je sa označen bonus za tiket sa utakmica.
Napomenimo da se sve operacije izvode po modulu , tj. svaki put posle izvedene operacije (sabiranje ili množenje) se određuje ostatak pri deljenju sa .
Na kraju, par reči o složenosti postupka. Složenost računanja matrice je , a složenost računanja matrice je .
Algoritamske smernice
Written with StackEdit.
Comments