电梯调度(个人)

  石家庄铁道大学基础大楼一共有四部电梯,每层都有人上下,电梯在每层都停。信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\tFloor\tWalks"<<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<<"\t"<<_iFloorPassengerNum[0]<<"\tNo.1\t"<<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<<"\t"<<_iFloorPassengerNum[i]<<"\tNo."<<i+1<<"\t"<<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);
}

运行截图:

总结:

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

时间: 2024-11-07 01:52:32

电梯调度(个人)的相关文章

结对开发--电梯调度报告

“电梯调度”需求分析 一.项目背景 试想一下,石家庄铁道大学基础教学楼的电梯配置如下:大厦有18层, 4部电梯,很多乘客使用这些电梯的日常(旅客重量:平均70公斤最大120公斤,最小45公斤).其他常量数据:电梯速度,开/关门时间,乘客的时间要在/走出电梯.可以对这些合理的假设. 二.数据分析 我们随机选择了一天去现场调查基础教学楼电梯的使用情况,列表如下: 电梯名称 停靠层数 乘客限制 重量限制/kg 电梯开关时间/s 乘客进出电梯时间/s 电梯1 8-18层(双层) 15人 1150 4s

对于电梯调度的想法

电梯调度 现有一新建办公大厦,共有21层,共有四部电梯,所有电梯基本参数如下表所示: 电梯编号 可服务楼层 最大乘客数量 最大载重量 1 全部楼层 10 800 kg 2 单层 10 800 kg 3 双层 20 1600 kg 4 全部楼层 20 2000 kg 其使用规定如下: 1.楼层号为0~20,其中0号为地下一层: 2.有楼层限制的电梯不在响应楼层停靠,如单双层: 3.所有电梯采用统一按钮控制 请根据上述要求设计并实现一个电梯控制程序,如果有图形显示就更好了. 对于这个问题我有以下想法

软件工程课堂作业(七)续——电梯调度之整体设计

一.题目要求: 1.可以获得电梯和乘客所在楼层: 2.可以根据乘客的需求到达想到达的楼层. 二.设计思路: 1.通过用户输入可以获取乘客和电梯所在楼层: 2.通过循环,输出电梯向上/向下走的过程. 三.源代码: 1 // 电梯调度——胡亚宝 2 // 3 4 #include "stdafx.h" 5 #include<iostream> 6 using namespace std; 7 8 9 int _tmain() 10 { 11 int a,b,c,m,i; 12

课堂练习--电梯调度

一.题目要求 •石家庄铁道大学基础大楼一共有四部电梯,每层都有人上下,电梯在每层都停.信1201-1班的XXX东觉得在每层都停觉得不耐烦. •由于楼层不太高,在上下课高峰期时时,电梯从一层上行,但只允许停在某一楼层.在一楼时,每个乘客选择自己的目的层,电梯则自动计算出应停的楼层. •问电梯停在那一楼层,能够保证这次乘坐电梯的所有乘客爬楼梯的层数之和最少. 二.设计思想 这次的电梯的设计题目一开始我其实想明白了,但是老师后来讲了半天结果又说迷糊了...所以今天做作业之前看了一下同学们的设计思想,发

电梯调度系统(界面由C图形库编绘)

电梯调度系统编程 1.编程题目 电梯调度. 2.结对编程组员 黄冠译,刘畅. 3.编程语言 C语言图形库. 4.题目要求: 5.代码运行及结果调试: ① 运行界面为C++图形库支持,开始运行的初始界面如图,且默认所有电梯初始状态都为1楼,此时不分奇偶层: ② 我设置了鼠标响应事件,左边上下箭头为当前楼层有人要上或下的按钮,可以用鼠标直接点击响应,点击后要输入有多少人在此楼层等待,示例点击5楼,输入15人,如图所示: ③ 输入完毕后,电梯会根据单双层或全部楼层4个电梯的忙碌状态调度一个电梯过去,第

电梯调度之需求分析

电梯调度之需求分析 结对人员:郎国杰.刘伯建 一.项目背景 石家庄铁道大学基础教学楼中有四部电梯,然而基础教学楼却有十八层,每天都有学生们忙碌的去上课,每天都有成群的学生在排队等电梯,而有时候却还不如直接爬上去来的快 二.项目目的 为学生缓解高峰期电梯的压力,提高电梯的利用率. 三.项目调查 (1)总共18层,4部电梯,每部限乘15人,重量限制1150kg. (2)1,2号电梯只停1层以及8-18双层楼,3,4号电梯只停一层以及8-18单层楼. (3)高峰期:7:30--8:00,11:50--

结对编程之电梯调度

编程任务:电梯调度 结对人员:左少辉-12061209,杨昊兰-12061202,吕雨朗 一.此次软工作业确实是让人却步的不敢开始,不过结对编程使得我对完成作业又有了信心,开始没有积极组队的我落单了,后来只能是申请加入已经组好的队伍,所以我们其实是一个三人组,都说人多力量大,想法也就会开阔许多,做起作业来也会顺利许多.起初对作业不是很了解,光是看英文要求就已经醉了,后来还是硬着头皮开始了漫长的代码阅读,浅学c#觉得语法也就一般般,不过看到如此绚丽的代码还是各种懵~确实一个人做起来简直是困难,但是

课堂练习之电梯调度

一.题目:电梯调度 二.要求 1.在一楼,每个乘客选择自己的目的层,电梯则自动计算出应停的楼层 2.电梯停在哪一楼层,能够保证乘坐电梯的所有乘客爬楼梯的层数之和最少 三.解题思路 假设电梯停在i层,我们可以计算出所有乘客总共需要爬楼梯的层数Y. 假设有N1个乘客在i层楼以下,N2个乘客在第i层楼,还有N3个乘客在第i层楼以上. 这个时候,如果电梯改停在i-1层,所有目的地在第i层及以上的乘客都需要多爬一层,即N2+N3层,而所有目的地在i-1层及以下的乘客可以少爬一层,总共可以少爬N1层. 因此

“电梯调度”需求分析

“电梯调度”需求分析 一.项目背景 试想一下,石家庄铁道大学基础教学楼的电梯配置如下:大厦有18层, 4部电梯,很多乘客使用这些电梯的日常(旅客重量:平均70公斤最大120公斤,最小45公斤).其他常量数据:电梯速度,开/关门时间,乘客的时间要在/走出电梯.可以对这些合理的假设. 二.数据分析 我们随机选择了一天去现场调查基础教学楼电梯的使用情况,列表如下: 电梯名称 停靠层数 乘客限制 重量限制/kg 电梯1 8-18层(双层) 15人 1150 电梯2 8-18层(双层) 15人 1150

软件工程作业之电梯调度

问题描述: 某大楼共有20层,现安装4个电梯参数如下: 1号电梯 全楼层 最大负载800kg 2号电梯 单数层 最大负载800kg 3号电梯 双数层 最大负载1600kg 4号电梯 全楼层 最大负载2000kg 分析: 4个电梯是相互独立工作的,那么分为4个相互独立的调度模块.1号电梯与4号电梯均服务于全楼层且仅有最大负载不同,而2号和3号电梯 服务模式类似.那么1.4号电梯调度模块可合并为一个.同样地,2.3号模块也可以合并.电梯调度的核心功能是接受不同楼层用户的请求并相应,而同一部电梯某时刻