电梯调度

题目:

石家庄铁道大学基础大楼一共有四部电梯,每层都有人上下,电梯在每层都停。信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;

}

总结:

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

posted on 2015-06-19 12:50  海阔天空丶  阅读(123)  评论(0编辑  收藏  举报

导航