Se dau procese care trebuie rulate pe un calculator. Există variabile care pot fi accesate de către aceste procese, numerotate de la la . Fiecare proces (unde ) accesează un interval continuu de variabile , iar timpul necesar de execuție al procesului este .
Cât timp un proces rulează, acesta își salvează pe stiva de execuție toate variabilele necesare, iar la finalizarea lui le elimină de pe stivă. Două procese pot rula în paralel dacă și numai dacă nu au nicio variabilă în comun. Sistemul de operare va planifica procesele astfel încât timpul total necesar executării tuturor să fie minim. O astfel de planificare, care atinge timpul minim posibil, poartă numele de scenariu optim de execuție.
O variabilă este considerată critică dacă există cel puțin un scenariu optim de execuție în care aceasta petrece cel mai mult timp pe stivă dintre toate variabilele (într-un scenariu pot exista mai multe variabile critice simultan).
Cerințe
Dat fiind un număr , reprezentând tipul cerinței:
Cerința 1. Să se determine timpul minim necesar pentru a rula toate cele procese date.
Cerința 2. Pentru fiecare proces (de la la ), presupunem că îl eliminăm din sistem. Fie timpul minim necesar pentru a rula restul de procese. Să se calculeze și să se afișeze suma tuturor valorilor , pentru de la la .
Cerința 3. Pentru fiecare proces (de la la ), presupunem că îl eliminăm din sistem. Fie numărul de variabile critice în contextul celorlalte procese, conform definiției anterioare. Să se calculeze și să se afișeze suma tuturor valorilor , pentru de la la .
Generarea datelor
Pentru a evita citirea unui volum foarte mare de date, doar primele procese vor fi citite din fișierul de intrare sub forma unor triplete , pentru de la la . Pentru cerința , se garantează că , deci nu este necesară nicio generare suplimentară.
Pentru cerințele , se citesc doar primele procese. Restul proceselor, de la până la , se vor genera în programul vostru folosind următorul algoritm:
pentru i ← K + 1, N execută
l_i ← ((l_{i-1} xor (a · l_{i-K})) mod M) + 1
len_i ← ((len_{i-1} xor (b · len_{i-K})) mod M) + 1
t_i ← ((t_{i-1} xor (c · t_{i-K})) mod T) + 1
sfârșit pentru
Notă: Operația logică pe biți XOR/"SAU exclusiv" este reprezentată în C/C++ prin operatorul ^.
Pentru toate procesele (indiferent dacă au fost citite sau generate), capătul drept al intervalului accesat de procesul se va calcula după formula:
Date de intrare
Fișierul de intrare calculator.in conține pe prima linie numerele , , , , , urmate de constantele , și , separate prin câte un singur spațiu. Pe următoarele linii se vor afla câte trei numere: , și , care reprezintă informațiile pentru primele procese (unde ).
Date de ieșire
Fișierul de ieșire calculator.out va conține pe o singură linie un singur număr natural, reprezentând răspunsul calculat conform cerinței .
Restricții și precizări
- și , pentru orice
- Atenție: Calculele intermediare din algoritmul de generare a datelor pot depăși capacitatea de reprezentare a tipurilor întregi pe 32 de biți (de exemplu
intsauunsigned int). Se recomandă și utilizarea tipurilor de date pe 64 de biți (de exemplulong long) unde este cazul.
| # | Punctaj | Restricții |
|---|---|---|
| 1 | 15 | , , |
| 2 | 15 | , , |
| 3 | 5 | , , |
| 4 | 5 | , , |
| 5 | 10 | , , |
| 6 | 5 | , |
| 7 | 10 | |
| 8 | 5 | , , |
| 9 | 5 | , , |
| 10 | 10 | , , |
| 11 | 5 | , |
| 12 | 10 |
Exemplul 1
calculator.in
1 3 5 3 10 1 1 1
1 3 5
3 3 4
4 2 2
calculator.out
9
Explicație
Pentru toate exemplele, avem procese și variabile. Procesele sunt:
- Procesul 1: , , timp . Intervalul este .
- Procesul 2: , , timp . Intervalul este .
- Procesul 3: , , timp . Intervalul este .
Analizând interacțiunea dintre procese se observă că:
- Procesul 1 are variabile comune atât cu Procesul 2 (variabila ), cât și cu Procesul 3 (variabila ). Prin urmare, nu poate rula în paralel cu sau .
- Procesul 2 și Procesul 3 nu au nicio variabilă în comun, deci pot rula simultan.
Pentru primul exemplu (): Într-un scenariu optim, rulează singur ( unități de timp), iar și rulează în paralel. Timpul necesar pentru grupul este . Timpul total minim este .
Exemplul 2
calculator.in
2 3 5 3 10 1 1 1
1 3 5
3 3 4
4 2 2
calculator.out
20
Explicație
Pentru al doilea exemplu ():
- Eliminăm : Rămân și , care rulează în paralel. .
- Eliminăm : Rămân și . Deoarece au variabila în comun, trebuie să ruleze secvențial. .
- Eliminăm : Rămân și . Au variabila în comun, deci rulează secvențial. .
Suma rezultatelor este .
Exemplul 3
calculator.in
3 3 5 3 10 1 1 1
1 3 5
3 3 4
4 2 2
calculator.out
3
Explicație
Pentru al treilea exemplu ():
- Fără : Timpul optim este . Variabila stă pe stivă timp de unități (cât rulează ), iar variabila stă pe stivă unități (cât rulează ). Singura variabilă critică este variabila . .
- Fără : Timpul optim este . Procesele și rulează pe rând. Variabila stă pe stivă în total unități, fiind singura care atinge acest timp maxim. .
- Fără : Timpul optim este . Procesele și rulează pe rând. Variabila stă pe stivă în total unități, fiind singura variabilă critică. .
Suma valorilor este .