Pagini: [1] 2   În jos
  Imprimă  
Ajutor Subiect: 841 Bete2  (Citit de 9207 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
astronomy
Nu mai tace
*****

Karma: 204
Deconectat Deconectat

Mesaje: 492



Vezi Profilul
« : Aprilie 05, 2009, 11:27:50 »

Aici puteti discuta despre problema Bete2.
Memorat
AnDrEwBoY
Strain
*

Karma: 4
Deconectat Deconectat

Mesaje: 36



Vezi Profilul
« Răspunde #1 : Aprilie 05, 2009, 11:45:29 »

O idee pentru a obtine 100 puncte?! d'oh!
Memorat
Marius
Nu mai tace
*****

Karma: 154
Deconectat Deconectat

Mesaje: 572



Vezi Profilul
« Răspunde #2 : Aprilie 05, 2009, 16:03:24 »

O idee pentru a obtine 100 puncte?! d'oh!

Căutare binară.
Memorat

Faceti lucrurile simplu: pe cat de simplu posibil, dar nu mai simplu.
Florian
Nu mai tace
*****

Karma: 125
Deconectat Deconectat

Mesaje: 832



Vezi Profilul
« Răspunde #3 : Aprilie 05, 2009, 16:25:43 »

Se poate mai rapid de O(N^2 * logN ) ?   Think
Memorat
AnDrEwBoY
Strain
*

Karma: 4
Deconectat Deconectat

Mesaje: 36



Vezi Profilul
« Răspunde #4 : Aprilie 05, 2009, 17:00:56 »

Multumesc! Applause
Memorat
Marius
Nu mai tace
*****

Karma: 154
Deconectat Deconectat

Mesaje: 572



Vezi Profilul
« Răspunde #5 : Aprilie 05, 2009, 17:28:32 »

Se poate mai rapid de O(N^2 * logN ) ?   Think

O(N2) cu hashuri.
Memorat

Faceti lucrurile simplu: pe cat de simplu posibil, dar nu mai simplu.
CezarMocan
Nu mai tace
*****

Karma: 252
Deconectat Deconectat

Mesaje: 567



Vezi Profilul
« 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 Deconectat

Mesaje: 36



Vezi Profilul
« 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
Nu mai tace
*****

Karma: 252
Deconectat Deconectat

Mesaje: 567



Vezi Profilul
« 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 Deconectat

Mesaje: 36



Vezi Profilul
« Răspunde #9 : Aprilie 06, 2009, 11:12:45 »

Cod:
    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
Nu mai tace
*****

Karma: 125
Deconectat Deconectat

Mesaje: 832



Vezi Profilul
« Răspunde #10 : Aprilie 06, 2009, 11:19:54 »

Nu asa.  Smile
Citat

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.  Smile
Memorat
Bogdan_tmm
De-al casei
***

Karma: 4
Deconectat Deconectat

Mesaje: 122



Vezi Profilul
« 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...)Huh Think
Memorat
rares192
Strain


Karma: 1
Deconectat Deconectat

Mesaje: 12



Vezi Profilul
« 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 
Cod:
 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 Deconectat

Mesaje: 11



Vezi Profilul
« 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  Read This!

Cod:
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
Nu mai tace
*****

Karma: 65
Deconectat Deconectat

Mesaje: 306



Vezi Profilul
« Răspunde #14 : Iulie 30, 2009, 19:37:25 »

Ma poate ajuta cineva cu ( , ) cautarea binara ?  Confused

Cod:
    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
Nu mai tace
*****

Karma: 219
Deconectat Deconectat

Mesaje: 596



Vezi Profilul
« 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
Echipa infoarena
Nu mai tace
*****

Karma: 733
Deconectat Deconectat

Mesaje: 1.216



Vezi Profilul
« Răspunde #16 : Iulie 30, 2009, 22:01:29 »


Cod:
    
                      else dr=mij;
     

else dr = mij - 1;   Smile

Mai bine fa-o functie :

Cod:
 

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  Very Happy Am un coleg care face ceva gen while ( 1 ) { if ( nu stiu ce )  break; } Nu recomand Rolling Eyes Cel putin cand ai alternativa .
« Ultima modificare: Iulie 30, 2009, 22:07:03 de către Mihai Cristian Calancea » Memorat
popoiu.george
Vorbaret
****

Karma: 19
Deconectat Deconectat

Mesaje: 162



Vezi Profilul
« 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
Citat
Acum si-a propus ss formeze grupuri distincte
Memorat
vladtarniceru
De-al casei
***

Karma: 81
Deconectat Deconectat

Mesaje: 145



Vezi Profilul
« 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
Nu mai tace
*****

Karma: 821
Deconectat Deconectat

Mesaje: 1.901



Vezi Profilul
« 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 Mr. Green
Johny_Depp22
Strain
*

Karma: 3
Deconectat Deconectat

Mesaje: 25



Vezi Profilul
« 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 Deconectat

Mesaje: 44



Vezi Profilul
« Răspunde #21 : Ianuarie 19, 2014, 16:12:27 »

imi puteti da un exemplu ca nu imi dau seama unde gresesc  Smile
Memorat
Mihai22e
Client obisnuit
**

Karma: 20
Deconectat Deconectat

Mesaje: 74



Vezi Profilul
« Răspunde #22 : Ianuarie 19, 2014, 16:29:46 »

Pe testul
Cod:
3
1
2
3
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 Deconectat

Mesaje: 44



Vezi Profilul
« Răspunde #23 : Februarie 08, 2014, 12:38:36 »

vreo idee de optimizare (cod sursa #1101355)
Memorat
N00bSh4d0w
Strain


Karma: 1
Deconectat Deconectat

Mesaje: 1



Vezi Profilul
« 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";
} Smile
Memorat
Pagini: [1] 2   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines