Problem hidden
|This problem was hidden by Editorial Board member probably because it has incorrect language|version or invalid test data, or description of the problem is not clear.|

WI_KLAST - Przydział klastrów

Jednym z angielskich słów, z którym komputerowa polszczyzna nie dała sobie rady, jest termin cluster. Próbowano wielokrotnie zastąpić tego Anglosasa jakimś zgrabnym polskim odpowiednikiem, ale się nie udało – jedyny widoczny efekt to taki, że spolszczono pisownię tego słowa, dzięki czemu możemy w różnych miejscach natknąć się na niezbyt piękne i zupełnie niepolskie słowo klaster.

Klaster pojawia się w wielu różnych dziedzinach informatyki (i nie tylko informatyki), my jednak zajmiemy się dzisiaj tylko jednym jego obliczem, związanym niepodzielnie ze sposobem, w jaki system operacyjne zarządza przestrzenią dyskową.

Pliki rozmieszczone na dysku rzadko kiedy zajmują na nośniku dokładnie tyle miejsca, ile wynosi ich rozmiar. Zazwyczaj zajmują go znacznie więcej, a dzieje się tak dlatego, że system operacyjny przydziela nośnik plikowi nie pojedynczymi bajtami, a tylko i wyłącznie całymi klastrami (które w tym zastosowaniu czasem nazywa się jednostkami przydziału). Jeśli np. założymy na dysku plik, w którym zapiszemy dokładnie jeden bajt, to i tak system operacyjny przydzieli temu plikowi cały klaster. Wynika z tego niezbicie, że klaster powinien być jak najmniejszy, by marnotrawstwo przestrzeni dyskowej było jak najmniejsze. Niestety, mały klaster w konsekwencji zaowocuje wielką liczbą klastrów, a przecież informacje o przydziałach system operacyjny musi efektywnie pamiętać i przetwarzać. Z tego powodu rozmiar klastra jest zwykle kompromisem pomiędzy wydajnością systemu operacyjnego i akceptowalną wielkością dyskowych nieużytków.

Twoim zadaniem będzie napisanie fragmentu kodu, który posłuży systemowi operacyjnemu WIZUT 2009 do poprawnego zarządzania przestrzenią dyskową.

Zakładamy, że całkowity dostępny rozmiar dysku wynosi n klastrów, a sam klaster ma rozmiar r bajtów. W stanie początkowym na dysku nie istnieje żaden plik, więc wszystkie klastry są dostępne. System WIZUT 2009 umożliwia wykonanie na dysku następujących operacji:

  • CREATE – zakłada nowy plik o podanej nazwie i zerowym rozmiarze

  • WRITE – dopisuje do pliku o podanej nazwie wskazaną liczbę bajtów

  • TRUNCATE – usuwa z pliku o podanej nazwie wskazaną liczbę bajtów

  • DELETE – kasuje plik o podanej nazwie

Jeśli wykonanie pewnej operacji jest niemożliwe (z dowolnego powodu), system WIZUT 2009 ignoruje ją kompletnie.

Polecenie: napisz program, który symuluje działanie systemu operacyjnego WIZUT 2009, śledząc efekty wykonania podanego na standardowym wejściu ciągu poleceń

Dane wejściowe: nieznana z góry liczba wierszy tekstu zawierających kolejno:

  • wiersz 1: liczba klastrów dostępnych na dysku (całkowite n: n >=1 i n < 100000)

  • wiersz 2: rozmiar klastra na dysku w bajtach ( całkowite r: n >=1 i n < 1000)

  • w kolejnych wierszach: polecenia dla systemu - w każdym wierszu jedno z poniższych:

    • polecenie utworzenia pliku postaci:
      CREATE nazwa_pliku
      gdzie:
      nazwa_pliku jest ciągiem wielkich liter i cyfr nie dłuższym niż 11 znaków
      powoduje utworzenie pliku o podanej nazwie i zerowej długości;
      jeśli plik o takiej nazwie już istnieje, polecenie jest ignorowane.
       

  •  
    • polecenie dopisania do pliku wskazanej liczby bajtów:  WRITE nazwa_pliku liczba_bajtów
      gdzie:
      nazwa_pliku jest ciągiem wielkich liter i cyfr nie dłuższym niż 11 znaków;
      liczba_bajtów jest liczbą całkowitą z przedziału od 1 do 10000;
      powoduje, że plik o nazwie nazwa_pliku powiększa swój rozmiar o liczbę_bajtów, czemu może towarzyszyć przydzielenie plikowi nowych klastrów;
      jeśli plik o podanej nazwie nie istnieje, polecenie jest ignorowane;
      jeśli na dysku nie ma miejsca na dopisanie wskazanej liczby bajtów, polecenie jest ignorowane;
    •  polecenie usunięcia z pliku wskazanej liczby bajtów:
      TRUNCATE nazwa_pliku liczba_bajtów
       gdzie:
      nazwa_pliku jest ciągiem wielkich liter i cyfr nie dłuższym niż 11 znaków;
      liczba_bajtów jest liczbą całkowitą z przedziału od 1 do 10000;
      powoduje, że plik o nazwie nazwa_pliku zmniejsza swój rozmiar o liczbę_bajtów, czemu może towarzyszyć zwolnienie przez plik pewnej liczby klastrów;
      jeśli plik o podanej nazwie nie istnieje, polecenie jest ignorowane;
      jeśli plik ma rozmiar mniejszy niż wskazano liczba bajtów, polecenie jest ignorowane.
    • polecenie skasowania pliku postaci:
      DELETE nazwa_pliku
      gdzie:
      nazwa_pliku jest ciągiem wielkich liter i cyfr nie dłuższym niż 11 znaków
      powoduje usunięcie pliku o podanej nazwie i zwolnienie zajmowanych przez niego klastrów;
      jeśli plik o takiej nazwie nie istnieje, polecenie jest ignorowane.

Dane wyjściowe:

  • jeden wiersz, zawierający jedną daną całkowitą, będącą liczbą wolnych klastrów na dysku po wykonaniu wszystkich poleceń ze standardowego wejścia.

Przykład:

Wejście:

4

512

CREATE PLIK1

CREATE PLIK2

CREATE PLIK3

CREATE PLIK4

WRITE PLIK1 1

WRITE PLIK1 511

WRITE PLIK2 1024

WRITE PLIK3 100

WRITE PLIK4 1024

TRUNCATE PLIK4 1024

DELETE PLIK3

Wyjście:

1

 


Dodane przez:Sławomir Wernikowski
Data dodania:2009-09-22
Limit czasu wykonania programu:2s
Limit długości kodu źródłowego5000B
Limit pamięci:1536MB
Cluster: Cube (Intel G860)
Języki programowania:C CSHARP CPP C99 JAVA PAS-GPC PAS-FPC
Pochodzenie:Konkurs o nagrodę Dziekana WI ZUT w Szczecinie (2009)
© Spoj.com. All Rights Reserved. Spoj uses Sphere Engine™ © by Sphere Research Labs.