•astronomy
|
 |
« : Aprilie 05, 2009, 11:27:50 » |
|
Aici puteti discuta despre problema Bete2.
|
|
|
Memorat
|
|
|
|
•AnDrEwBoY
Strain
Karma: 4
Deconectat
Mesaje: 36
|
 |
« Răspunde #1 : Aprilie 05, 2009, 11:45:29 » |
|
O idee pentru a obtine 100 puncte?! 
|
|
|
Memorat
|
|
|
|
•Marius
|
 |
« Răspunde #2 : Aprilie 05, 2009, 16:03:24 » |
|
O idee pentru a obtine 100 puncte?!  Căutare binară.
|
|
|
Memorat
|
Faceti lucrurile simplu: pe cat de simplu posibil, dar nu mai simplu.
|
|
|
•Florian
|
 |
« Răspunde #3 : Aprilie 05, 2009, 16:25:43 » |
|
Se poate mai rapid de O(N^2 * logN ) ? 
|
|
|
Memorat
|
|
|
|
•AnDrEwBoY
Strain
Karma: 4
Deconectat
Mesaje: 36
|
 |
« Răspunde #4 : Aprilie 05, 2009, 17:00:56 » |
|
Multumesc! 
|
|
|
Memorat
|
|
|
|
•Marius
|
 |
« Răspunde #5 : Aprilie 05, 2009, 17:28:32 » |
|
Se poate mai rapid de O(N^2 * logN ) ?  O(N 2) cu hashuri.
|
|
|
Memorat
|
Faceti lucrurile simplu: pe cat de simplu posibil, dar nu mai simplu.
|
|
|
•CezarMocan
|
 |
« Răspunde #6 : Aprilie 06, 2009, 07:22:00 » |
|
Se poate O(N^2) si fara hashuri. Sortezi sirul si incerci sa obtii elementul i ca suma a 2 numere dinaintea lui din sirul sortat (asta se poate face cu 2 indici, unul porneste de la 1 spre i si celalalt de la i spre 1).
L.E. Nu's foarte sigur ca e corecta, dar testata cu brutul a mers pe vreo 2000 de teste...
|
|
« Ultima modificare: Aprilie 06, 2009, 07:43:25 de către Cezar Mocan »
|
Memorat
|
|
|
|
•AnDrEwBoY
Strain
Karma: 4
Deconectat
Mesaje: 36
|
 |
« Răspunde #7 : Aprilie 06, 2009, 09:47:16 » |
|
Si nu e O(N^3)? Ai O(N) pentru a lua fiecare numar in parte si O(N^2) pentru a verifica daca se poate forma cu 2 numere dinainte sa.Cu rezolvarea asta obtii 40 puncte.
|
|
|
Memorat
|
|
|
|
•CezarMocan
|
 |
« Răspunde #8 : Aprilie 06, 2009, 10:00:20 » |
|
Nu e O(N^3) pentru ca tu cu fiecare din cei 2 indici pargurgi portiunea 1..i pana se intalnesc (adica maxim i operatii in total).
|
|
|
Memorat
|
|
|
|
•AnDrEwBoY
Strain
Karma: 4
Deconectat
Mesaje: 36
|
 |
« Răspunde #9 : Aprilie 06, 2009, 11:12:45 » |
|
sort(0,n-1); for(i = n-1; i >= 0; i--) { t = nr[i]; for(j = i-1; j >= 0; j--) { for(k = 0; k < j; k++) if(nr[j]+nr[k]==t) { total++; break;} } } printf("%d",total);
Asa?Daca da,cu solutia aceasta vei lua doar 40 puncte.
|
|
|
Memorat
|
|
|
|
•Florian
|
 |
« Răspunde #10 : Aprilie 06, 2009, 11:19:54 » |
|
Nu asa.  sortare sir;
for(i=1;i<=n;++i) { p = 1; k=i; cat timp(p != k) { prelucrare in o(1); ++p; --k; } }
Ceva in genul asta. 
|
|
|
Memorat
|
|
|
|
•Bogdan_tmm
|
 |
