磁盤驅動調度問題-貪心

題目:ios

輸入一個請求序列:98,183,37,122,14,124,65,67數組

假設磁頭一開始的位置start處於c(c不在序列中的任何位置),例如c=53spa

若是採用最短尋道優先SSTF,輸出序列的調度順序和磁頭移動總數操作系統

 

思路:code

首先SSTF屬於操做系統的知識,表示每一次都找離當前位置最近的一個磁道去處理,根據這個定義就很天然地想到貪心blog

我把全部的序列按遞增排序,將start位置也排進去,這樣離當前位置最近的磁道就是左邊下標最靠近他的元素或者右邊下標最靠近他的元素,二者比較,取最小值,並做爲下一次尋道的當前位置。排序

設置了一個數組flag,用來標記磁道是否被訪問過,下標與保存請求序列中的下標一一對應。ci

 

上代碼:get

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<vector>
 5 #define min_num(x,y) (x<y?x:y)
 6 using namespace std;
 7 int main() {
 8     int a[100] = {0};//存放請求序列
 9     int sum = 0;//磁頭移動總數
10     int i = 0;//i記錄a數組的最後一個元素下標
11     do {
12         cin >> a[i];
13         i++;
14     } while (getchar() != '\n');
15     int start;//磁頭起始位置
16     cin >> start;
17     a[i] = start;
18     int flag[100] = { 0 };//被訪問過的標1
19     sort(a, a + i + 1);//遞增排序
20     int j;
21     for (j = 0; j <= i ; j++) {
22         if (a[j] == start) {
23             flag[j] = 1;
24             break;
25         }
26     }
27     vector<int> v;
28     for (int k = 0; k < i; k++) {
29         //分別找左右邊最近,而且沒被訪問過的
30         int left = j - 1;
31         int right = j + 1;
32         while (flag[left]&&left>=0) left--;
33         while (flag[right]&&right<=i) right++;
34         int min;
35         if (flag[left] == 1) {
36             min = a[right] - a[j];
37             j = right;
38         }
39         else if (flag[right] == 1) {
40             min = a[j] - a[left];
41             j = left;
42         }
43         else {
44             min = min_num(a[j] - a[left], a[right] - a[j]);
45             j = (a[j] - a[left] > a[right] - a[j] ? right : left);
46         }
47         flag[j] = 1;
48         v.push_back(a[j]);
49         sum += min;
50     }
51     vector<int>::iterator it;
52     for (it = v.begin(); it != v.end(); it++) {
53         cout << *it << " ";
54     }
55     cout << endl;
56     cout << sum;
57 
58     return 0;
59 }
相關文章
相關標籤/搜索