Fie un șir de N numere întregi, indexat de la 1. Numim al doilea maxim al șirului cel mai mare număr din șir, cu excepția maximului. Pentru a afla maximul și al doilea maxim, veți efectua comparări între elementele șirului.
Având la dispoziție numai comparări, aflați pozițiile pe care le ocupă maximul și al doilea maxim. Prin s-a notat partea întreagă superioară a lui „logaritm în baza 2 din N".
Cerință
Aflați cele două numere, efectuând cel mult comparări. Pentru a putea efectua comparările, vă este pusă la dispoziție funcția:
int compare(int i, int j)
care compară numarul de pe poziția i cu cel de pe poziția j și vă returnează 1, dacă elementul aflat pe poziția i este mai mare sau egal cu cel de pe poziția j, respectiv -1, în caz contrar. Dacă i sau j nu este un indice valid, atunci funcția va returna 0.
Programul trebuie să implementeze funcția
std::pair<int, int> solve (int N)
unde N are semnificația din enunț. Funcția va returna cele două valori cerute.
Restrictii şi precizări
2 ≤ N ≤ 100 000- Fișierul
compare.htrebuie inclus - Problema a fost modificată
- Pentru
20de puncte puteți folosi un număr maxim de comparări - Pentru alte
80de puncte puteți folosi un număr maxim de comparări
Exemplu 1
Dacă șirul considerat este (5, 3, 4), atunci o executare corectă a programului este următoarea:
compare(1, 2) care returnează 1;
compare(1, 3) care returnează 1;
compare(2, 3) care returnează –1;
În acest moment ați epuizat numărul de comparări permise (3+2-2=3 comparări) și funcția va returna numerele 1 si 3, reprezentând pozițiile pe care se află maximul șirului (5), respectiv al doilea maxim (4).
Exemplu 2
Dacă șirul considerat este (5, 7, 7), o executare corectă a programului este următoarea:
compare(1, 2) care returnează -1;
compare(2, 3) care returnează 1;
compare(1, 3) care returnează –1;
În acest moment ați epuizat numărul de comparări permise (3+2-2=3 comparări) și funcția va returna numerele 2 si 3, reprezentând pozițiile pe care se află maximul șirului (7), respectiv al doilea maxim (7).
Observație:
Pentru acest exemplu, mai există o soluție corectă, cea în care considerați maximul (7) pe poziția 3 și al doilea maxim (7) pe poziția 2.