Archives
Trending
Support
Login
clear text
XML
Django
JavaScript
MATLAB
C
C++
C#
Python
SQL
Shell
Bash
Markdown
YAML
JSON
HTML
CSS
PHP
Java
Ruby
Go
Rust
Swift
Kotlin
Arduino
TypeScript
Perl
Autohotkey
Lua
SQF
R
Scala
Haskell
Groovy
Dart
Clojure
VB.NET
Objective-C
PowerShell
Bash
CoffeeScript
Verilog
#include
using namespace std; ifstream cin("defrag.in"); ofstream cout("defrag.out"); ///Disk fiind declarat global are toate valorile 0. int disk[101][361]; ///disk[pista][sector]. //Un cluster este o pozitie a unui punct A(x,y) de pe disk. int cerinta , pista , sector; int cluster, x , y; //Functia "mutari" returneaza minimul de mutari pt defragmentare. //Ideea pentru minimul de mutari este explicata in main. int mutari(int i) { int nr1 = disk[i][sector]; int sol = 0; ///Caz particular - pista este libera. if(nr1 == 0) return 0; //Nu incheie programul ci returneaza valoarea 0. ///Sa luam fiecare interval [p,j] care contine nr1 pozitii. int j , p , interval; for(j = nr1;j<=sector;j++) { p = j - nr1; interval = disk[i][j] - disk[i][p]; //cout<
sol) sol = interval; } //cout<<'\n'; /**Codul este bun , exemplul da cum trebuie dar daca trimitem ce am facut pana acum, primim 40 de puncte. DE CE?? */ /**O pista este circulara. Sa luam un exemplu pe o pista: pista{1,1,0,0,1,1} . nr1 = 4. poz 1 2 3 4 5 6 p j (interval final) Observati ca daca pista este circulara asta inseamna ca inceputul (poz: 1) si sfarsitul(poz: 6) sunt una langa alta. Cand noi cautam pe intervale de cate 4 numere, nu trecem si prin intervalul compus din pozitiile {5,6,1,2} care contine de fapt numarul maxim cautat (4). Adica nu este nevoie de mutari Pentru a repara aceasta neatentie putem : - dupa cum a sugerat Vlad sa dublam efectiv vectorul si sa parcurgem de doua ori. - dupa cum am sugerat eu , sa facem un artificiu de calcul pentru a parcurge doar intervalele neverificate. In continuare voi explica ideea mea. */ /** Sa luam exemplul de mai devreme doar ca dublat: pista{1,1,0,0,1,1,1,1,0, 0, 1, 1} . nr1 = 4 + 4. poz 1 2 3 4 5 6 7 8 9 10 11 12 p j prima pereche (p,j)este ultimul interval din primul exemplu p j a doua este ultimul interval din exemplul dublat. p j a treia este de fapt ultimul interval care ne intereseaza. dupa ce (j > sector) putem calcula suma partiala din pozitia j in urmatorul mod : s = disk[i][sector]+disk[i][j-sector]. Putem astfel sa parcurgem restul intervalelor pana cand p = sector; */ for(p = sector - nr1 + 1, j = sector+1; p <= sector; p++ ,j++) { interval = disk[i][sector] + disk[i][j-sector] - disk[i][p]; if(interval > sol) sol = interval; } return nr1 - sol; } //Functie ce afiseaza diskul.(Pentru intelegere) void afisareDisk() { cout<<'\n'; for(int i = 1;i<=pista;i++){ for(int j = 1;j<=sector;j++) cout<
> cerinta >> pista >> sector; cin >> cluster; for(int i = 1; i <= cluster;i++) { cin >> x >> y; disk[x][y] = 1; } //afisareDisk(); ///Facem suma partiala pe fiecare pista in parte. for(int i = 1;i<=pista;i++) for(int j = 1;j<=sector;j++) disk[i][j]+=disk[i][j-1]; //afisareDisk(); if(cerinta == 1) { /**Suma partiala fiind facuta, elementul disk[i][sector] contine cate clustere sunt ocupate pe pista i. Numaram cate dintre acestea sunt 0 (libere) pt prima cerinta.*/ int sol = 0; for(int i = 1; i <= pista; i++) if(disk[i][sector] == 0) sol++; cout << sol; return 0; //"return 0;" incheie programul. } if(cerinta == 2) { /** Fie - nr1 numarul de clustere de pe o pista. - sol numarul maxim de clustere dintr-un interval de nr1 numere Numarul minim de mutari: nr1 - sol. Putem calcula cate clustere sunt intr-un interval [i,j] in O(1)datorita sumelor partiale. Nr clustere de pe linia i din intervalul [p,j] = disk[i][j] - disk[i][j-p]. */ ///Afisam numarul minim de mutari de pe fiecare pista. for(int i = 1; i <= pista; i++) cout<
Mark as private (unlisted)
for 30 minutes
for 6 hours
for 1 day
for 1 week
for 1 month
for 1 year
everlasting (like CCCP)