Discul dur (hard disk) este un dispozitiv utilizat pentru stocarea datelor. Stocarea se face pe o suprafață magnetică dispusă pe platane rotunde metalice. Pe un platan, datele sunt organizate în piste și sectoare, iar zona aflată la intersecția dintre o pistă și un sector poartă denumirea de cluster.
Un cluster poate avea două stări: liber, dacă nu conține date, sau ocupat, atunci când conține date.
Un platan se numește defragmentat dacă toți clusterii ocupați de pe fiecare pistă sunt așezați în ordine consecutivă. Defragmentarea se realizează prin mutarea unor clusteri ocupați și are rolul de a micșora timpul de acces la date. Mutarea unui cluster reprezintă transferul datelor de la un cluster ocupat către un cluster liber de pe aceeași pistă.
Cerință
Cunoscând numărul de piste P
și de sectoare S
al unui platan, numărul și poziția clusterilor ocupați, să se scrie un program care determină :
1. numărul de piste care au toți clusterii liberi;
2. numărul minim de mutări de clusteri, pentru fiecare pistă în parte, astfel încât platanul să devină defragmentat.
Date de intrare
Fișierul de intrare defrag.in
conține pe prima linie numărul natural V
a cărui valoare poate fi doar 1
sau 2
.
Pe a doua linie a fișierului de intrare se găsesc două numere naturale P
și S
, separate printr-un spaţiu, cu semnificaţia din enunţ.
A treia linie conţine un număr natural C
reprezentând numărul total de clusteri ocupați de pe platan, iar pe fiecare din următoarele C
linii se găsește câte o pereche de valori p
i
şi s
i
, 1 ≤ i ≤ C
, separate printr-un spaţiu, reprezentând pista, respectiv sectorul unde se află fiecare cluster ocupat.
Date de ieșire
Fișierul de ieșire este defrag.out
.
Dacă valoarea lui V
este 1
atunci fişierul de ieşire va conţine pe prima linie un număr natural ce reprezintă numărul de piste care au toți clusterii liberi.
Dacă valoarea lui V
este 2
atunci fişierul de ieşire va conține pe prima linie P
numere naturale notate M
i
, 1 ≤ i ≤ P
, separate prin câte un singur spațiu, unde M
i
reprezintă numărul minim de mutări de clusteri, dintre cei aflați pe pista i
, astfel încât pe pista i
clusterii ocupați să se găsească într-o ordine consecutivă.
Restricții și precizări
1 ≤ P ≤ 100
1 ≤ S ≤ 360
1 ≤ C ≤ P*S
- pistele sunt numerotate de la
1
laP
începând cu pista exterioară; - sectoarele sunt numerotate de la
1
laS
în sensul acelor de ceasornic începând cu sectorul1
; - dacă o pistă are toți clusterii liberi, atunci valoarea cerută la a doua cerință este
0
;
20% din teste vor avea valoareaV = 1
, iar 80% din teste vor avea valoareaV = 2
.
Exemplul 1
defrag.in
1 4 8 10 1 1 1 3 1 5 1 7 4 5 4 1 4 6 4 8 2 2 2 4
defrag.out
1
Explicație
Datele corespund figurilor anterioare :
V = 1
, deci se rezolvă NUMAI prima cerință.
- Numărul de piste
P = 4
, numărul de sectoareS = 8
- Numărul total de clusteri ocupați este
C = 10
(cei marcați cu negru) - Pe prima pistă sunt
4
clusteri ocupați, în sectoarele1
,3
,5
şi7
. - Pe a doua pistă sunt
2
clusteri ocupați, în sectoarele2
și4
. - Pe a treia pistă nu sunt clusteri ocupați.
- Pe a patra pistă sunt
4
clusteri ocupați, în sectoarele1
,5
,6
și8
.
O singură pistă are toți clusterii liberi, pista numărul 3
, deci valoarea cerută este 1
;
Exemplul 2
defrag.in
2 4 8 10 1 1 1 3 1 5 1 7 4 5 4 1 4 6 4 8 2 2 2 4
defrag.out
2 1 0 1
Explicație
Datele corespund figurilor anterioare :
V = 2
, deci se rezolvă NUMAI a doua cerință.
- Pe prima pistă sunt necesare minim două mutări de clusteri pentru ca toți clusterii ocupați să se găsească într-o ordine consecutivă, deci valoarea cerută este
2
. - Pe a doua pistă este suficientă o singură mutare de cluster, pentru ca toți clusterii ocupați să se găsească într-o ordine consecutivă, deci valoarea cerută este
1
. - Pe a treia pistă nu sunt clusteri ocupați, deci valoarea cerută este
0
. - Pe a patra pistă este suficientă o singură mutare de cluster, pentru ca toți clusterii ocupați să se găsească într-o ordine consecutivă, deci valoarea cerută este
1
.
Cum e corect?
cout < "As la info";
cout << "As la info";
cout >> "As la info";
Felicitări! Poți mai mult?
Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.
Greșit, dar nu-i bai!
Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.
Rezolvare
Iată rezolvarea de 100 de puncte pentru problema Defrag:
// prof. Chesca Ciprian
// Liceul Tehnologic "Costin Nenitescu" Buzau
#include <iostream>
#include <fstream>
#define pmax 101
#define smax 361
using namespace std;
short hdd[pmax][2*smax];
// ns = numar sectoare
// np = numar piste
// nso = numar sectoare ocupate
// xs = sector curent citit
// xp = pista curenta citita
// po = piste ocupate
int main()
{
int v,c,np,ns,xp,xs,i,j,k,po,min,s,nso;
ifstream f("defrag.in");
ofstream g("defrag.out");
// citesc configuratia HDD
f>>v>>np>>ns;
// citesc cate clustere sunt ocupate
f>>c;
// citesc clusterele ocupate
for(i=1;i<=c;i++)
{
f>>xp>>xs;
hdd[xp][xs]=1;
// extindere matrice
hdd[xp][xs+ns]=1;
hdd[xp][0]++;
}
if (v==1)
{
// cate piste nu au clustere ocupate
po=0;
for(i=1;i<=np;i++)
if (hdd[i][0]) po++;
g<<np-po;
}
if (v==2)
{
// determin numarul minim de mutari de clusteri, pe fiecare pista,
// pentru a obtine zone contigue
for(i=1;i<=np;i++)
{
min=ns;nso=hdd[i][0];
// j = pozitie inceput de secventa
for(j=1;j<=ns;j++)
{
s=0;
for(k=j;k<j+nso;k++)
if (hdd[i][k]==0) s++;
if (s<min) min=s;
}
g<<min<<" ";
}
}
g<<"
";
f.close();
g.close();
return 0;
}
Atenție
Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa .
Rezolvarea problemei #1132 Defrag
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1132 Defrag de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.
Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!