一、题目要求
•石家庄铁道大学基础大楼一共有四部电梯,每层都有人上下,电梯在每层都停。信1201-1班的张一东觉得在每层都停觉得不耐烦。
•由于楼层不太高,在上下课高峰期时时,电梯从一层上行,但只允许停在某一楼层。在一楼时,每个乘客选择自己的目的层,电梯则自动计算出应停的楼层。
•问电梯停在那一楼层,能够保证这次乘坐电梯的所有乘客爬楼梯的层数之和最少。
二、设计思想
对于一个i层, 假设数组中比i层小的有lcount个,等于i层的有mcount个,大于i层的有rcount个。用Yi代表i与数组中每个数差的绝对值之和。有Y(i) = m;
当i+1时,设等于i+1的数有midNext个,则此时:
小于i+1的数有 lcount+mcount个
大于i+1的数有 rcount-mcount个
相比较Y(i)的情况, 位于i+1左边所有数与i+1的差的绝对值,增加了lcount+mcount
相比较Y(i)的情况, 位于i+1左边所有数与i+1的差的绝对值,减少了 rcount-mcount
Y(i+1) = Y(i) + lcount + mcount -(rcount-mcount);
mcount = midNext;
三、代码实现
1 #include "stdafx.h" 2 #include "stdlib.h" 3 4 #define MAX 1000 5 void getFloorNo(int *input, int size) 6 { 7 int result[MAX] = {0}; 8 int lcount,mcount,rcount; //分别表示小于、等于、大于第i个数 9 int cur; 10 int l,r; 11 int i; 12 l = r = 0; 13 cur = 0; 14 lcount = 0; 15 rcount = size; 16 mcount = 0; 17 for(i = 0;i<size;i++){ 18 r+=input[i]; 19 } 20 result[0] = r; 21 printf("停在各楼层时爬楼梯的总和分别为: "); 22 for(i=1;i<=input[size-1];i++){ 23 lcount += mcount; 24 rcount -= mcount; 25 r -= rcount; 26 l += lcount; 27 result[i] = l + r; 28 printf ( " %d = %d ",i, result[i] ); 29 mcount = 0; 30 while(input[cur] == i){ 31 cur++; 32 mcount++; 33 } 34 } 35 } 36 37 38 int main(void) 39 { 40 int nperson; 41 int input[MAX]; 42 printf("进电梯的人数:"); 43 scanf("%d",&nperson); 44 printf("请输入每个人进入电梯后按下的楼层数 "); 45 for(int i=0;i<nperson;i++) 46 { 47 scanf("%d",&input[i]); 48 } 49 getFloorNo(input,nperson); 50 return 0; 51 52 }
四、运行结果
根据运行结果可知,电梯停靠在地5层时爬楼层数最少,为12层
五、总结
一开始没明白老师说的什么意思,理解为1-9层(假设)的话找到其中间层数就好了,但是题目要求要计算每个楼层每个人的爬楼梯数总和的最小值。
后来经过老师的讲解明白了调度过程。感觉自己在编程上有待提高,思维还不够活跃。。。会继续努力的