• 电梯调度


    题目:

    石家庄铁道大学基础大楼一共有四部电梯,每层都有人上下,电梯在每层都停。信1201-1班的张一东觉得在每层都停觉得不耐烦。

    由于楼层不太高,在上下课高峰期时时,电梯从一层上行,但只允许停在某一楼层。在一楼时,每个乘客选择自己的目的层,电梯则自动计算出应停的楼层。

    问电梯停在那一楼层,能够保证这次乘坐电梯的所有乘客爬楼梯的层数之和最少。

    思想:

    假设电梯停在第 i 层,计算出所有乘客总共爬楼梯的层数是Y。如果有N1个乘客想去的楼层在第 i 层之下,有N2个乘客正好想去的楼层是第 i 层,有N3个乘客想去的楼层在第 i 层之上。

    如果电梯改停在i-1层,所有目的地在第i - 1层以下的乘客可以少爬1层,总共少爬N1层,所有在i层及以上的乘客要多爬一层,总共多爬N2+N3层,这时总共需要爬Y-N1+N2+N3。反之,如果电梯在i+1层停所有目的地在第 i 层以上的乘客可以少爬1层,总共少爬N3层,所有在 i 层及以下的乘客要多爬一层,总共多N1+N2层,这时总共需要爬Y+N1+N2-N3层。

    可见,当N1 > N2+N3 时,电梯在第i-1层楼停更好;当N1+N2 <  N3 时,电梯在i+1层停更好。其他情况在第i层更好。

    程序代码:

    // 电梯.cpp : Defines the entry point for the console application.

    //

    #include "stdafx.h"

    #include "iostream.h"

    #include "stdlib.h"

    #define MAXSIZE 15

    void Input(int &num,int flour[])                //输入乘坐电梯的人数及楼层

    {

        cout<<"请输入乘坐电梯的人数(限定15人):";

        cin>>num;

        if(num>15)

        {

            cout<<"输入错误!"<<endl;

            exit(0);

        }

        cout<<"请输入每个人要去的层数(最高18层):";

        for(int i=0;i<num;i++)

        {

            cin>>flour[i];

            if(flour[i]>18)

            {

                cout<<"输入错误!"<<endl;

                exit(0);

            }

        }

    }

    void getSmallestFlour(int num,int flour[],int &small)    //计算出爬楼梯层数最少的楼层

    {

        int sum,temp=small;

        int highest,lowest;

        highest=lowest=flour[0];

        for(int i=0;i<num;i++)                //找出要去的楼层中最高的楼层

        {

            if(flour[i]>highest)

            {

                highest=flour[i];

            }

            else                            //找出最低楼层

            {

                lowest=flour[i];

            }

        }

        for(i=lowest;i<=highest;i++)        //从最低楼层开始遍历直到最高楼层

        {

            sum=0;

            for(int j=0;j<num;j++)

            {

                if((flour[j]-i)<0)            //计算爬楼梯的层数之和

                {

                    sum=sum+i-flour[j];

                }

                else

                {

                    sum=sum+flour[j]-i;

                }

            }

            cout<<"若停在"<<i<<"层,则爬楼梯的总和为"<<sum<<endl;

            if(sum<temp)

            {

                small=i;            //记录和最小的楼层号

                temp=sum;            //记录最小的和

            }

        }

    }

    int main(int argc, char* argv[])

    {

        int num,aver,flour[MAXSIZE];

        Input(num,flour);

        aver=0;

        for(int i=0;i<num;i++)

        {

            aver+=flour[i];

        }

        getSmallestFlour(num,flour,aver);

        cout<<"电梯将停在"<<aver<<"层。"<<endl;

        return 0;

    }

    总结:

    这是一个优化问题,通过分析发现,以递归方式考虑结果层层向前思考是一种别具一格的方法,有时能达到意想不到的结果。

  • 相关阅读:
    Qwt的安装与使用
    深入浅出分析Linux设备驱动程序中断
    QT连接数据库的基本操作
    linux下摄像头抓图源码
    QTE 触控屏支持
    linux网络多线程编程实例
    wubi (windows下硬盘安装Linux)
    快速体验Linux的3种方式
    在Visual Studio 2005中安装Qt 4.3.2
    Enterprise Architect 字体
  • 原文地址:https://www.cnblogs.com/bill927/p/4588338.html
Copyright © 2020-2023  润新知