一、题目要求
石家庄铁道大学基础大楼一共有四部电梯,每层都有人上下,电梯在每层都停。信1201-1班的张一东觉得在每层都停觉得不耐烦。
由于楼层不太高,在上下课高峰期时时,电梯从一层上行,但只允许停在某一楼层。在一楼时,每个乘客选择自己的目的层,电梯则自动计算出应停的楼层。
问电梯停在那一楼层,能够保证这次乘坐电梯的所有乘客爬楼梯的层数之和最少。
二、设计思想
对于一个i层, 假设数组中比i层小的有LNum个,等于i层的有ENum个,大于i层的有BNum个。用Yi代表i与数组中每个数差的绝对值之和。有Y(i) = m;
当i+1时,设等于i+1的数有midNext个,则此时:
小于i+1的数有 LNum+ENum个
大于i+1的数有 LNum-ENum个
相比较Y(i)的情况, 位于i+1左边所有数与i+1的差的绝对值,增加了LNum+ENum
相比较Y(i)的情况, 位于i+1左边所有数与i+1的差的绝对值,减少了 LNum-ENum
Y(i+1) = Y(i) +LNum+ ENum -(BNum-ENum);
ENum= midNext;
三、源代码
1 #include "stdio.h" 2 #include "stdlib.h" 3 #define MAX 1000 4 void getFloorNum(int *input, int size) 5 { 6 int result[MAX] = {0}; 7 int LNum,ENum,BNum; //分别表示小于、等于、大于第i个数 8 int cur,l,b,i,count; 9 int max1=1000; 10 l = b = 0; 11 cur = 0; 12 LNum = 0; 13 BNum = size; 14 ENum = 0; 15 for(i = 0;i<size;i++){ 16 b+=input[i]; 17 } 18 result[0] = b; 19 printf("停在各楼层时爬楼梯的总和分别为: "); 20 for(i=1;i<=input[size-1];i++){ 21 LNum += ENum; 22 BNum -= ENum; 23 b -= BNum; 24 l += LNum; 25 result[i] = l + b; 26 printf ( " %d = %d ",i, result[i] ); 27 if(result[i]<max1) 28 { 29 count=i; 30 max1=result[i]; 31 } 32 ENum = 0; 33 while(input[cur] == i){ 34 cur++; 35 ENum++; 36 } 37 } 38 printf("爬电梯总数最少的楼层是:%d ",count); 39 } 40 int main(void) 41 { 42 int inperson; 43 int input[MAX]; 44 printf("进电梯的人数:"); 45 scanf("%d",&inperson); 46 printf("请输入每个人按下的楼层数 "); 47 for(int i=0;i<inperson;i++) 48 { 49 scanf("%d",&input[i]); 50 } 51 getFloorNum(input,inperson); 52 return 0; 53 54 }
四、运行结果截图
五、心得体会
上课时听的糊里糊涂的,课下又和同学们交流,查资料才大致有些明白,我们要自己去寻找简便方法,提高自己的能力。