Fişierul intrare/ieşire:mole.in, mole.outSursăLot Seniori Deva, 2019, baraj 1
AutorAndrei Constantinescu, Costin OncescuAdăugată deTincaMateiTinca Matei TincaMatei
Timp execuţie pe test0.125 secLimită de memorie524288 kbytes
Scorul tăuN/ADificultateN/A

Vezi solutiile trimise | Statistici

Mole

Pentru a nu mai întâmpina probleme logistice, comisia lotului de pregătire de anul acesta a decis să stabilească clasamentul celor N participanţi independent de punctajele obţinute la cele două probe de concurs.

Din fericire pentru tine, însă, există o cârtiţă (eng. mole), a cărui nume nu îl vom menţiona, care ţi-a divulgat acest secret, astfel că ai aflat intenţiile malefice ale comisiei. Mai mult, persoana este dispusă să te ajute să descoperi clasamentul. Totuşi, pentru a nu fi descoperiţi, aţi hotărât să comunicaţi astfel:

  1. Vei întreba cârtiţa un posibil clasament p1, p2, ... , pN;
  2. Cârtiţa va porni de la clasamentul întrebat de tine şi îl va transforma în clasamentul comisiei, interschimbând pe rând locurile a câte doi participanţi. Să presupunem că numărul minim de schimbări este x. Cârtiţa îţi va răspunde întrebării cu x.

Interacţiune

Această problema este interactivă. Vi se pune la dispoziţie funcţia cu următorul cu următorul antet:

int ask(std::vector<int> guess);

Atenţie! Această funcţie nu trebuie implementată de către voi. Graderul va implementa această funcţie. Argumentul guess reprezintă clasamentul de care veţi întreba. Funcţia va returna numărul minim de interschimbări x, descris mai sus. Argumentul guess trebuie să reprezinte o permutare validă a numerelor din intervalul [1, N]. În caz contrar, graderul va termina programul din execuţie şi va nota testul ca fiind incorect.

Detalii de implementare

Veţi implementa funcţia cu următorul antet:

std::vector<int> find_standings(int N);

Funcţia find_standings va fi apelată o dată. N este numărul de concurenţi.

Funcţia trebuie să returneze, în final, clasamentul căutat. Pentru aceasta, din cadrul ei se poate apela de un număr limitat de ori funcţia de interacţiune ask (vezi secţiunea Punctare).

Din cauza limitărilor impuse de Infoarena şi pentru a reproduce condiţiile din concurs, recomandăm să foloseşti template-urile de aici .

Punctare

SubtaskPunctajConstrângeri
1
7 puncte
3 ≤ N ≤ 6
Funcţia ask poate fi apelată de cel mult 1.000 ori.
2
14 puncte
3 ≤ N ≤ 100
Funcţia ask poate fi apelată de cel mult 5.000 ori.
3
40 puncte
3 ≤ N ≤ 200
Funcţia ask poate fi apelată de cel mult 4.000 ori.
4
16 puncte
3 ≤ N ≤ 200
Funcţia ask poate fi apelată de cel mult 2.700 ori.
5
15 puncte
3 ≤ N ≤ 200
Funcţia ask poate fi apelată de cel mult 1.800 ori.
6
8 puncte
3 ≤ N ≤ 200
Funcţia ask poate fi apelată de cel mult 1.600 ori.

Exemplu

IntrareIeşire
find_standings(3)
-
-
ask({1, 2, 3})
2
-
-
ask({1, 3, 2})
1
-
-
ask({2, 3, 1})
0
-
-
return {2, 3, 1}
OK
-
Trebuie sa te autentifici pentru a trimite solutii. Click aici

Cum se trimit solutii?