題目: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 }