题目:石家庄铁道大学基础大楼一共有四部电梯,每层都有人上下,电梯在每层都停。由于楼层不太高,在上下课高峰期时时,电梯从一层上行,但只允许停在某一楼层。在一楼时,每个乘客选择自己的目的层,电梯则自动计算出应停的楼层。
问电梯停在那一楼层,能够保证这次乘坐电梯的所有乘客爬楼梯的层数之和最少。
一、设计思路
基础大楼共有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语句跳过,减少毫无用处的运算。
课堂练习——电梯调度
原文:http://www.cnblogs.com/benboerba/p/4436776.html