Viteze
Hamster
- Pentru rezolvarea acestei probleme se va folosi programarea dinamica.
Mai exact, D-ul minim pentru a acoperi primele gropi cu placi. Recurenta este: , unde ; - folosim a -a placa pentru a acoperi fix gropile , iar pentru celelalte gropi vom folosi cele placi ramase si vom lua -ul optim. Acest algoritm are complexitate timp .
- Pentru a ajunge la o complexitate de trebuie observat ca functia este crescatoare si ca functia este descrescatoare. Deci, functia este unimodala (adica tot scade si apoi tot creste) si se poate cauta binar primul pentru care (minimul functiei).
- Pentru de puncte vom face trecerea de la la folosind un iterator. Mai exact, fie minimul functie actuale . Este clar ca , unde este minimul functie . Astfel, putem incrementa -ul optim gasit la pasul de cate ori este nevoie pentru a afla -ul optim la pasul . Complexitatea finala este amortizat.
r - La ce ne ajuta oare dinamica calculata? Acum putem cauta binar raspunsul folosind relatia ca ne intereseaza cel mai mic astfel incat ≤
Complexitate totala:
Superbec
- Prima observatie pe care trebuie sa o facem este ca daca un buton este apasat de ori, , sirul este modificat ca si cand ar fi fost apasat de ori. Astefel, sirul poate lua forme, in functie de numarul de apasari al fiecaruia dintre cele butoane. Fiecare forma este data de un sir de triti care indica, pentru fiecare buton, numarul relevant de apasari aplicate lui. Urmeaza sa verificam, pentru fiecare sir, daca forma respectiva se poate potrivi cu sirul dat in input.
- A doua observatie este legata de . Sa notam cu numarul total de apasari relevante aplicate celor butoane. Ca sirul sa aiba sens, trebuie sa fie in primul rand multiplu de . Daca sirul este corect si din punct de vedere al corespondentei cu sirul din input, trebuie sa adaugam la rezultat numarul de variante de a obtine sirul cu apasari de butoane. Acest numar este egal cu numarul de moduri de a pune obiecte identice in cutii, care este egal cu combinari de luate cate . Putem calcula acest numar modulo in folosind notiunea de invers modular.
- Folosind cele observatii putem lua din punctajul maxim: Incercam sa potrivim cele forme ale sirului de triti peste sirul dat in input in timp per sir, iar in caz ca sirul se potriveste, adunam la raspuns numarul de moduri de a obtine sirul de triti din mutari.
- A treia observatie, necesara pentru obtinerea punctajului maxim, este ca nu este nevoie ca verificarea potrivirii sirului de triti sa fie efectuata in timp. Daca ne uitam la cele butoane, observam ca modificarile aduse sirului de fiecare buton in parte se repeta fie din in , fie din in , fie din in , fie din in . Asadar, modificarile aduse de toate butoanele sunt identice din in , deci nu trebuie sa facem decat de pasi pentru verificarea potrivirii sirurilor, daca avem precalculat caracterul aflat la pozitiile in sirul din input, precalculare care poate fi facuta in timp .
Complexitate timp:
Complexitate memorie: