代码改变世界

课堂练习——电梯调度

2015-04-18 09:47  奔波儿灞  阅读(152)  评论(0编辑  收藏  举报
题目:石家庄铁道大学基础大楼一共有四部电梯,每层都有人上下,电梯在每层都停。由于楼层不太高,在上下课高峰期时时,电梯从一层上行,但只允许停在某一楼层。在一楼时,每个乘客选择自己的目的层,电梯则自动计算出应停的楼层。
问电梯停在那一楼层,能够保证这次乘坐电梯的所有乘客爬楼梯的层数之和最少。
一、设计思路
      基础大楼共有18层,则电梯可停2-18层,假设一部电梯每次最多乘20人。进入电梯之后,每人先输入要去的楼层,则程序开始计算在各楼层情况下,电梯乘客的上下楼总和,并比较大小,当取得最小值时,电梯则应该在该层停下。
二、源代码
//楼梯起止为2-18层,人数上限为20人
#include<iostream.h>
#include<math.h>
int fl[20]={0};                   //存储各楼层有几名乘客
int sum[20]={0};               //存储各楼层乘客上下楼总和
int Min(int a[])                    //计算最小楼层
{
   int min=a[2];
   int i;
   int j=2;
   for(i=3;i<=18;i++)
   {
      if(min>a[i])
      {
         min=a[i];
         j=i;
      }
   }
   return j;
}
int main()
{
   int n;                                     //输入的乘客人数
   int m;                                     //判断楼层
   int i;
   int j;
   cout<<"请输入电梯人数:"<<endl;//n<=20
   cin>>n;
   cout<<"请选择要去的楼层:"<<endl;
   for(i=0;i<n;i++)
   {
      cin>>m;            //2<=m<=18
      fl[m]++;
   }
   for(i=2;i<=18;i++)
   {
      for(j=2;j<=18;j++)
      {
                    if(fl[j]==0)
                      continue;
                    else
  
 
           sum[i]=sum[i]+abs(j-i)*fl[j];
      }
   }
   cout<<"电梯应该在第"<<Min(sum)<<"层停。"<<endl;
   return 0;
}

 

三、运行结果
四、个人总结
      这是一道优化题,并不是实现题,所以当程序实现时,我们要减少冗余运算,比如在上述程序中,当某楼层无人前往时,则计算上下楼总和时,则可以不计算该层人数。可以直接用continue语句跳过,减少毫无用处的运算。