一、题目:
石家庄铁道大学基础大楼高18层,共有四部电梯。在上下课高峰期时,电梯从一楼上行,但只允许停在某一楼层。在一楼时,每个乘客选择自己的目的层,电梯则自动计算出应停的楼层。设计算法算出电梯停在哪一楼层能够保证这次乘坐电梯的所有人爬楼梯的层数之和最少。
二、设计思路:
输入楼层有一个for循环,便利最小楼层数时需要嵌套for循环。
获取所有乘客要爬的楼层数方法如下:从2楼一直便利到18楼,每一层都计算出所有乘客要爬的楼层数。乘客要去的的楼层和当前停的楼层数之差绝对值就是该乘客要爬的楼层数,每位乘客相加即为总和。循环比较,选出最小的。
三、源代码:
1 //电梯调度——胡亚宝——2015/04/18 2 3 #include "stdafx.h" 4 5 6 int _tmain(int argc, _TCHAR* argv[]) 7 { 8 int innum,diantinum[18],sum,flag; 9 10 printf("请输入进入电梯人数:"); 11 scanf("%d",&innum); 12 printf("请输入每个人要去的楼层数:"); 13 for(int i=0;i<innum;i++) 14 { 15 scanf("%d",&diantinum[i]); 16 if((diantinum[i]<0)||(diantinum[i]>18)) 17 { 18 printf("楼层数错误,请重新输入!"); 19 scanf("%d",&diantinum[i]); 20 } 21 22 } 23 int min=18*innum; 24 for(int j=2;j<=18;j++) 25 { 26 int sum1=0,sum2=0; 27 for(int k=0;k<innum;k++) 28 { 29 if(diantinum[k]<=j) 30 sum1+=j-diantinum[k]; 31 if(diantinum[k]>j) 32 sum2+=diantinum[k]-j; 33 } 34 sum=sum1+sum2; 35 if(sum<min) 36 { 37 min=sum; 38 flag=j; 39 } 40 } 41 printf("电梯停在%d层,请注意不要错过。 ",flag); 42 return 0; 43 }
四、运行结果:
五、心得体会:
题目要求是在高峰期只能从一楼上到某一合适的楼层下,当乘客进入电梯后按下自己要去的楼层。最容易想到的方法是获取每位乘客要去的楼层后,从2楼遍历到18楼,计算出每一层停时,所有乘客需要爬的楼层总数。
我的方法需要用到for循环的嵌套,时间复杂度为O(n*n)。
这个算法基本能实现电梯调度的要求,但是比较繁琐。