• 电梯调度(个人)


      石家庄铁道大学基础大楼一共有四部电梯,每层都有人上下,电梯在每层都停。信1201-2班的张一东觉得在每层都停觉得不耐烦。由于楼层不太高,在上下课高峰期时时,电梯从一层上行,但只允许停在某一楼层。在一楼时,每个乘客选择自己的目的层,电梯则自动计算出应停的楼层。问电梯停在那一楼层,能够保证这次乘坐电梯的所有乘客爬楼梯的层数之和最少。

    思路:

      (一):最容易想到的枚举法。从第1层枚举到第N层,假设电梯在第i层停,求出此时所有乘客需要爬多少层楼的总数,看到最少的那层就是答案。

      (二):微软公司面试题有类似的,老师上课提到过,假设电梯在第i层停,已知在i层的有N2人,在i层以下的有N1人,在i层以上的有N3人,这时乘客一共要爬Y层。在i+1层停的话,乘客要爬Y + N2 + N1 - N3。这就发现当N2 + N1 - N3 < 0时则更优;在i-1层停同理。

    在CSDN论坛上找了相关资料,普遍用思路一实现,用思路二进行更深一步的思考。

     

    源代码:

    #define FLOORSNUM 18
    #include <iostream.h>
    void StopAtOnlyOneFloor_AllFloorWalkLayers(int *_iFloorPassengerNum, int N)
    {
        int i;
            cout<<endl;
        cout<<"PassengerNums	Floor	Walks"<<endl;
        int NBottom=0,NFloor=_iFloorPassengerNum[0],NAbove=0,minWalkLayer=0;
        for(i=1;i<N;++i)
        {
                NAbove+=_iFloorPassengerNum[i];
            minWalkLayer=minWalkLayer+(_iFloorPassengerNum[i]*i);
        }
        cout<<"	"<<_iFloorPassengerNum[0]<<"	No.1	"<<minWalkLayer<<"Fs"<<endl;
        for(i=1;i<N;++i)
        {
            NAbove=NAbove-_iFloorPassengerNum[i];
            NBottom=NBottom+NFloor;
            NFloor=_iFloorPassengerNum[i];
            minWalkLayer=minWalkLayer-NFloor-NAbove+NBottom;
            cout<<"	"<<_iFloorPassengerNum[i]<<"	No."<<i+1<<"	"<<minWalkLayer<<"Fs"<<endl;
        }
        cout<<endl;
        return;
    }
    void StopAtOnlyOneFloor_FewestWalkLayer(int *_iFloorPassengerNum,int N)
    {
        int NBottom=0, NFloor=_iFloorPassengerNum[0], NAbove=0,minWalkLayer=0;
        for(int i=1;i<N;++i) 
        {
            NAbove+=_iFloorPassengerNum[i];
            minWalkLayer=minWalkLayer+(_iFloorPassengerNum[i]*i);
        }
        int j=1;
        for (;j<N;++j)
        {
            if(NAbove<NFloor+NBottom)break;
            NAbove=NAbove-_iFloorPassengerNum[j]; 
            NBottom=NBottom+NFloor;
            NFloor=_iFloorPassengerNum[j];      
            minWalkLayer=minWalkLayer-NAbove-NFloor+NBottom;
        }
        cout<<"Best Stop is: No."<<j<<"F, at least Walks "<<minWalkLayer<<"Fs "<<endl;
        return;
    }
    int main ()
    {
        int iFloorPassengerNum[FLOORSNUM];
        cout<<"input the passengerNumbers for every floor:"<<endl;
        for(int i=0;i<FLOORSNUM;i++)
        {
            cout<<"No."<<i+1<<": ";
            cin>>iFloorPassengerNum[i];
        }
        StopAtOnlyOneFloor_AllFloorWalkLayers(iFloorPassengerNum,FLOORSNUM);
        StopAtOnlyOneFloor_FewestWalkLayer(iFloorPassengerNum,FLOORSNUM);
        return(0);
    }
    View Code

    运行截图:

    总结:

      思路很难想到,因为一直在钻牛角尖,认为这道题目就是不对的,放到实际情况里根本不可行,还考虑了一大堆特殊的情况,类似什么半途有上人……但实际上老师更侧重的是想考察我们的思路,希望能在现有的思维方式上进行开拓。不管怎么样感觉实现起来也不容易。反正1~18层自己验算不快,在计算机上运行也还行,但从算法本身来看时间复杂度是O(n²),是很慢了。之间在关于求一维或者二维数组中最大子数组之和是就提示要考虑,可以看出时、空的复杂度在解决问题,特别是实现时是很重要的。

  • 相关阅读:
    Java的多线程机制系列:(二)缓存一致性和CAS
    Java的多线程机制系列:(一)总述及基础概念
    pydev常用快捷键
    利用python的pyinotify模块监控文件夹和文件的变动
    Linux 下文件名乱码(无效的编码)的解决办法
    ubuntu 中文界面下中文文件夹改英文
    SystemParametersInfo
    jsp:forward与缓冲区
    kafka:(9) 流式处理
    kafka:(8) 事务、幂等
  • 原文地址:https://www.cnblogs.com/mumulucky/p/4438889.html
Copyright © 2020-2023  润新知