一、设计思路
(1)将乘客要去的楼层数存起来。
(2)假设yi为乘客要爬楼层数之和,yi=n1*|(n1-ni)|+n2*|(n2-ni)|+..+n18*|(n18-ni)|
(3)比较y1到y18的值,找出最小的。
(4)输出结果
二、源代码
#include "iostream.h" #include "stdlib.h" #define MAXSIZE 15 void Input(int &num,int flour[]) //输入乘坐电梯的人数及楼层 { cout<<"**************电梯调度小程序***************"<<endl; cout<<"请输入乘坐电梯的人数(限定15人):"; cin>>num; cout<<endl; if(num>15) { cout<<"输入错误!"<<endl; exit(0); } cout<<"请输入每个人要去的层数(最高18层):"; for(int i=0;i<num;i++) { cin>>flour[i]; if(flour[i]>18) { cout<<"输入错误!"<<endl; exit(0); } } } void getSmallestFlour(int num,int flour[],int &small) //计算出爬楼梯层数最少的楼层 { int sum,temp=small; int highest,lowest; highest=lowest=flour[0]; for(int i=0;i<num;i++) //找出要去的楼层中最高的楼层 { if(flour[i]>highest) { highest=flour[i]; } else //找出最低楼层 { lowest=flour[i]; } } for(i=lowest;i<=highest;i++) //从最低楼层开始遍历直到最高楼层 { sum=0; for(int j=0;j<num;j++) { if((flour[j]-i)<0) //计算爬楼梯的层数之和 { sum=sum+i-flour[j]; } else { sum=sum+flour[j]-i; } } cout<<endl; cout<<"当电梯停在"<<i<<"层,则乘客爬楼梯的总和为"<<sum<<endl; cout<<endl; if(sum<temp) { small=i; //记录和最小的楼层号 temp=sum; //记录最小的和 } } } int main(int argc, char* argv[]) { int num,aver,flour[MAXSIZE]; Input(num,flour); aver=0; for(int i=0;i<num;i++) { aver+=flour[i]; } getSmallestFlour(num,flour,aver); cout<<"电梯将停在"<<aver<<"层。"<<endl; cout<<endl; return 0; }
三、运行结果截图
四、心得体会
虽然我认为这个电梯算法不符合人性化,但是它最有力的解决堵塞问题。遇到问题主要是逻辑一开始有点乱。