« Răspunde #11 : Aprilie 07, 2009, 22:22:17 » |
|
sal... cum poti sa estimezi care e cea mai "eficienta" dimensiune pt un hash? DIM timp 984437 552ms 4342 208ms 2333 236ms 371 308ms din cate vad valoarea optima aici e de 3000-5000(banuiesc,ca nu mai bagai si altele)... Cum as putea aproxima asta in functie de datele de intrare(normal ca depinde si de teste,dar asa in mare...) 
|
|
|
Memorat
|
|
|
|
•rares192
Strain
Karma: 1
Deconectat
Mesaje: 12
|
 |
« Răspunde #12 : Aprilie 10, 2009, 22:58:35 » |
|
Am facut sortare rapida si m-am gandit sa aplic cautarea binara dar obtin doar 40 de puncte deoarece pe celelalte 6 teste obtin raspuns incorect. Ma ajutati va rog in depistarea greselii mele ? //quicksort x=0; for(i=2; i<n; i++) { for(k=i-1; k>=0; k--) if(a[k]+a[k]>=a[i]) {
st=0; dr=k;
int mij1=-3200;
while(st<dr) { mij=(st+dr)/2;
if(mij==mij1) break;
if(a[i]-a[k]==a[mij]) x++;
else if(a[mij]>a[i]-a[k]) dr=mij; else st=mij; mij1=mij;
} } }
Editat de admin: Foloseste tagul "code" cand postezi surse.
|
|
« Ultima modificare: Aprilie 10, 2009, 23:00:36 de către Andrei Grigorean »
|
Memorat
|
|
|
|
•codrin
Strain
Karma: 0
Deconectat
Mesaje: 11
|
 |
« Răspunde #13 : Aprilie 17, 2009, 17:01:49 » |
|
e ceva mai special la primele 4 teste?? ca iau WA si chiar nu stiu ce gresesc  sort(a,a+n);
for(i=0;i<n;i++) { p=1; k=i; while(p<k) { if(a[i]==(a[p]+a[k])) { contor++; p++; k--; if(p>=k) break; } else { if(a[i]>(a[p]+a[k])) p++; else if(a[i]<(a[p]+a[k])) k--; } } }
|
|
|
Memorat
|
|
|
|
•miculprogramator
|
 |
« Răspunde #14 : Iulie 30, 2009, 19:37:25 » |
|
Ma poate ajuta cineva cu ( , ) cautarea binara ?  for (i=0;i<N-1;i++) for (j=i+1;j<N;j++) { st=i; dr=j; while (st<=dr) { mij=(st+dr)/2; if (v[mij]==v[i]+v[j]) nr++; else if (v[mij]<=v[i]+v[j]) st=mij+1; else dr=mij; } }
|
|
|
Memorat
|
|
|
|
•sima_cotizo
|
 |
« Răspunde #15 : Iulie 30, 2009, 19:42:04 » |
|
Probabil iti ruleaza la infinit. In primul if din cautare eu as sparge while-ul cu un break... sau oricum, trebuie facuta acolo o operatie care sa iti modifice st sau dr pentru ca din momentul in care conditia este indeplinita, st si dr nu se mai modifica (deci nu se mai iese din while).
|
|
|
Memorat
|
|
|
|
•klamathix
|
 |
« Răspunde #16 : Iulie 30, 2009, 22:01:29 » |
|
else dr = mij - 1;  Mai bine fa-o functie :
bool Bsearch ( int val ) {
int mid , left = j , right = N; while ( left <= right ) { mid = ( left + right ) >> 1; if ( A[mid] == val ) return 1; else if ( A[mid] < val ) left = mid + 1; else right = mid - 1; }
return 0; }
Break-urile si chestii dinastea nu-s chiar semnele programarii ingrijite  Am un coleg care face ceva gen while ( 1 ) { if ( nu stiu ce ) break; } Nu recomand  Cel putin cand ai alternativa .
|
|
« Ultima modificare: Iulie 30, 2009, 22:07:03 de către Mihai Cristian Calancea »
|
Memorat
|
|
|
|
•popoiu.george
|
 |
« Răspunde #17 : Ianuarie 04, 2010, 23:26:49 » |
|
@miculprogramator De ce descrescator? Vad ca pornesti i de la 0, daca porneai de la N-1 sortai descrescator. Daca sortezi descrescator pentru v[ i ]+v[j] nu o sa gasesti nici un numar in intervalul (i,j) cara sa fie egal cu suma elementelor din capat. Incearca sa sortezi crescator, si pt i si j sa cauti in intervalul (j,N]. P.S : Este o mica greseala in enunt Acum si-a propus ss formeze grupuri distincte
|
|
|
Memorat
|
|
|
|
•vladtarniceru
|
 |
