PTA 求解磁盘驱动调度问题

有一个磁盘请求序列给出了程序的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

思路

  1. 把开始位置放入数组中,组成一个新的数组

  1. 从开始位置往两边计算距离,如果与右边距离近,就跳到右边,把右边的位置作为新的位置,原位置删去,反之相同

  1. 此题注意边界值,如果跳到开头,下一步只能往右跳,或者跳到末尾,下一步只能往左跳

  1. 每次向两边寻找最近位置(贪心思想)

注释:

  1. surplus为剩余量

  1. start为起始数据

  1. 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;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值