• 电梯调度练习


    一、题目

    石家庄铁道大学基础大楼一共有四部电梯,每层都有人上下,电梯在每层都停。信1201-1班的张一东觉得在每层都停觉得不耐烦。
    由于楼层不太高,在上下课高峰期时时,电梯从一层上行,但只允许停在某一楼层。在一楼时,每个乘客选择自己的目的层,电梯则自动计算出应停的楼层。
    问电梯停在那一楼层,能够保证这次乘坐电梯的所有乘客爬楼梯的层数之和最少。
    二、设计思想
    课上老师提供了一种思路,即假设电梯停在第i层时所有乘客爬楼梯的层数之和最少,此时所有乘客总共要爬的层数为Y。如果有N1个乘客到i-1层,有N2个乘客到i层,N3个乘客到i+1层。若电梯停在第i-1层,所有乘客总共要爬的层数为Y-(N1-N2-N3);若电梯停在i+1层,所有乘客总共要爬的层数为Y+(N1+N2-N3)。所以N1>N2+N3时,电梯应停在i-1层;N3>N1+N2时,电梯应停在i+1层;否则应停在i层。在此思路的基础上,和结对的同学讨论决定用所有楼层的平均值当第i层,并与小于i层的和大于i层的比较找出最合适的。
    三、代码
     1 #include<iostream.h>
     2 #include <stdio.h>
     3 #include<math.h>
     4 void jisuan(int &y,int dian[],int n ,int ave)
     5 {
     6     int i=0;
     7     y=0;
     8     for(i=0;i<n;i++)
     9     {
    10         y=y+abs(dian[i]-ave);
    11     }
    12 }
    13 void main()
    14 {
    15     int dian[10]; //电梯只能容纳十个人
    16     int i,n=0,ave,sum=0,y=0,x=0,z=0;
    17     for(i=0;i<10;i++)
    18     {
    19         cout<<"请输入您要去的楼层(1-18),输入0表示电梯开始运行"<<endl;
    20         cin>>dian[i];
    21         if(dian[i]==0)
    22         {
    23             break;
    24         }
    25         else
    26         {
    27             sum=sum+dian[i];
    28             n++;
    29         }
    30     }
    31     ave=sum/n;
    32     jisuan(y,dian,n,ave);
    33     jisuan(x,dian,n,ave+1);
    34     jisuan(z,dian,n,ave-1);
    35     if(y>x)
    36     {
    37         while(1)
    38         {
    39             if(y>x)
    40             {
    41                 y=x;
    42                 ave=ave+1;
    43                 jisuan(y,dian,n,ave);
    44                 jisuan(x,dian,n,ave+1);
    45             }
    46             else
    47             {
    48                 break;}
    49         }
    50     }
    51     else
    52     {
    53         if(y>z)
    54         {
    55             while(1)
    56             {
    57                 if(y>z)
    58                 {
    59                     y=z;
    60                     ave=ave+1;
    61                     jisuan(y,dian,n,ave);
    62                     jisuan(z,dian,n,ave+1);
    63                 }
    64                 else
    65                 {
    66                     break;
    67                 }
    68             }
    69         }
    70     }
    71     cout<<"最佳楼层是:"<<ave<<endl<<"一共要爬的楼层数是:"<<y<<endl;
    72 }

    四、运行结果截图

    五、总结
    此次题目用最基本的遍历算法,计算所有情况也可以实现,但时间复杂度高。这正是一道优化题目,通过此题我接触了优化类的问题,明白了程序不仅要实现,还要尽量优化算法。
  • 相关阅读:
    个人浏览器安装的插件
    angularjs 1 Failed to read the 'selectionStart' property from 'HTMLInputElement':
    git 配置用户名和邮箱
    修改Atom 隐藏.gitignore忽略的文件/文件夹的配置
    Ubuntu 安装php_intl 扩展
    yii2 ./yii command : No such file or directory
    vagrant yii2 Exception 'yiidbException' with message 'SQLSTATE[HY000] [2002]
    [转载]Ubuntu 14.04设置固定ip
    [转载]删除所有的.svn文件夹
    Centos7.2正常启动关闭CDH5.16.1
  • 原文地址:https://www.cnblogs.com/dr73/p/4440019.html
Copyright © 2020-2023  润新知