« Răspunde #18 : Iunie 01, 2010, 20:20:23 » |
|
am rezolvat problema de 100 de puncte folosind sortarea+cautarea binara, dar se poate lua un vector v[1.000.000.000]?
adica de tip short, ca nu stiu cum sa verific daca incape in memorie ...
|
|
|
Memorat
|
|
|
|
•pauldb
|
 |
« Răspunde #19 : Iunie 01, 2010, 20:32:19 » |
|
Socoteala memoriei se face asa:
(unsigned) char - 1 byte (unsigned) short - 2 bytes (unsigned) int/long/float - 4 bytes (unsigned) long long/double - 8 bytes
Socotesti pentru fiecare variabila declarata cat ocupa, insumezi valorile si convertesti rezultatul la kb sau Mb, in functie de unitatea in care este exprimata limita de memorie.
In cazul tau un vector de lungime 10^9 de short inseamna 2*10^9 bytes = (aprox.) 2*10^6 kb = (aprox.) 2*10^3 Mb. Tu ai la dispozitie 16384 kb < 2*10^6 kb => nu poti declara atata memorie. In general, in probleme de olimpiada, nu poti aloca memorie de ordinul miliardelor sau al sutelor de milioane.
|
|
|
Memorat
|
Am zis 
|
|
|
•Johny_Depp22
Strain
Karma: 3
Deconectat
Mesaje: 25
|
 |
« Răspunde #20 : Mai 27, 2013, 13:53:20 » |
|
Eu am rezolvat problema fara hasuri si fara cautare binara si se pare ca e mai rapid asa decat cu hashuri. Am facut pur si simplu 2 for-uri si verificam daca v[ i ]+v[ j ]<=1000000000( 1<=i<=n si i+1<=j<=n) si daca mai e un element cu acea valoare ( in vectorul v am sirul initial si am mai tinut un bitset in care lg[ x ]=1 daca in sirul initial am un element egal cu x ( 1<=x<= 1000 000 000 ) ).
|
|
|
Memorat
|
|
|
|
•ionut98
Strain
Karma: 2
Deconectat
Mesaje: 44
|
 |
« Răspunde #21 : Ianuarie 19, 2014, 16:12:27 » |
|
imi puteti da un exemplu ca nu imi dau seama unde gresesc 
|
|
|
Memorat
|
|
|
|
•Mihai22e
Client obisnuit

Karma: 20
Deconectat
Mesaje: 74
|
 |
« Răspunde #22 : Ianuarie 19, 2014, 16:29:46 » |
|
Pe testul programul tau afiseaza 0. Raspunsul corect e 1.
|
|
« Ultima modificare: Ianuarie 19, 2014, 19:36:18 de către Mihai Ionut Enache »
|
Memorat
|
|
|
|
•ionut98
Strain
Karma: 2
Deconectat
Mesaje: 44
|
 |
« Răspunde #23 : Februarie 08, 2014, 12:38:36 » |
|
vreo idee de optimizare (cod sursa #1101355)
|
|
|
Memorat
|
|
|
|
•N00bSh4d0w
Strain
Karma: 1
Deconectat
Mesaje: 1
|
 |
« Răspunde #24 : Martie 24, 2016, 15:53:21 » |
|
#include<iostream> #include<fstream> #include<algorithm> using namespace std; int v[3000]; int main() { ifstream in("bete2.in"); ofstream out("bete2.out"); int n,s,start=1,endd,m=0; in>>n; for(int i=1; i<=n; i++) { in>>v ; } int ct=0; sort(v+1,v+n+1); for(int j=1; j<=n; j++) { for(int k=j+1; k<=n; k++) { s=v[j]+v[k]; start=1; endd=n; while(start<=endd) { int mij=(start+endd)/2; if(v[mij]==s) { ct++; break; } else if(v[mij]<s) { start=mij+1; } else endd=mij-1; } } } out<<ct<<"\n"; } 
|
|
|
Memorat
|
|
|
|
|