一、题目
石家庄铁道大学基础大楼一共有四部电梯,每层都有人上下,电梯在每层都停。信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 }
四、运行结果截图
五、总结
此次题目用最基本的遍历算法,计算所有情况也可以实现,但时间复杂度高。这正是一道优化题目,通过此题我接触了优化类的问题,明白了程序不仅要实现,还要尽量优化算法。