zoukankan      html  css  js  c++  java
  • 课堂作业——电梯调度

    一、题目和要求

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

    二,思路

    基本实现可以采用枚举法,即每到一个楼层,就要计算出所有人上下的情况,将所有人上下楼层数和相加然后求出其中最小值。但是,如果采用这种方式,代码时间复杂度较高,为O(n^2),于是我采用了上课老师讲述的方法。

    具体设计思路:假设想去往第i-1层,第i层,第i+1层的学生人数分别为N2,N1,N3。设电梯停在第i层,则所有人的爬楼总和为Y=N2+N3;依次类推,若电梯停在第i-1层,爬楼总和为Y-N2+N1+N3;若电梯停在第i+1层,爬楼总和为Y-N3+N1+N2;

    假设电梯停在第i层最好。

    当Y>Y-N2+N1+N3,即N2-N1-N3<0,即N1+N3<N2,电梯停在第i-1层较好。

    当Y>Y-N3+N1+N2,即N3-N2-N1>0,即N1+N2<N3,电梯停在第i+1层较好。

    三,实现代码

    #include <iostream.h>

    #include<conio.h>

    void dianti(int Arr[]);

    int main()

    {

         int max = 18;//电梯的最高楼层为18层

         int man[20];//电梯内最多能承载20人

         int min,stop;//最小爬楼数,和电梯应停的楼层数

         int N1,N2,N3;

      int jixu;

      min=0;

         stop = 1;                                                      for(int i=0;i<20;i++)

         {

             man[i]=0;

         }

         dianti(man);

         N1 = N3  = 0;

         N2 = man[1];

         

         for( i = 2; i <= max; i++)

         {

              N3 += man[i];               

              min=min+ man[i] * (i-1);           

         }

         for( i=2;i<=max;i++)

         {

              if(N1 + N2 < N3)

              {

                   stop = i;               

                   min=min+(N1 + N2 - N3);     

                   N1 += N2;                       

                   N2 = man[i];

                   N3 =N3- man[i];

              }

              else

              {

                   break;

              }

         }

         cout<<"电梯应停在第"<<stop<<"层"<<endl;

         cout<<"所有人爬楼最小层数和为"<<min<<"层"<<endl;

     cout<<"要继续测试吗?jixu(0,退出 1,继续)"<<endl;  cin>>jixu;  if(jixu==1)  {   cout<<endl;   main();  }  else  {   return 0;

     }  getch();  return 0;

    } void dianti(int Arr[])

    {

        int n;

        cout<<"请输入一层时电梯内人数:";

        cin>>n;

        int *a=new int[n];

        cout<<"请输入每个人所按的楼梯层数:";

        for(int i=0;i<n;i++)

        {

                cin>>a[i];

                Arr[a[i]]=Arr[a[i]]+1;

        } }

     四,实验结果

    五,实验总结

    这次实验开始时没有明确思路,但老师上课讲的思路听明白了,所以就按老师上课讲的思路进行编程。最终完成了本次实验。

  • 相关阅读:
    excel数据导入mySql数据库
    springboot-devtools实现项目的自动重启
    Java中List, Integer[], int[]的相互转换
    Postman代码测试工具如何用?
    git提交代码时,Unstaged changes如何过滤.class .log等文件
    Json字符串转map集合
    实现hibernate 的validator校验
    [转载]OpenSSL中文手册之命令行详解(未完待续)
    Openssl ASN.1 说明一 分享
    [转载]Parsing X.509 Certificates with OpenSSL and C
  • 原文地址:https://www.cnblogs.com/xiaojin123/p/4439586.html
Copyright © 2011-2022 走看看