有一个磁盘请求序列给出了程序的I/O对各个柱面上数据块请求的顺序,例如一个请求序列为98,183,37,122,14,124,65,67,n=8,请求编号为1-n。如果磁头开始位于位置C(假设不在任何请求的位置,例如C=53)。最短寻道时间优先是一种移动磁头柱面数较小的调度算法(优先处理离磁头最近的请求)。编写一个程序采用最短寻道时间优先算法输出给定的磁盘请求序列的调度方案和磁头移动总数。
输入格式:
第一行有输入1个整数n,表示请求序列个数。 依次输入n行,每行两个数,第一个数为请求编号,从1开始编号,第二个数为磁头位置。 最后一行输入磁头开始位置C。
输出格式:
输出磁头移动总数。
输入样例:
8
1 98
2 183
3 37
4 122
5 14
6 124
7 65
8 67
53
输出样例:
236
思路:
把开始位置放入数组中,组成一个新的数组
从开始位置往两边计算距离,如果与右边距离近,就跳到右边,把右边的位置作为新的位置,原位置删去,反之相同
此题注意边界值,如果跳到开头,下一步只能往右跳,或者跳到末尾,下一步只能往左跳
每次向两边寻找最近位置(贪心思想)
注释:
surplus为剩余量
start为起始数据
startsite为新位置的坐标
代码:c和c++
c语言(可能超时)
#include<stdio.h>
int main()
{
int num[10000];
int site[100000];
int sum=0;
int n;
scanf("%d",&n);
int i,j;
for(i=0; i<n; i++)
{
scanf("%d%d",&num[i],&site[i]);
}
int start;
scanf("%d",&start);
site[n]=start;
for(i=0; i<n+1; i++)
{
for(j=i+1; j<n+1; j++)
{
if(site[i]>site[j])
{
int temp=site[i];
site[i]=site[j];
site[j]=temp;
}
}
}
int startsite;
for(i=0; i<n+1; i++)
{
if(site[i]==start)
{
startsite=i;
break;
}
}
int surplus=n;
while(surplus!=0)
{
int d1=site[startsite]-site[startsite-1];
int d2=site[startsite+1]-site[startsite];
if(startsite==0||startsite==surplus)
{
if(startsite==0)
{
sum=sum+d2;
startsite=startsite;
for(i=startsite; i<surplus; i++)
{
site[i]=site[i+1];
}
}
else if(startsite==surplus)
{
sum=sum+d1;
startsite=startsite-1;
for(i=startsite; i<surplus; i++)
{
site[i]=site[i+1];
}
}
}
if(startsite!=0&&startsite!=surplus)
{
if(d1<d2)
{
sum=sum+d1;
startsite=startsite-1;
for(i=startsite+1; i<surplus; i++)
{
site[i]=site[i+1];
}
}
else
{
sum=sum+d2;
startsite=startsite;
for(i=startsite; i<surplus; i++)
{
site[i]=site[i+1];
}
}
}
surplus--;
}
printf("%d",sum);
return 0;
}
c++
#include<bits/stdc++.h>
using namespace std;
int main()
{
int num[10000];
int site[100000];
int sum=0;
int n;
scanf("%d",&n);
int i;
for(i=0; i<n; i++)
{
scanf("%d%d",&num[i],&site[i]);
}
int start;
scanf("%d",&start);
site[n]=start;
sort(site,site+n+1);
int startsite;
for(i=0; i<n+1; i++)
{
if(site[i]==start)
{
startsite=i;
break;
}
}
int surplus=n;
while(surplus!=0)
{
int d1=site[startsite]-site[startsite-1];
int d2=site[startsite+1]-site[startsite];
if(startsite==0||startsite==surplus)
{
if(startsite==0)
{
sum=sum+d2;
startsite=startsite;
for(i=startsite; i<surplus; i++)
{
site[i]=site[i+1];
}
}
else if(startsite==surplus)
{
sum=sum+d1;
startsite=startsite-1;
for(i=startsite; i<surplus; i++)
{
site[i]=site[i+1];
}
}
}
if(startsite!=0&&startsite!=surplus)
{
if(d1<d2)
{
sum=sum+d1;
startsite=startsite-1;
for(i=startsite+1; i<surplus; i++)
{
site[i]=site[i+1];
}
}
else
{
sum=sum+d2;
startsite=startsite;
for(i=startsite; i<surplus; i++)
{
site[i]=site[i+1];
}
}
}
surplus--;
}
printf("%d",sum);
return 0;
}