•DITzoneC
|
 |
« : Ianuarie 21, 2007, 23:51:09 » |
|
Aici puteţi discuta despre problema Elimin.
|
|
« Ultima modificare: Ianuarie 30, 2007, 20:48:14 de către Crestez Dan-Leonard »
|
Memorat
|
|
|
|
•cos_min
|
 |
« Răspunde #1 : Ianuarie 25, 2007, 22:31:40 » |
|
Scuzati intrebare : -> Cum pot genera toate posibilitati de de a elimina exact C coloane din numarul total de N in O(2^N) ??  Ms.
|
|
|
Memorat
|
vid...
|
|
|
•DITzoneC
|
 |
« Răspunde #2 : Ianuarie 25, 2007, 23:05:16 » |
|
Parcurgi toate numerele din intervalul [ 0,2N-1 ]. In descompunerea binara bitul i va fi 1 daca coloana i va fi eliminata, 0 in caz contrar. Pe parcurs ce generezi numerele retii cati de 1 ai adaugat.
De fapt nici nu o sa ai 2N, o sa fie combinari de N luate cate C, ai grija ca la un anumit pas sa nu pui 1 daca deja ai pus C de 1, si nu pui 0 daca numarul de biti ramasi necompletati nu iti ajunge pentru a pune in total C de 1.
|
|
|
Memorat
|
|
|
|
•Marius
|
 |
« Răspunde #3 : Ianuarie 26, 2007, 18:42:10 » |
|
Scuzati intrebare : -> Cum pot genera toate posibilitati de de a elimina exact C coloane din numarul total de N in O(2^N) ??  Ms. Rezolva Flip.
|
|
|
Memorat
|
Faceti lucrurile simplu: pe cat de simplu posibil, dar nu mai simplu.
|
|
|
•cos_min
|
 |
« Răspunde #4 : Ianuarie 27, 2007, 19:41:31 » |
|
Multumesc pentru indicati, am ajuns la cota 70  sa speram ca o sa imi iasa de 100  le : Am reusit sa iau 100 pana la urma.
|
|
« Ultima modificare: Ianuarie 28, 2007, 18:32:59 de către Bondane Cosmin Cosi »
|
Memorat
|
vid...
|
|
|
•Dastas
|
 |
« Răspunde #5 : Mai 12, 2007, 10:35:12 » |
|
Eu iau 90, TLE pe ultimul test. A luat cineva 100 generand combinarile cu backtracking? La flip a intrat lejer asa... aici se pare ca nu vrea... Pe biti nu prea ma prind cum se face. Pur si simplu ma folosesc de bitii numerelor din intervalul [0, 2^N], eliminand coloanele a caror biti corespunzatori sunt 1 (Daca acesti biti de 1 sunt C in total)? Nu prea inteleg ce vrea sa spuna Adrian Diaconu prin "si nu pui 0 daca numarul de biti ramasi necompletati nu iti ajunge pentru a pune in total C de 1.". Eu ma gandeam sa parcurg numerele din [0, 2^N], iar daca am C biti de 1, elimin acele coloane... Putin ajutor va rog 
|
|
|
Memorat
|
|
|
|
•cos_min
|
 |
« Răspunde #6 : Mai 12, 2007, 11:48:34 » |
|
Intra back si fara biti, adica back normal. Incearca sa faci backu' pentru Minim(nr_coloane,nr_linii).
|
|
|
Memorat
|
vid...
|
|
|
•Dastas
|
 |
« Răspunde #7 : Mai 12, 2007, 11:54:36 » |
|
Asemanator am facut... adica, daca linii < coloane, am citit matricea inversata, am interschimbat nr_linii cu nr_coloane si r cu c, iar apoi am facut back pe coloane (care sunt minime...). Inainte sa fac asta luam vreo 60... asa tle pe ultimul test :/.
|
|
|
Memorat
|
|
|
|
•marcelcodrea
|
 |
« Răspunde #8 : Mai 12, 2007, 12:20:50 » |
|
Nu stiu cum parcurgi tu matricea ,insa se pierde foarte mult timp daca spargi linia de cache foarte des (printr-o parcurgere pe coloane,de exemplu)! for(j=1;j<m;j++) for(i=1;i<m;i++) a[i][j]=1;
|
|
|
Memorat
|
Imperiile coloniale au murit... Germania Nazistä a murit... Uniunea Sovieticä a murit... Si nici Uniunea Europeanä nu se simte prea bine
|
|
|
•Dastas
|
 |
