zoukankan      html  css  js  c++  java
  • 电梯调度

    一、题目要求

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

    二、设计思路

    如果采用遍历的方法,这道题目还是比较容易实现的,这样它的时间复杂度就是N^2。

    但是由于这是一个算法优化题所以这样设计:

    N0是i-1楼人数,N1是i楼人数,N2是i+1楼人数

    Y0是停在i-1楼所有人爬楼数,Y1是停在i楼所有人爬楼数,Y2是停在i+1楼所有人爬楼数,三者之间有这样的关系:

    Y0=Y1-(N0-N1-N2);Y2=Y1-(N2-N0-N1)。

    当N0>N1+N2时,Y0<Y1,再比较N0-N1-N2和N2-N0-N1的大小,若前者大则停在i-1层;

    当N2>N0+N1时,Y0<Y1,再比较N0-N1-N2和N2-N0-N1的大小,若后者大则停在i+1层;

    否则就停在第i层。

    三、代码

     1 #include "stdafx.h"
     2 #include <iostream>
     3 using namespace std;
     4 /*自动获取楼层人数*/
     5 void stair(int A[])
     6 {
     7     int length,count;
     8     cout<<"请输入一层时电梯内人数:";
     9     cin>>length;
    10     int *a=new int[length];
    11     cout<<"请输入每个人所按的楼梯层数:";
    12     for(int i=0;i<length;i++)
    13     {
    14             cin>>a[i];
    15             A[a[i]]=A[a[i]]+1;
    16     }
    17 }
    18 int main()
    19 {
    20      int N = 18;
    21      int nPerson[19];
    22      int nMinFloor,nTargetFloor;
    23      int N1,N2,N3;                        //N1表示当前层以下的人数,N2表示当前层人数,N3表示当前层以上人数
    24      nTargetFloor = 1;                    //起始位置为一层
    25      /*也可以通过确定每层的人数确定楼层
    26      cout<<"请输入到达每层的乘客人数(1-18层):"<<endl;
    27       nPerson[0]=0;
    28      for(int i=1;i<=N;i++)
    29      {
    30          cin>>nPerson[i];
    31      }*/
    32      for(int i=0;i<19;i++)
    33      {
    34          nPerson[i]=0;
    35      }
    36      stair(nPerson);
    37      N1 = N3 = nMinFloor = 0;
    38      N2 = nPerson[1];
    39      //得到nTargetFloor等于1时各变量的值
    40      for(int i = 2; i <= N; i++)
    41      {
    42           N3 += nPerson[i];                //当前层以上的人数
    43           nMinFloor += nPerson[i] * (i-1);            //总共所需要的楼层数
    44      }
    45      for(int i=2;i<=N;i++)
    46      {
    47           if(N1 + N2 < N3)
    48           {
    49                nTargetFloor = i;                //当前停的楼层数
    50                nMinFloor += (N1 + N2 - N3);        //最小楼层数
    51                N1 += N2;                        //每次变化楼层,相应楼层人数发生变化
    52                N2 = nPerson[i];
    53                N3 -= nPerson[i];
    54           }
    55           else
    56           {
    57                break;
    58           }
    59      }
    60      cout<<"所停楼层:"<<nTargetFloor<<endl;
    61      cout<<"最小楼层数:"<<nMinFloor<<endl;
    62      return 0;
    63 }

    四、运行截图

    五、总结

    采用合适的算法可以设计出更高效的程序,单单能实现要求不足以成为一个优秀的程序员,还需努力。

  • 相关阅读:
    补点基础:Javascript中的类和闭包
    Extjs学习笔记之五——一个小细节renderTo和applyTo的区别
    Extjs学习笔记之八——继承和事件基础
    总结一篇
    再补点基础:Javascript的构造函数和constructor属性
    Extjs学习笔记之六——面版
    Extjs学习笔记之七——布局
    Extjs学习笔记之九——数据模型(上)
    引擎功率与扭矩哪个比较重要
    毕业三年,同学基本都辞职了,大部分人看完很有同感~
  • 原文地址:https://www.cnblogs.com/zglsh/p/4439477.html
Copyright © 2011-2022 走看看