一、问题描述
•石家庄铁道大学基础大楼一共有四部电梯,每层都有人上下,电梯在每层都停。信1201-1班的张一东觉得在每层都停觉得不耐烦。
•由于楼层不太高,在上下课高峰期时时,电梯从一层上行,但只允许停在某一楼层。在一楼时,每个乘客选择自己的目的层,电梯则自动计算出应停的楼层。
•问电梯停在那一楼层,能够保证这次乘坐电梯的所有乘客爬楼梯的层数之和最少。
二、设计思想
根据乘客的输入楼层,对电梯到达每一楼层时进行计算,然后将其结果存放到一个数组里,比较得出最小的值
并输入。
三、源代码
#include "stdafx.h" #include <stdio.h> #define HIGH 6 #define N 15 void scan(int Input[],int floor[],int num) //用户输入所要到达的楼层 { int i; do { printf("请输入进入电梯的人数(最多15人):"); scanf("%d",&num); if(num>15) printf("您的输入有误! "); }while(num>15); printf("请输入每个人到达的楼层:"); for(i = 0;i<num;i++) { scanf("%d",&Input[i]); } for(i=0;i<num;i++) //对输入的楼层进行计算 { switch(Input[i]) { case 1: floor[Input[i]] = floor[Input[i]]+1; break; case 2: floor[Input[i]] = floor[Input[i]]+1; break; case 3: floor[Input[i]] = floor[Input[i]]+1; break; case 4: floor[Input[i]] = floor[Input[i]]+1; break; case 5: floor[Input[i]] = floor[Input[i]]+1; break; case 6: floor[Input[i]] = floor[Input[i]]+1; break; default: printf("楼层不对!"); break; } } } void count(int sum[],int floor[]) //对到达每层时要走的楼层总数计算 { int i,j; for(i=1;i<HIGH+1;i++) { for(j = 1;j<HIGH+1;j++) { if(j<=i) sum[i] = sum[i]+floor[j]*(i-j); else sum[i] = sum[i]+floor[j]*(j-i); } } } void Min(int sum[]) //求出最小的值,并输出楼层 { int min,sign; min = sum[1]; sign = 1; //用以标记最小值所在的楼层 for(int i=1;i<HIGH+1;i++) { if(sum[i]<min) { min = sum[i]; sign = i; } } printf("最少所走的总层数为%d,在第%d层。 ",min,sign); } int main(int argc, char* argv[]) { int num; //电梯内的人数 int floor[HIGH+1]={0,0,0,0,0,0,0}; //用于存放到达每层楼的人数,初始每层楼的人数是0 int Input[N]; //用于存放到用户输入的楼层 int sum[HIGH+1]={0,0,0,0,0,0,0}; for(int i=0;i<0;i++) { Input[i] = 0; //初始化输入的为零 } scan(Input,floor,num); count(sum,floor); Min(sum); return 0; }
四、运行结果
五、总结
我没有采用老师说的那种算法,而是用了最简单的办法,就是一个一个的算出来,在代码的实现方面并没有遇到什么困难。
我的代码设计的是六层高度,根据输入,然后将输入的楼层依次存放在floor[]的数组中,每层 i 每输入依次,则该楼层floor[i]
就加一,最后根据floor[]中的数,算出最小的值。值得一说的是,我把floor[]的长度规定成了7,比楼层的数目要多1,这是因为
这样在输出和计算的时候比较方便的实现。