|
Titlul: USACO Feb 05 Scris de: Bogdan-Cristian Tataroiu din Februarie 16, 2005, 14:32:49 S-a terminat inca o runda din concursul USACO. Si am facut iarasi 2/3 :( si sunt foarte curios cum se face problema cowrig de la Silver. Poate cineva sa ma ajute?
Titlul: USACO Feb 05 Scris de: Pungaru Marius din Februarie 16, 2005, 16:40:58 Eu cred ca se face cu backtracking pur!!(ma rog nu chiar atat de pur doar foarte putine optimizari).
Fiecare pozitie se renumeroteaza cu 0..24 cu formula (i - 1) * 5 + j. Dupa care aplici algoritmu de generare a combinarilor(unul destul de eficient gasesti si in manualu de Tudor Sorin!!) pentru fiecare pozitie i cu 0 <= i < 25(desi ai putea sa te opresti pe la 19) si numeri solutiile.Mai ramane sa faci o functie destul de eficienta care sa-ti evalueze daca ai ajuns la o solutie valida.Cam la partea asta am bushit eu in concurs(am considerat ca o pozitia curenta din stiva trebuie sa fie legata de o pozitie care se afla mai jos de ea in stiva - programu meu nu prindea cazuri in care solutia avea forma literei "U") si am pierdut o groaza de teste. :oops: Am inteles ca se poate gasi o solutie si mai eficienta(o programare dinamica) dar inca mai ma chinui sa fac o implementare eficienta.Poate imi dati voi vreo idee!!pls! Titlul: USACO Feb 05 Scris de: Mircea Pasoi din Februarie 16, 2005, 18:47:49 Citat din mesajul lui: JEULETZ Eu cred ca se face cu backtracking pur!!(ma rog nu chiar atat de pur doar foarte putine optimizari). Fiecare pozitie se renumeroteaza cu 0..24 cu formula (i - 1) * 5 + j. Dupa care aplici algoritmu de generare a combinarilor(unul destul de eficient gasesti si in manualu de Tudor Sorin!!) pentru fiecare pozitie i cu 0 <= i < 25(desi ai putea sa te opresti pe la 19) si numeri solutiile.Mai ramane sa faci o functie destul de eficienta care sa-ti evalueze daca ai ajuns la o solutie valida.Cam la partea asta am bushit eu in concurs(am considerat ca o pozitia curenta din stiva trebuie sa fie legata de o pozitie care se afla mai jos de ea in stiva - programu meu nu prindea cazuri in care solutia avea forma literei "U") si am pierdut o groaza de teste. :oops: Am inteles ca se poate gasi o solutie si mai eficienta(o programare dinamica) dar inca mai ma chinui sa fac o implementare eficienta.Poate imi dati voi vreo idee!!pls! Am citit si eu problema si cred ca backtracking ar fi trebuit sa se incadreze fara problema in timp... sunt doar C(25, 7) = 480.700 posibiltati, deci foarte putine... mai ramane doar verificare ca este conexa .. o verificare triviala ar trebui sa fie de ajuns (ar fi O(1) oricum.. cu o constata mica) Titlul: USACO Feb 05 Scris de: Pungaru Marius din Februarie 17, 2005, 16:59:55 Daca pui conditii k-lumea poti sa faci programu sa ruleze in 0.01 sec chiar si daca folosesti lee ca sa verifici legatura dintre blocuri. :D
Titlul: USACO Feb 05 Scris de: Bindea Calin din Februarie 18, 2005, 21:51:05 :shock: Pe mine ma imbata de cap problema secret de la Gold. Cine poate sa ma faca si pe mine sa inteleg exact care e faza cu cararile alea.
Deci o carare e bidirectionala. Atunci ei imi dau lungimea ei , in formatul x y l asta inseamna pt mine ca a
deci asta inseamna ca invers are alta lungime ?? spre exemplu testul 2 Cod: ----- Test Case 2 ------ Dar daca mi se da x y -> l nu tot timpul mi se da si y x -> si un alt l.. Lamuriti-ma si pe mine cum sa iau aici.. si inca o kestie. Citat Multiple trails might join a pair of landmarks. Asta inseamna ca pot fi mai multe arce intre x si y ? Oricum alg meu e o cautare binara si un flux.. dar fac numai 2 teste.. :cry: Titlul: USACO Feb 05 Scris de: Tiberiu-Lucian Florea din Februarie 18, 2005, 21:54:32 Sunt mai multe muchii intre 2 noduri
Titlul: USACO Feb 05 Scris de: Bindea Calin din Februarie 18, 2005, 22:22:27 Citat din mesajul lui: greco Sunt mai multe muchii intre 2 noduri Ah, si atuncia dc imi dau x y l 0 .. y x l1 atuncia intre x si y am 2 drumuri de lungime l1 si l0 si intre y si x la fel. nu ? Titlul: USACO Feb 05 Scris de: Tiberiu-Lucian Florea din Februarie 18, 2005, 23:02:23 Da mah, asa.
Titlul: USACO Feb 05 Scris de: Bindea Calin din Februarie 20, 2005, 15:18:26 Ok, acuma am trecut de faza asta si am scris alg, da iau tle pe 6, 9-12 :(
Fac oare ceva in plus la algoritm ? Eu fac o cautare binara pt cea mai lunga poteca si apoi ii bag un flux sa vad dc am t drumuri pentru acea poteca... Sugestii de optimizare ? :P Titlul: USACO Feb 05 Scris de: Cosmin Negruseri din Februarie 20, 2005, 17:41:31 Sunt algoritmi de flux mai buni decat Edmons Karp dar ar trebui sa mearga simplu cu Edmonds Karp ... Tu cum gasesti drumurile de marire a fluxului? Cum iti reprezinti graful? O idee de optimizare e ca in cazul maririi dimensiunii muchiei maxime nu trebuie neaparat sa pornesti de la flux 0 ci poti sa pornesti de la fluxul anterior.
Titlul: USACO Feb 05 Scris de: Bindea Calin din Februarie 20, 2005, 18:49:02 am bagat optimizarea aia sa nu pornesc de la flux 0 cand cresc si am mai luat un test (11) :lol:
da la restu tot tle.. deci cred ca trebuie sa bag alt alg de flux. Mai detaliat , graful mi-l tin cu liste de vecini ca sa mearga repede cand caut un drum. si mai tin normal c[j] - cap muchiei, f[j] - fluxul.. si o matrice de pointeri la nod a unde a[j] tine capatul unei liste in care is toate muchiile de la i la j.. si de fiecare data cand pornesc un flux cu o muchie maxima noua, vad cate dintre muchiile din lista lui a[j] sunt mai mici si imi dau seama cat va fi c[j].. :roll: Titlul: USACO Feb 05 Scris de: Mircea Pasoi din Februarie 20, 2005, 21:35:19 Citat din mesajul lui: ParrAzitU am bagat optimizarea aia sa nu pornesc de la flux 0 cand cresc si am mai luat un test (11) :lol: da la restu tot tle.. deci cred ca trebuie sa bag alt alg de flux. Mai detaliat , graful mi-l tin cu liste de vecini ca sa mearga repede cand caut un drum. si mai tin normal c[j] - cap muchiei, f[j] - fluxul.. si o matrice de pointeri la nod a unde a[j] tine capatul unei liste in care is toate muchiile de la i la j.. si de fiecare data cand pornesc un flux cu o muchie maxima noua, vad cate dintre muchiile din lista lui a[j] sunt mai mici si imi dau seama cat va fi c[j].. :roll: Daca tii cu liste probabil folosesti pointeri care merg foarte incet. Ca sa mearga pur si simplu iti trebuie o matrice de C pentru capacitati si F pentru flux... muchiile le tii intr-un vector ca sa construiesti C-ul la fiecare iteratie a cautarii binare. Deci, in primul rand fara pointeri. Apoi, iei valorile muchiilor le sortezi (nu cu qsort, incearca altceva.. sort() din STL sau heap-sort, nu stiu) , elimini valorile egale si faci cautare binara doar pe valorile din vectorul ala. Ah, cand faci flux banuiesc ca incerci sa aflii doar flux de valoare T nu flux maxim. Keep it simple, ca merge in limita de timp... la limita, dar intra :) Titlul: USACO Feb 05 Scris de: Bindea Calin din Februarie 21, 2005, 20:16:31 :lol: :lol:
Citat Results for program 'secret' (lang='C++'): PROB: secret LANG: C++ Compiling... Compile: OK Executing... Test 1 OK [0.01 secs] Test 2 OK [0 secs] Test 3 OK [0.08 secs] Test 4 OK [0.05 secs] Test 5 OK [0.04 secs] Test 6 OK [0.29 secs] Test 7 OK [0.02 secs] Test 8 OK [0.1 secs] Test 9 OK [0.2 secs] Test 10 OK [0.28 secs] Test 11 OK [0.17 secs] Test 12 OK [0.26 secs] pointers suck ass ... Merge mul mai r/d fara pointeri... Am scris de la inceput totul cum zicea si domino cu keep it simple si in sfarsit a mers.. ( o kestie ciudata era ca dadea kiks pe unele teste daca declaram matricea de vecini char... nush dc ca oricum orice elem din matricea de vecini < 255.. da oricum acuma merge :P ) Titlul: USACO Feb 05 Scris de: Mircea Pasoi din Februarie 21, 2005, 21:19:24 Citat din mesajul lui: ParrAzitU ( o kestie ciudata era ca dadea kiks pe unele teste daca declaram matricea de vecini char... nush dc ca oricum orice elem din matricea de vecini < 255.. da oricum acuma merge :P ) Pai daca lucrezi in C char este de la -128 la 127.. iti trebuia unsigned char. |