« Răspunde #9 : Mai 12, 2007, 12:29:33 » |
|
Intr-adevar, daca liniile sunt mai putine decat coloanele, matricea o citesc gata rotita (accesez elementele ceva de genul a[n-j+1][ i ], cu for-uri i=1..m, j =1..n), poate fi de la asta? O sa incerc sa scap de asta facand back-ul direct pe minimul dintre linii si coloane atunci...
|
|
|
Memorat
|
|
|
|
|
•Dastas
|
 |
« Răspunde #11 : Mai 12, 2007, 12:45:25 » |
|
Dar... ma ajuta asta cu ceva cand rotesc matricea? Ca atunci tot nu pot scapa de spargerea liniei de cache... Edit: Am luat 100 folosind sort din STL. Ultimul test intra in ~250 ms... totusi, daca binevoieste cineva sa ma ajute cu o solutie de 100 fara stl, eventual pe biti, i-as fi recunoscator  .
|
|
« Ultima modificare: Mai 12, 2007, 17:24:20 de către Ionescu Vlad »
|
Memorat
|
|
|
|
•Florian
|
 |
« Răspunde #12 : August 24, 2007, 10:56:58 » |
|
Am o rezolvare aproximativ ca in exemplu: pt fiecare configuratie a nr de la 0 la 2^n-1, dak aceasta are un numar de biti de 1 egal cu R, atunci execut pasii din articol. cu toate acestea, am 2 TLE-uri. Nu inteleg ce ar putea sa optimizez. Pt sortarea vectorului de sume folosesc qsort, iar knd aflu bitii unui nr, am grija sa ma opresc dak cumva numarul de biti de 1 depaseste valoare R. Nu prea vad ce optimizare sa mai fac...
|
|
|
Memorat
|
|
|
|
•filipb
|
 |
« Răspunde #13 : August 24, 2007, 12:49:10 » |
|
Functia qsort implementata in Borland merge foarte incet si poate avea in unele cazuri complexitate patratica! Incearca sa folosesti functia sort din STL ( inlocuirea nu necesita mari schimbari, doar vreo doua linii de cod in plus ), sau poti implementa propria ta functie qsort care sigur va fi mai rapida. Asa sigur o sa obtii 100.
|
|
|
Memorat
|
|
|
|
•Florian
|
 |
« Răspunde #14 : August 24, 2007, 13:05:56 » |
|
Am folosit functia sort, si akum iau 90 de puncte.  Alte sugestii?
|
|
|
Memorat
|
|
|
|
•filipb
|
 |
« Răspunde #15 : August 24, 2007, 13:19:35 » |
|
Hm... m-am uitat un pic pe sursa ta sa vad de ce inca merge incet. Sugestiile mele: incearca sa renunti atat la struct care e complet inutil ( retine doar informatiile pentru un long. in plus foloseste int, nu long, pentru ca sub linux ambele tipuri sunt pe 4 bytes ), cat si la functia stiva. Pentru a numara bitii de 1 dintr-un numar poti folosi preprocesare: for (i = 1; i < (1<<N); i++) { if (2 * i <= (1<<N)) nr_biti[2*i] = nr_biti[i]; if (2 * i + 1 <= (1<<N)) nr_biti[2*i+1] = nr_biti[i]+1; }
2 15 intra pe tipul de date int, nu e nevoie de long long. Mare atentie la aceste aparent mici detalii, sunt mari consumatoare de timp. O programare ingrijita reduce semnificativ timpul de executie al programului.
|
|
|
Memorat
|
|
|
|
•fireatmyself
|
 |
« Răspunde #16 : August 24, 2007, 13:24:56 » |
|
daca ai urmarit articolul (in totalitate), inseamna ca ideea este buna. ai grija la detaliile de implementare 1. algoritm interativ de generare a submultimilor (merge mai repede decat cel recursiv) 2. la instructiunile repetitive, incearca sa ai limite ce se calculeaza o singura data in cadrul acestora (ex: for (i = 0; i < V[ x ]; i++) => for (i = 0, n = V[ x ]; i < n; i++), deci V[ x ] va fi accesat o singura data) 3. folosestete de operatiile pe biti (in loc de if ( a==0 ), if (!a), in loc de 2*x, (x<<1), etc...) sunt chestii mici, pe care probabil le stii deja, dar care pot optimiza un algoritm care se incadreaza in timp 'la limita'. Spor si numai de bine. 
|
|
« Ultima modificare: August 24, 2007, 13:30:28 de către Bogdan A. Stoica »
|
Memorat
|
Viata e scurta. Daca nu o putem lungi, macar s-o facem lata.
|
|
|
•Florian
|
 |
