infoarena

infoarena - concursuri, probleme, evaluator, articole => Infoarena Monthly 2014 => Subiect creat de: Teodor Plop din August 28, 2014, 21:01:55



Titlul: Infoarena Monthly 2014, Runda 8
Scris de: Teodor Plop din August 28, 2014, 21:01:55
Runda 8 (http://infoarena.ro/monthly-2014/runda-8) va avea loc Duminica, 31 august la ora 1900.
Va uram mult succes!  :winner1:


Titlul: Răspuns: Infoarena Monthly 2014, Runda 8
Scris de: Teodor Plop din August 31, 2014, 20:31:32
Runda s-a incheiat. Clasamentul este public. Problemele au fost adaugate in arhiva! Asteptam primele voastre impresii :D

Felicitari tuturor participantilor  :winner1:


Titlul: Răspuns: Infoarena Monthly 2014, Runda 8
Scris de: George Marcus din August 31, 2014, 20:33:47
Leeerooooooy Jeeenkiiiiiins!  :D Cine e fan Blizzard/Warcraft?
Ar fi util sa vezi scorul potential la probleme ca la codeforces.


Titlul: Răspuns: Infoarena Monthly 2014, Runda 8
Scris de: Patrick Sava din August 31, 2014, 20:36:09
O runda cu probleme super frumoase ! Big up comisiei !  :D Apropo,imi poate da si mie cineva o indicatie la problema Super Mario ? M am chinuit o ora din concurs sa o dovedesc,dar nu prea a fost cu succes  :'(


Titlul: Răspuns: Infoarena Monthly 2014, Runda 8
Scris de: Gemene Narcis - Gabriel din August 31, 2014, 20:39:20
Cred ca a fost runda cu cele mai interesante probleme. Felicitari !!! Si ,ca de obicei, asteptam modificarea ratingului.


Titlul: Răspuns: Infoarena Monthly 2014, Runda 8
Scris de: Mihai Ionut Enache din August 31, 2014, 20:48:47
Probabil cea mai reusita runda de anul acesta, felicitari!  =D&gt; Si nu sunt subiectiv, spun asta in conditiile in care mi-a picat a 3-a problema din cauza ca citesc N muchii in loc de N - 1  :-' O intrebare: cum se poate rezolva prima problema daca B - A <= 10^9, in loc de 10^3?


Titlul: Răspuns: Infoarena Monthly 2014, Runda 8
Scris de: Toader Andrei Sorin din August 31, 2014, 20:51:04
Cand o sa apara articolul cu solutii?


Titlul: Răspuns: Infoarena Monthly 2014, Runda 8
Scris de: UAIC.VlasCatalin din August 31, 2014, 20:55:57
Daca erau enunturi mai scurte runda era sa fie si mai frumoasa.  :)


Titlul: Răspuns: Infoarena Monthly 2014, Runda 8
Scris de: Gemene Narcis - Gabriel din August 31, 2014, 20:59:52
@Mihai22e .Eu as folosi smenul de la problema cntgcd.


Titlul: Răspuns: Infoarena Monthly 2014, Runda 8
Scris de: Heidelbacher Andrei din August 31, 2014, 21:19:54
O runda cu probleme super frumoase ! Big up comisiei !  :D Apropo,imi poate da si mie cineva o indicatie la problema Super Mario ? M am chinuit o ora din concurs sa o dovedesc,dar nu prea a fost cu succes  :'(

Sunt doua solutii oficiale. In continuare voi prezenta una dintre acestea.

Vom defini o functie recursiva, Solve(left, right), care returneaza numarul minim de mutari necesare pentru a distruge toate testoasele din intervalul [left, right], folosind numai testoase din acest interval. Raspunsul va fi dat de Solve(1, N), iar cazurile de baza Solve(i, i) sunt triviale (raspunsul e mereu 1).
Intr-o solutie optima, testoasele vor fi distruse in ordine descrescatoare dupa valori. Astfel, vom incerca sa facem prima mutare in Solve(left, right). Fie pos pozitia pe care se afla testoasa de valoare maxima din intervalul [left, right]. Putem sa o lovim spre stanga sau spre dreapta, iar noi vom alege varianta optima. Astfel, Solve(left, right) va returna min(Solve(left, pos - 1), Solve(pos + 1, right)) + 1. Pentru a determina eficient pos, putem folosi o structura de date precum arborii de intervale. Complexitatea este O(N * logN).

