7-5 电梯调度

大楼有地下-1层~地面33层,此大楼有A、B、C三部电梯。调度原则:(1)电梯按照用户按键的时间顺序前往服务;(2)距离按键用户所在楼层最近的电梯前往(若楼层距离一样,则按A、B、C的优先调度顺序前往用户楼层);(3)电梯一旦启动前往某楼层,不再为其它楼层用户服务。

输入格式:

第一行输入:A、B、C三部电梯当前静止停留的楼层
第二行输入:按键用户数量
第三行输入:依次按键并等待电梯的用户所在的楼层

输出格式:

依照用户按键次序,各行依次输出电梯前往楼层的情况(见样例1)
若按键用户超过3人,则输出用户等待(见样例2)
若第一行输入的某楼层不在[-1,33]范围内,则输出“Input error!”,程序结束(见样例3)
若第三行输入的某楼层不在[-1,33]范围内,则输出“Input error!”后程序结束,此无效楼层之前的调度不受影响(见样例4)

输入样例1:

7 8 15
2
9 3

输出样例1:

B goes to 9 floor
A goes to 3 floor

输入样例2:

7 3 18
4
11 33 22 5

输出样例2:

A goes to 11 floor
C goes to 33 floor
B goes to 22 floor
user on 5 floor waits

输入样例3:

6 35 7

输出样例3:

Input error!

输入样例4:

17 18 19
3
10 -2 20

输出样例4:

A goes to 10 floor
Input error!

以下是我的代码

#include "stdio.h"
#include "math.h"

int main()
{
    // 输入 A、B、C 三个楼层的初始值
    int A, B, C, n, i, u;
    scanf("%d%d%d", &A, &B, &C);

    // 检查输入是否在合法范围内
    if (A < -1 || A > 33 || B < -1 || B > 33 || C < -1 || C > 33)
    {
        printf("Input error!");
        return 0;
    }

    // 输入要执行的操作的次数
    scanf("%d", &n);

    // 循环执行每个操作
    for (i = 0; i < n; i++)
    {
        // 输入当前用户所在的楼层
        scanf("%d", &u);

        // 检查输入是否在合法范围内
        if (u < -1 || u > 33)
        {
            printf("Input error!");
            return 0;
        }

        // 根据条件确定每个电梯的行动
        if ((A != 99 && abs(A - u) <= abs(B - u)) && abs(A - u) <= abs(C - u))
        {
            printf("A goes to %d floor\n", u);
            A = 99;
        }
        else if (B != 99 && abs(B - u) <= abs(A - u) && abs(B - u) <= abs(C - u))
        {
            printf("B goes to %d floor\n", u);
            B = 99;
        }
        else if (C != 99 && abs(C - u) <= abs(A - u) && abs(C - u) <= abs(B - u))
        {
            printf("C goes to %d floor\n", u);
            C = 99;
        }
        else
            printf("User on %d floor waits\n", u);
    }

    return 0;
}

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值