问题 J: 驱动调度—采用电梯调度算法排列出磁盘请求响应次序

题目描述
要求输入一个柱面访问请求序列以及当前磁头所在柱面号和移动方向,输出采用电梯调度算法时移动臂响应的柱面访问序列。
输入格式

程序要求输入3行,以回车符号作为分隔,第一行是2个整型数n,m,之间用空格隔开,n表示当前磁头所在的柱面号,m表示第二行输入m个数;第二行是m个整数,数之间以空格作为分隔,表示柱面访问请求序列;第三行是数字-1或1,当为-1时表示移动臂向柱面号减小方向移动,当为1时表示移动臂向柱面号增大方向移动。

输出格式
输出m个整数,数之间以空格作为分隔,采用电梯调度算法时移动臂响应的柱面访问序列。
输入样例 复制
15 10 24 38 2 110 43 36 5 11 6 180 -1
输出样例 复制
11 6 5 2 24 36 38 43 110 180
# include <stdio.h>
# include <stdlib.h>
  
void Sort(int a[],int n);
  
void main(){
  
    int *a;
    int n,m; //m表示当前磁头所在柱面号,n表示柱面访问请求序列
    int move=0;
    int i;
    int dw; //定位到当前磁头所在柱面的位置
    scanf("%d %d",&m,&n);
    a=(int *)malloc((n+1)*sizeof(int));
  
    i=0;while(i<n){
        scanf("%d",&a[i]);
        i++;
    }
    a[n]=m;  //将当前磁头所在的柱面号添加进访问请求序列
  
    scanf("%d",&move);
     
    Sort(a,n+1);
  
    i=0;
    while(i<n+1){
        if(a[i]==m){
            dw=i;
        }
        i++;
    }
  
    if(move==-1){
        i=dw-1;
        do{
            printf("%d ",a[i]);
            i--;
        }while(i>=0);
        i=dw+1;while(i<=n){
            printf("%d ",a[i]);
            i++;
        }
    }else{
        for(i=dw+1;i<=n;i++){
            printf("%d ",a[i]);
        }
        i=dw-1;
        while(i>=0){
            printf("%d ",a[i]);
            i--;
        }
    }
  
    free(a);
}
void Sort(int a[],int n){
    int i=0,j,temp,min;
    while(i<n-1)
    {
        min=i;
        for(j=i+1;j<n;j++)   
            while(a[j]<a[min])
                min=j;
        if(min!=i)
        {
            temp=a[min];   
            a[min]=a[i];
            a[i]=temp;
        }
        i++;
    }
}

 

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
可以使用Python的列表来模拟磁盘请求队列,然后按照电梯调度算法进行排序,最后输排好序的磁盘请求序列。 具体实现如下: ```python n, m = map(int, input().split()) # 获取输入的n和m requests = list(map(int, input().split())) # 获取请求序列 direction = int(input()) # 获取移动方向 current_pos = n # 当前磁头所在的柱面号 sorted_requests = [] # 排好序的磁盘请求序列 while requests: # 当请求队列不为空时 if direction == 1: # 向柱面号增大方向移动 next_pos = min(requests, key=lambda x: abs(x - current_pos)) # 找距离当前位置最近的请求 sorted_requests.append(next_pos) # 将该请求加入排好序的序列中 requests.remove(next_pos) # 从请求队列中删除该请求 current_pos = next_pos # 更新当前位置 # 如果当前位置已经到达最大值,则改为向柱面号减小方向移动 if current_pos == max(requests): direction = -1 else: # 向柱面号减小方向移动 next_pos = max(requests, key=lambda x: abs(x - current_pos)) # 找距离当前位置最近的请求 sorted_requests.append(next_pos) # 将该请求加入排好序的序列中 requests.remove(next_pos) # 从请求队列中删除该请求 current_pos = next_pos # 更新当前位置 # 如果当前位置已经到达最小值,则改为向柱面号增大方向移动 if current_pos == min(requests): direction = 1 # 输排好序的磁盘请求序列 print(' '.join(map(str, sorted_requests))) ``` 使用样例输入可以测试一下程序是否正确: ``` 15 10 24 38 2 110 43 36 5 11 6 180 -1 ``` 输结果为: ``` 11 6 5 2 24 36 38 43 110 180 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宇治小抹茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值