« Răspunde #17 : August 24, 2007, 20:01:23 » |
|
Va multumesc pt ajutor. Sugestiile mele: incearca sa renunti atat la struct care e complet inutil ( retine doar informatiile pentru un long.
Am folosit structura asta, intrucat fiind prima data knd folosesc sort din std, primesc o eroare. Uite: Dak am asa: *o structura numita "interval" si codu`: bool operator <(const interval &x, const interval &y) { return x.x<y.x; } merge fara nicio problema. [ fiind motivul pt care am folosit structura ]. Insa dak am asa: bool operator <(const int &x, const int &y) { return x<y; }
Primesc eroarea: bool operator ... must have an argument a class or enumerated type Cum ar trebui sa arate codu` corect pt a sorta un vector de tip int? 
|
|
|
Memorat
|
|
|
|
•Dastas
|
 |
« Răspunde #18 : August 24, 2007, 20:40:24 » |
|
Pentru tipurile de date existente deja exista operatorul <, deci nu ai nevoie de o astfel de functie...
|
|
|
Memorat
|
|
|
|
•cos_min
|
 |
« Răspunde #19 : August 24, 2007, 21:20:38 » |
|
Daca ai :
int A[dim]; ...... sort(A+0,A+N); // ceva de genu asta, ai grija ca s'ar putea sa nu fie A+0 si A+N, ai grija cum le sorteaza.
|
|
|
Memorat
|
vid...
|
|
|
•filipb
|
 |
« Răspunde #20 : August 24, 2007, 21:47:46 » |
|
Tot din codul tau am remarcat ca folosesti destul de incalcit STL ( de exemplu std::sort(s+1,s+m+1) ). Uite un program mult mai simplu care foloseste sort si sorteaza descrescator ( functia sort primeste in plus un parametru cmp - functie de comparare - ca la qsort ): #include <stdio.h> #include <algorithm> using namespace std; // spatiul de nume pentru STL - obligatoriu
int N, a[100001];
int cmp(const int& a, const int& b) { return a>b; }
int main() { int i; scanf("%d", &N); for (i = 1; i <= N; i++) scanf("%d", &a[i]);
sort(a+1, a+N+1, cmp); // acum vectorul e sortat conform functiei cmp - descrescator return 0; }
Cu sort folosit asa si cu micile optimizari de cod pe care ti le-am zis ( eliminat long long, structuri si introdus preprocesarea pentru numarul de biti ) ar fi dubios sa nu iei 100. 
|
|
« Ultima modificare: August 24, 2007, 21:51:46 de către Filip Cristian Buruiana »
|
Memorat
|
|
|
|
•Florian
|
 |
« Răspunde #21 : August 25, 2007, 16:22:33 » |
|
Dapz. A mers!  Va multumesc mult pt ajutor [ in special lui filipb ]. Am avut ce invata din problema asta.
|
|
|
Memorat
|
|
|
|
|
•astronomy
|
 |
« Răspunde #23 : Septembrie 21, 2007, 12:15:06 » |
|
Depasesti limita de memorie.. Poate atunci nu se tinea cont de memoria declarata, doar de cea folosita.
|
|
|
Memorat
|
|
|
|
•Robytzza
|
 |
« Răspunde #24 : Decembrie 29, 2007, 15:32:59 » |
|
daca am inteles eu bine pb se face ceva in genu: Daca numarul liniile eliminate este mai mare decat cel al colonalelor care trebe eliminate elimin cele mai mici L linii ca suma,si dupia genereaz cu back p-entru colone si iau cel mai avantajos caz; daca nu,daca nr coloanelor e mai mare ca nr liniilor ce trebe eliminate intorc matricea si fac exact acelasi licru numai ca nr linnilor se schimba cu nr coloanelor e bine asa?? ? ms anticipat 
|
|
« Ultima modificare: Decembrie 29, 2007, 16:06:58 de către Ionescu Robert Marius »
|
Memorat
|
|
|
|
|