Nou problema divide et impera

Embed Size (px)

Citation preview

  • 8/16/2019 Nou problema divide et impera

    1/4

    Nume: Popa Maria-Mihaela

    Grupa:252

    An: II

    18. Să se determine simultan, prin metoda i!ide et

    Impera ma"imul #i minimul dintr-un ta$lou de n numere

     %ntre&i.

    Pre'i(ari 'u pri!ire la enunt: Consider ca acest enunt este

    foarte clar si se intelege foarte usor cerinta!

    )"pli'area modului de lu'ru:

    Presupunem ca sirul are mai mult de doua numere, deci nu este o problemaelementara ( care sa admita o rezolvare imediata ) si prin urmare suntem nevoiti saspargem problema in doua subprobleme, impartind sirul dat in doua subsiruri. Secauta valoarea maxima a ecarui subsir dupa care se alege maximul dintre celedoua valori. Idem, se cauta valoarea minima din ecare subsir dupa care se alegeminimul dintre cele doua valori. ie i,, rangurile de inceput, respectiv de sfarsit aleunui subsir. "aca diferenta intre i si este mai mare ca # ( subsirul are mai mult de

    doua elemente ) subproblema nu este inca elementara si se continua divizarea insubprobleme, in care noile ranguri sunt ( i, (i$)%& ), respectiv ( ( i $ )%& $ # , )unde, evident , ( i $ )%& este rangul termenului din milocul sirului.

    "aca diferenta dintre i si este mai mica decat &, problema este elementara sise rezolva imediat

    Combinam apoi rezultatele partiale, retinand intotdeauna valoarea maxima sipe cea minima dintre cele doua.

    Problema va rezolvata in mod recursiv'

    #include

    int x[100],n;

    void citire(int p,int q)

    int m;

    i!(p""q) cin>>x[p];

     else m"(pq)$%;

      citire(p,m);

  • 8/16/2019 Nou problema divide et impera

    2/4

      citire(m1,q); &

    &

    void maxmin (int p,int q,int 'min,int 'max)

    int m,min1,min%,max1,max%;

    i!(p""q) min"x[p];

      max"x[p];

      else m"(pq)$%;

      minmax(p,m,min1,max1);

      minmax(m1,q,min%,max%);

      i!(min1max%) max"max1;

      else max"max%; &

    &

    void main()

    int max,min;

    cin>>n;

    citire(1,n);

    minmax(1,n,min,max)

    coutmin *max+

    void minmax(int v[], int s, int d, int 'minn, int 'maxx)

      i!(s""d) minn"maxx"v[s];

      else

     

      int a,,x,;

      minmax(v,s,(sd)$%,a,x);

      minmax(v,(sd)$%1,d,,);

      i!(a) maxx"x;

      else maxx";

      &

    Problema asemanatoare: 

    Se cite-te un vector cu n componente numere

     ntregi (numerele se presupun ordonate cresc/tor) -i o valoare ntreag/ (0nr0). S/ se

    decid/ dac/ nr se g/se-te sau nu printre numerele citite, iar n caz armativ s/ se

    tip/reasc/ indicele componentei care con1ine aceast/ valoare.

    2 rezolvare n care nr se compar/ pe r3nd cu toate cele n componente reperzint/ o

    pierdere de performan1/ (nu exploateaz/ faptul c/ cele n valori sunt n secven1/

    cresc/toare). 4lgoritmul care va propus este optim -i se poate spune c/ face parte

    dintre algoritmii 0clasici0.

  • 8/16/2019 Nou problema divide et impera

    3/4

    #include

     usin* namespace std;

     int v[10],n;

     

    int min(int i, int +)

     

      int a, , m;

      i! (i""+) return v[i];

      else

     

      m " (i+)$%;

      a " min(i, m);

      " min(m1, +);

      i! (a>v[i];

      &

      cout

  • 8/16/2019 Nou problema divide et impera

    4/4

    5 Nota 1/: - da'a pro&ramul asea(a in mod 'orre't

    re(ultatul si nu are ni'io eroare