Afişează mesaje
|
Pagini: [1]
|
5
|
infoarena - concursuri, probleme, evaluator, articole / CCEX 2009 / Răspuns: 1234
|
: Iunie 06, 2009, 12:26:16
|
Nu toata lumea putea folosi acel program.
Help-ul doc... dar oricum ai dreptate, pentru ca nu erai obligat sa iei acel program... cel mai bine ar fi fost sa fie specificat in cerita ca font,font-size,inclinarea raman neschimbate. Sau sa nu fi ramas neschimbate sa fie problema mai grea
|
|
|
6
|
infoarena - concursuri, probleme, evaluator, articole / CCEX 2009 / Răspuns: 1234
|
: Iunie 06, 2009, 12:11:00
|
Cifrele vor avea tot timpul aceeasi dimensiune?
DA Pai prin asta practic s-a dar rezolvarea problemei... mi se parea mai ok daca nu se raspundea la intrebare. Cine a citit help-ul de la acel program trebuia sa se prinda singur de chestia asta, tinand cont ca era acelasi font si font-size pentru orice input...
|
|
|
8
|
infoarena - concursuri, probleme, evaluator, articole / Teme / Răspuns: Niste indicatii
|
: Martie 19, 2009, 17:06:22
|
Da ai dreptate nu am fost destul de atent cand am citit programul, my bad Ma refeream la solutia cu cautare binara descrisa mai sus tot de mine (deci tot nu ai citit topicul cu atentie) Inca l-am citit tu ai zis asa: Astfel am ajuns la o complexitate de log2(MAX) * log3(MAX) * log5(MAX), unde MAX este o valoare mai mare decat al 1500-lea nr de forma 2^x * 3^y * 5^z, cred ca 2 miliarde ar fi de ajuns. log2(MAX) * log3(MAX) * log5(MAX),MAX=2.000.000.000 > n. La un calcul rapid ar iesi in jur de 8000. Adica mai mare chiar decat N logN Scuza-ma daca gresesc, logaritmii nu mi-au placut niciodata
|
|
|
9
|
infoarena - concursuri, probleme, evaluator, articole / Teme / Răspuns: Niste indicatii
|
: Martie 19, 2009, 13:35:46
|
Citeste si tu mai atent ce s-a discutat inainte. In primul rand s-a spus deja o solutie mai rapida de o(n). In al doilea rand solutia ta e gresita. E gresita din acelasi motiv pe care l-am zis eu mai sus cand explicam de ce aceasta problema nu e un caz particular al problemei numar2.
Am citit discutia destul de bine inainte sa postez. Insa tu nu mi-ai citit programul la fel de bine. Si la care solutie te referi ca e mai rapida decat O(n)? cea cu heap? v[1]=poz[2]=poz[3]=poz[5]=1; pt i->2,n executa v[i]=minim(v[poz[2]]*2,v[poz[3]]]*3,v[poz[5]]*5); if(v[poz[2]]*2==v[i])poz[2]++; if(v[poz[3]]*3==v[i])poz[3]++; if(v[poz[5]]*5==v[i])poz[5]++; sfarsit;
Sa il explic: initial p2=p3=p5=v[1]=1; v[2]=minim(1*2,1*3,1*5)=2; p2=2; v[3]=minim(2*2,1*3,1*5)=3;p3=2; v[4]=minim(2*2,2*3,1*5)=4;p2=3; v[5]=minim(3*2,2*3,1*5)=5;p5=2; v[6]=minim(3*2,2*3,2*5)=6;p2=4;p3=3; v[7]=minim(4*2,3*3,2*5)=8;p2=5; v[8]=minim(5*2,3*3,2*5)=9;p3=4; v[9]=minim(5*2,4*3,2*5)=10;p2=6;p5=3; v[10]=minim(6*2,4*3,3*5)=12;p2=7;p3=5; v[11]=minim(7*2,5*3,3*5)=15;p3=6;p5=4; etc... de asemenea am m-as putea baza decat pe p2 si p3 si la p5 sa adaug decat puterile lui 5, dar n-are rost pt ca n e mic. PS: tinand cont ca esti moderator ar trebui sa fi mai prietenos :p
|
|
|
10
|
Comunitate - feedback, proiecte si distractie / Off topic / Răspuns: Răspuns: OJI 2009
|
: Martie 19, 2009, 11:53:04
|
La problema Cerc mergea si greedy si putea fi rezolvata in O(N log N) astfel. Pentru fiecare dreapta, cercul i, aflat la distanta Di = sqrt(Xi^2 + Yi^2) de origine, ocupa intervalul (Di - Ri, Di + Ri). Pentru a determina numarul de cercuri exterioare 2 cate 2 este corect sa alegi la fiecare pas intervalul cu capatul din dreapta cel mai mic si care nu se intersecteaza cu nici un alt interval deja ales. Poti determina usor numarul, sortand intervalele crescator dupa capatul al doilea.
Adica precum problema "standard" programarea spectacolelor, nu?
|
|
|
11
|
infoarena - concursuri, probleme, evaluator, articole / Teme / Răspuns: Niste indicatii
|
: Martie 19, 2009, 11:33:36
|
problema 1 se poate rezolva in O(n). completam un vector 'v' de la 1->n unde v[ i ] reprezinta al i-lea numar din sirul dorit. v[1]=poz[2]=poz[3]=poz[5]=1; pt i->2,n executa v[i]=minim(v[poz[2]]*2,v[poz[3]]]*3,v[poz[5]]*5); if(v[poz[2]]*2==v[i])poz[2]++; if(v[poz[3]]*3==v[i])poz[3]++; if(v[poz[5]]*5==v[i])poz[5]++; sfarsit;
problema se poate generaliza pentru m numere, nu doar 2,3,5.
|
|
|
17
|
infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 002 Jocul Flip
|
: Februarie 24, 2009, 19:29:31
|
100. da, de la matrice era. Nu ma gandisem la asta. Merci mult. Nu fac cu unsir de nr de la 0 la 2^n-1 pentru ca stiu de la permutari ca e mai performat cu vector deoarece faci mai putine operatii la adaugare de unitate decat la conversie in baza 2. Am comparat timpii de la testul meu cu alte teste si la majoritatea am iesit in avantaj. Probabil daca mai lucrez la el o sa obtin timpi mai buni. dar nu are rost )
|
|
|
18
|
infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 002 Jocul Flip
|
: Februarie 24, 2009, 16:31:44
|
Ok. Ideea algoritmului:
Iau toate posibilitatie de comutare a linilor. In loc sa folosesc un backtracking, folosesc un vector sol de n elemente (n nr de linii). Vectorul sol este initial 0,0,0... Apoi, pentru a genera toate posibilitatile consider vectorul sol drept un numar un baza 2. Si la fiecare pas adaug 1 in sol[0] (consider ca numarul este scris invers). La fiecare solutie (adica dupa ce am adaugat 1) iau modul de suma pe fiecare coloana si o adaug la max2(suma matricei pentru sol respectiva). Iau modul pentru ca in cazul in care suma este negativa eu as avea posibilitatea sa comut acea coloana, pentru ca suma sa fie maxima. De fiecare data verific max2 cu max(suma maxima generala) si modific max(dupa caz).
Cam asta este explicatia algoritmului...
|
|
|
19
|
infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 002 Jocul Flip
|
: Februarie 24, 2009, 14:57:40
|
Cod: #include<stdio.h> long mat[16][16]; long max =-1099999999; int sol[16]; int n,m; void citire() { freopen("flip.in","r",stdin); scanf("%d",&n); scanf("%d",&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%ld",&mat[i][j]); }
long suma_col(int col) { long s=0;int x; for(int i=1;i<=n;i++) { if(sol[i])x=-1; else x=1; s+=mat[i][col]*x; } if(s>0)return s; else return -s; }
void do_max() { int i; long max2=0; for(i=1;i<=m;i++) max2+=suma_col(i); if(max2>max)max=max2; } int add2sol() { int poz=1; while(sol[poz]!=0) sol[poz++]=0; sol[poz]=1; //printf("poz: %d ; ",poz); return poz<=n; } void tip_sol() { for(int i=1;i<=n;i++)printf("%d ",sol[i]); printf("\n"); } int main() { freopen("flip.out","w",stdout); citire(); do { //tip_sol(); do_max(); } while(add2sol()); printf("%ld",max); return 0; } Pct: Test Timp executie Memorie folosita Mesaj Punctaj/test 1 0ms 8kb Ok! 10 2 0ms 8kb Ok! 10 3 0ms 8kb Ok! 10 4 8ms 204kb Raspuns gresit 0 5 4ms 8kb Ok! 10 6 56ms 208kb Ok! 10 7 32ms 204kb Ok! 10 8 604ms 184kb Time limit exceeded. 0 9 0ms 8kb Raspuns gresit 0 10 548ms 176kb Time limit exceeded. 0 Punctaj total 60 Ideea e ca algoritmul meu are o complexitate mai mica decat cel cu backtracking dar nu reusesc sa iau decat 60pct... L-am verificat, si reverificat, si tot asa pana m-am dat batut... Va rog daca vedeti unde ar putea gresi sa-mi spuneti Merci, Sorin
|
|
|
|