日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

POJ1033 Defragment

發布時間:2023/12/10 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 POJ1033 Defragment 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目來源:http://poj.org/problem?id=1033

題目大意:

  某操作系統的文件系統中,所有的磁盤空間被分為N個大小相等的cluster,編號1至N。每個文件占用一個或多個cluster。所有沒有被文件占用的cluster稱為是空閑的。磁盤上的一個文件如果放置在連續的cluster上,讀取速度是最快的。

  磁盤以勻速旋轉,磁頭找到某一個cluster的時間的不等的。因此,找到靠近開頭的cluster更快。所有的文件被事先按訪問頻率高到低編號1到K,最好的文件放置方式是:文件1放置于cluster 1,2,...S1,文件2放置于cluster S1+1, S1+2,...S1+S2.后面類似,緊挨著放置。Si表示第i個文件占據的cluster數。

  為了將磁盤上的文件整理成上述的最優放置方式,需要對cluster進行移動。一次移動包括將一個cluster的內容讀出來,寫至一塊空閑的cluster上,完成后之前的那塊cluster變為空閑。

  程序的目標是將磁盤上的文件變為最優放置方式需要的最少移動次數和移動次序。

輸入:第一行含兩個整數N和K分別代表cluster數和文件數。接下來K行,每行代表一個文件,第一個數字代表該文件含多少cluster,后面的每個數字代表所占的cluster的編號。

輸出:按順序輸出表示移動的數據對Pj,Qj。表示將Pj號cluster的數據移動到Qj.(答案可能不唯一,采用了Special Judge,只要答案正確即可)不需要移動則輸出"No optimization needed".


Sample Input

20 3 4 2 3 11 12 1 7 3 18 5 10

Sample Output

2 1 3 2 11 3 12 4 18 6 10 8 5 20 7 5 20 7

實際上可以把問題看過一個數組的重新排列問題.用clusters[N]數組表示第i塊cluster處放置的文件塊的序號(塊的序號按重排后結果編排,即該塊最終應該位于哪一個cluster)。那么重排后的結果應該是前面部分的clusters[i]=i,后面的部分clusters[i]=0.

比如sample中的例子:

初始狀態:

  i:     ?1? 2? 3? 4? 5? 6? 7? 8? 9? 10? 11? 12? 13? 14? 15? 16? 17? 18

clusters[i]:  0? 1? 2? 0??7? 0? 5? 0? 0?? 8 ? ?3 ? ?4 ? ?0 ? ?0 ? 0 ? ?0 ? ?0 ? ?6?

?

重排后:

  i:     ?1? 2? 3? 4? 5? 6? 7? 8? 9? 10? 11? 12? 13? 14? 15? 16? 17? 18

clusters[i]:  1 ?2 ?3 ?4 ?5 ?5 ?6 ?8 ?0 ? 0 ? ?0 ? ?0 ? ?0 ? ?0 ? 0 ? ?0 ? ?0 ? ?0?

遍歷所有的cluster,會有以下幾種情況:

1. clusters[i]=0,不必處理。

2. clusters[i]=1,不必處理。

3. 不是以上兩種情況,則需要移動cluster。此時又有兩種情況:

  a.需要移動的cluster形成鏈,例如:

     i:   1? 2? 3? 4? 5? 6?    

   clusters[i]: 5? 0??4??2??3??0?

   1被5占,5被3占,3被4占,4被2占,2為空。用棧保存占用關系,借助一個空位,逆向移動即可。

  b.需要移動的cluster形成環,例如:  

      i:  1? 2? 3? 4? 5? 6?    

    clusters: 5??1??4??2??3??0?

  1被5占,5被3占,3被4占,4被2占,2又被1占。這種情況從磁盤末尾開始找一個空cluster(題目保證了一個至少有一個空的cluster,否則就移動不了了),借助這個空的cluster,然后逆向移動。

  遍歷完成時磁盤整理也完成了。

1 // 2 // POJ1033 Defragment 3 // Memory: 408K Time: 829MS 4 // Language: C++ Result: Accepted 5 // 6 7 #include <iostream> 8 #include <stack> 9 10 using namespace std; 11 12 int main() { 13 int N; 14 int K; 15 int move_cnt = 0; 16 cin >> N >> K; 17 18 int * clusters = new int[N + 1]; 19 for (int i = 0; i <= N; ++i) { 20 clusters[i] = 0; 21 } 22 int sum = 0; 23 for (int i = 0; i < K; ++i) { 24 int n; 25 cin >> n; 26 for (int j = 1; j <= n; ++j) { 27 int a; 28 cin >> a; 29 clusters[a] = ++sum; 30 } 31 } 32 for (int i = 1; i <= N; ++i) { 33 if (clusters[i] == 0 || clusters[i] == i) { 34 continue; 35 } 36 stack<int> s; 37 int next = clusters[i]; 38 s.push(i); 39 bool isCircle = false; 40 while (true) { 41 if (clusters[next] == i) { 42 isCircle = true; 43 break; 44 } else if (clusters[next] == 0) { 45 break; 46 } 47 s.push(next); 48 next = clusters[next]; 49 } 50 if (isCircle == true) { 51 int j = N; 52 while (clusters[j] != 0) { 53 --j; 54 continue; 55 } 56 cout << next << " " << j << endl; 57 clusters[j] = clusters[next]; 58 int t; 59 while (!s.empty()) { 60 t = s.top(); 61 cout << t << " " << next << endl; 62 clusters[next] = clusters[t]; 63 next = t; 64 s.pop(); 65 ++move_cnt; 66 } 67 clusters[next] = clusters[j]; 68 clusters[j] = 0; 69 cout << j << " " << next << endl; 70 } else { 71 int t; 72 while (!s.empty()) { 73 t = s.top(); 74 cout << t << " " << next << endl; 75 clusters[next] = clusters[t]; 76 next = t; 77 s.pop(); 78 ++move_cnt; 79 } 80 clusters[next] = 0; 81 } 82 } 83 if (move_cnt == 0) { 84 cout << "No optimization needed" << endl; 85 } 86 system("pause"); 87 return 0; 88 } View Code

轉載于:https://www.cnblogs.com/dengeven/p/3230223.html

總結

以上是生活随笔為你收集整理的POJ1033 Defragment的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。