Cerință
La concursul Stelele Informaticii există participanți, numerotați .
După concurs, participanții sunt clasați conform unei permutări secrete a numerelor , unde reprezintă poziția participantului în clasamentul secret. Poziția corespunde primului loc. Álec Sdima cunoaște clasamentul secret, dar tu nu îl cunoști.
Poți propune un clasament , care trebuie să fie o permutare a numerelor , unde reprezintă poziția pe care o atribui participantului . Se numește underrating-ul participantului , în clasamentul propus, valoarea .
După ce vede clasamentul propus de tine, Álec îți comunică valoarea maximă a underrating-ului tuturor participanților, definită astfel:
Trebuie să determini clasamentul secret folosind cât mai puține propuneri.
Interacțiune
Programul nu va citi date de la intrare și nu va afișa nimic. Concurentul trebuie să implementeze funcția:
std::vector<int> find_ranking(int N)
- : numărul de participanți.
- Funcția trebuie să returneze clasamentul secret .
- Funcția este apelată o singură dată pentru fiecare test case.
- Funcția find_ranking() poate apela următoarea funcție:
int ask(std::vector<int> Q)
- trebuie să fie o permutare a numerelor .
- reprezintă poziția atribuită participantului .
- Funcția returnează valoarea:
- Această funcție poate fi apelată de cel mult de ori în fiecare test case.
Comportamentul grader-ului este . Aceasta înseamnă că grader-ul nu folosește o permutare fixă . În schimb, valorile returnate de funcția ask depind de apelurile anterioare ale acesteia.
Se garantează că grader-ul răspunde astfel încât, după fiecare apel, să existe cel puțin o permutare compatibilă cu toate răspunsurile oferite până în acel moment.
Restricții
- este o permutare a numerelor .
Precizări
- Dacă, în oricare dintre test case-uri, funcția ask este apelată cu un argument care nu respectă regulile precizate mai sus sau permutarea returnată de find_ranking este incorectă, punctajul obținut pentru acel test case va fi .
- Fie numărul maxim de apeluri ale funcției ask efectuate într-un test case. Definim, de asemenea, valoarea astfel:
Punctajul se calculează după cum urmează:
| Subtask | Scor | Restricții |
|---|---|---|
| 1 | 10 | |
| 2 |
În particular, pentru a obține 100 de puncte, soluția ta trebuie să efectueze cel mult de apeluri ale funcției ask în fiecare test case. Punctajul fiecărui subtask este rotunjit la două zecimale.
Exemplu
Să presupunem că , iar clasamentul secret este . Aceasta înseamnă că participantul ocupă primul loc, participantul ocupă locul al doilea, participantul ocupă locul al treilea, iar participantul ocupă locul al patrulea.
Să considerăm următorul apel:
ask({0, 1, 2, 3})
Pentru acest clasament, valorile sunt . Prin urmare, valoarea maximă a underrating-ului este , iar funcția returnează .
Să considerăm acum următorul apel:
ask({3, 0, 2, 1})
Valorile sunt . Prin urmare, funcția returnează .
În cele din urmă, dacă clasamentul propus coincide cu cel secret,
ask({2, 0, 3, 1})
toate valorile sunt , astfel că funcția returnează .
Sample grader
Sample grader-ul este . Clasamentul secret este fixat înainte de apelarea funcției find_ranking.
Sample grader-ul citește datele de intrare în următorul format:
Linia 1:
Linia 2:
Pentru fiecare apel al funcției ask(Q), sample grader-ul returnează valoarea:
Sample grader-ul afișează datele de ieșire în următorul format:
- Linia 1:
- Linia 2:
Aici reprezintă numărul de apeluri ale funcției ask, iar este permutarea returnată de find_ranking.