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)}={1,ako je j=0 0,ako je j>0.
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)}={pr(k)i,j+pr(k)i,j−1⋅qi,k+1,ako je j≤k+1 0,ako je j>k+1.
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