Cealalta solutie oficiala se bazeaza pe programare dinamica si are complexitate liniara.


Titlul: Răspuns: Infoarena Monthly 2014, Runda 8
Scris de: Patrick Sava din August 31, 2014, 21:24:08
Iti multumesc foarte mult pentru ajutor!Am sa incep sa o implementez :)


Titlul: Răspuns: Infoarena Monthly 2014, Runda 8
Scris de: Kurt Godel din Septembrie 01, 2014, 12:05:49
O runda cu probleme super frumoase ! Big up comisiei !  :D Apropo,imi poate da si mie cineva o indicatie la problema Super Mario ? M am chinuit o ora din concurs sa o dovedesc,dar nu prea a fost cu succes  :'(

Sunt doua solutii oficiale. In continuare voi prezenta una dintre acestea.

Vom defini o functie recursiva, Solve(left, right), care returneaza numarul minim de mutari necesare pentru a distruge toate testoasele din intervalul [left, right], folosind numai testoase din acest interval. Raspunsul va fi dat de Solve(1, N), iar cazurile de baza Solve(i, i) sunt triviale (raspunsul e mereu 1).
Intr-o solutie optima, testoasele vor fi distruse in ordine descrescatoare dupa valori. Astfel, vom incerca sa facem prima mutare in Solve(left, right). Fie pos pozitia pe care se afla testoasa de valoare maxima din intervalul [left, right]. Putem sa o lovim spre stanga sau spre dreapta, iar noi vom alege varianta optima. Astfel, Solve(left, right) va returna min(Solve(left, pos - 1), Solve(pos + 1, right)) + 1. Pentru a determina eficient pos, putem folosi o structura de date precum arborii de intervale. Complexitatea este O(N * logN).

Cealalta solutie oficiala se bazeaza pe programare dinamica si are complexitate liniara.

Mi-a venit si mie fix aceeasi idee cu Divide et Impera, dar cum pot sa demonstrez corectitudinea algoritmului? In special afirmatia ca cel mai optim mod este sa distrugem testoasele in ordine descrescatoare dupa P[ i ].
Intuitiv inteleg de ce e asa, dar cum as proceda daca as vrea sa fac o demonstratie matematica consistenta? Presupun ca aici trebuie folosita reducerea la absurd dar nu imi vine in cap cum sa construiesc argumentul.


Titlul: Răspuns: Infoarena Monthly 2014, Runda 8
Scris de: Andrei Constantinescu din Septembrie 01, 2014, 12:47:36
Inductie dupa lungimea sirului nostru, N:

Cazul de baza: N=1 => Evident, algoritmul nostru e corect aici.

Cazul general: Presupunem ca am demonstrat afirmatia noastra pentru toti 1 <= k < N si acum vrem sa demonstram afirmatia noastra pentru N. In primul rand, daca nu am folosi maximul din vector, nu am avea cum sa ucidem toate testoasele (cum elementele vectorului sunt unice rezulta ca numai maximul se poate elimina pe el insusi). Apoi, daca nu am folosi maximul chiar la inceput, aratam ca am irosit mutari (deci solutia noastra nu este in general optima). Mai exact, presupunem ca maximul e pe pozitia X. Numim stanga lui X intervalul [1,X-1] si dreapta lui X intervalul [X+1,N] (cazurile cand unul din aceste intervale este vid se trateaza analog). Daca nu am folosi maximul chiar la inceput, am face cateva miscari strict in stanga lui X si cateva strict in dreapta lui X (independente fiindca X este maxim), dupa care am folosi maximul in una din directii. Maximul va elimina cu siguranta tot ce exista in aceea directie, deci mutarile facute acolo au fost inutile, iar cele facute in cealalta directie puteau fara a schimba raspunsul sa fie facute si dupa eliminarea maximului. Astfel, am demonstrat ca la pasul curent vom alege mai intai maximul. Dupa alegerea maximului, vectorul nostru se micsoreaza, si cum stim ca am demonstrat afirmatia pentru 1 <= k < N, rezulta ca in continuare vom alegem numai maxime, indiferent cum am orienta primul maxim ales.

Am incercat sa o fac cat de riguros am putut. Oricum, mare parte a demonstratiei e intuitie.  :thumbup:

Edit: Practic am folosit reducerea la absurd, fara insa a folosi formularile clasice.