#include<stdlib.h>
#include<stdio.h>
#define MAX 105
/*
14 148
573 142 919 629 111 888 302 364 520 680 533 206 49 441
*/
typedef long long ll;
using namespace std;
int n,k;
int a[MAX];
void fcfs(){
printf("FCFS算法\n");
int sum=0;
int pre=k;
int v[n+2];
int cnt=1;
for(int i=1;i<=n;i++){
sum+=abs(a[i]-pre);
pre=a[i];
v[cnt]=a[i];
cnt++;
}
printf("磁头移动轨迹:");
for(int i=1;i<=n;i++) printf("%d ",v[i]);
printf("移动总磁道数:%d\n",sum);
}
void sstf(){
printf("SSTF算法\n");
int sum=0;
int pre=k;
bool f[n+2];
int v[n+2];
int cnt=1;
for(int i=1;i<=n;i++) f[i]=0;
for(int i=1;i<=n;i++){
int mi=12000;
int now;
for(int j=1;j<=n;j++){
if(abs(a[j]-pre)<mi&&!f[j]){
mi=abs(a[j]-pre);
now=j;
}
}
sum+=mi;
f[now]=1;
v[cnt]=a[now];
cnt++;
pre=a[now];
}
printf("磁头移动轨迹:");
for(int i=1;i<=n;i++) printf("%d ",v[i]);
printf("移动总磁道数:%d\n",sum);
}
// 采用look策略
void scan(){
printf("SCAN算法\n");
int sum=0;
int v[n+2];
int cnt=1;
int p;
int t[n+2];
for(int i=1;i<=n;i++){
t[i]=a[i];
}
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
if(t[i]>t[j]){
int tt=t[i];
t[i]=t[j];
t[j]=tt;
}
}
}
for(int i=1;i<=n;i++){
if(t[i]>k){
p=i;
break;
}
}
int pre=k;
for(int i=p;i<=n;i++){
sum+=t[i]-pre;
pre=t[i];
v[cnt]=t[i];
cnt++;
}
for(int i=p-1;i>=1;i--){
sum+=pre-t[i];
pre=t[i];
v[cnt]=t[i];
cnt++;
}
printf("磁头移动轨迹:");
for(int i=1;i<=n;i++) printf("%d ",v[i]);
printf("移动总磁道数:%d\n",sum);
}
int main(){
scanf("%d %d",&n,&k);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
fcfs();
sstf();
scan();
}
LINUX 磁盘调度
于 2023-12-12 10:40:10 首次发布