Pentru a fi cât mai eficienți în blocarea atacurilor echipei adverse, antrenorul și-a instruit cei jucători să se regrupeze într-o zonă de teren, de lungime exact . Considerăm că terenul de joc este axa , iar poziția curentă a fiecărui jucător este un număr natural. Considerăm, în plus, că jucătorii sunt numerotați de la la , în ordinea crescătoare a pozițiilor lor pe axa .
Costul deplasării unui jucător () de la poziția sa la o poziție este . Costul regrupării este suma costurilor deplasărilor tuturor jucătorilor. La finalul regrupării, distanța dintre cel mai din stânga și cel mai din dreapta jucător din zonă trebuie să fie exact .
Cerință
Să se determine costul minim posibil al unei regrupări.
Interacțiune
Programul nu va citi date de la intrare și nu va face afișări. Concurentul trebuie să implementeze funcția:
long long solve(int N, int L);
Funcția primește ca parametri valorile lui și și trebuie să returneze costul total minim cu care toți cei jucători pot fi aduși în aceeași zonă compactă de lungime exact .
Funcția solve() poate apela următoarele funcții:
int getX(int i)- returnează poziția la care se află inițial jucătorulint getNumber(int x1, int x2);returnează numărul de jucători care au poziția cuprinsă în intervalul de valorilong long getSumX(int x1, int x2);returnează suma pozițiilor jucătorilor care au poziția cuprinsă în intervalul de valori
Concurentul va trebui să trimită un fișier cu structura:
#include "problem.h"
long long solve(int N, int L) {
...
}
Restricții și precizări
- , pentru
- Pozițiile inițiale ale jucătorilor sunt distincte, dar în zona de lungime este permis să ajungă doi sau mai mulți jucători în aceeași poziție.
| # | Punctaj | Restricții |
|---|---|---|
| 1 | 8 | , |
| 2 | 23 | |
| 3 | 69 | Fără restricții suplimentare. |
Modalitate de punctare
Notăm cu numărul total cumulat de apeluri ale funcțiilor de mai sus.
- dacă se obține întreg punctajul pentru acel test;
- altfel dacă se obține din punctajul alocat acelui test;
- altfel dacă se obține din punctajul alocat acelui test;
- altfel dacă se obține din punctajul alocat acelui test;
- altfel, punctajul acordat pe acel test va fi .
Testare locală
Pentru testare locală puteți folosi următoarele fișiere listate la atașamente:
grader.cppproblem.h
Exemplu
Presupunem că , , , și . Atunci un comportament posibil al soluției este:
getX(1);va returna ;getX(2);va returna ;getX(3);va returna ;- Una dintre regrupările optime este în fereastra . Jucătorul se deplasează la poziția (cost ), jucătorul stă pe loc (cost ), iar jucătorul se deplasează la poziția (cost ).
- Costul regrupării este , deci funcția va returna .
O versiune de program ar putea fi:
#include "problem.h"
long long solve(int N, int L) {
int x1 = getX(1); // va returna 2
int x2 = getX(2); // va returna 7
int x3 = getX(3); // va returna 13
long long res = /* calculele voastre aici */;
return res;
}