电梯调度——课堂练习
一、设计思路
题目要求:
石家庄铁道大学基础大楼一共有四部电梯,每层都有人上下,电梯在每层都停。信1201-1班的张一东觉得在每层都停觉得不耐烦。 由于楼层不太高,在上下课高峰期时时,电梯从一层上行,但只允许停在某一楼层。在一楼时,每个乘客选择自己的目的层,电梯则自动计算出应停的楼层。 问电梯停在那一楼层,能够保证这次乘坐电梯的所有乘客爬楼梯的层数之和最少。
设计思路:
我采用最笨的方法来实现该程序:
1、在不超载的情况下,根据乘电梯的人数来对应输入每个人所要到达的楼层;
2、找出所有目的楼层的最大值和最小值,确定电梯停下的楼层范围;
3、系统自动算出在目的楼层范围内所有人所要爬楼的总层数sum;
4、求出sum的最小值和最小值对应的楼层数,则该楼层数就是电梯停止的层数。
二、源程序代码
1 // dianti.cpp : 定义控制台应用程序的入口点。
2 //
3
4 #include "stdafx.h"
5 #include<iostream>
6 #include<math.h>
7 using namespace std;
8 int main()
9 {
10 int i,j;//i表示乘电梯的人数,j表示电梯停留的层数(j<=20)
11 int m;//m表示电梯在第m层停下
12 int sum[18],summin;//sum所有人需要爬楼的层数总和,min表示sumsum的最小值
13 int max=2,min,n=0;//max表示在一楼时所有人的想去楼层中德最高楼层,n表示总人数
14 int a[15]={0};//电梯限载15人,a[i]表示去第i个人要去的楼层
15 cout<<"请输入乘电梯的人数:"<<endl;
16 cin>>n;
17 cout<<"请输入您想要去的楼层:"<<endl;
18 for(i = 0;i < n;i++)
19 {
20 cin>>a[i]; //a[i]表示去第i+1个人要去的楼层
21 if(a[i] <= 1)
22 {
23 cout<<"输入错误,请重新输入!"<<"\t";
24 cin>>a[i]; //a[i]表示去第i个人要去的楼层
25 }
26 }
27 min = a[0];
28 for(i = 0;i < n;i++)
29 {
30 if(a[i] > max)
31 {
32 max = a[i];
33 }
34 if(a[i] <= min)
35 {
36 min = a[i];
37 }
38 }
39 for(j = min;j <= max;j++)
40 {
41 sum[j] = 0;
42 for(i = 0;i < n;i++)
43 {
44 sum[j] += abs(a[i] - j);
45 }
46 }
47 summin = sum[min];
48 m = min;
49 for(j = min;j <= max;j++)
50 {
51 if(sum[j] < summin )
52 {
53 summin = sum[j];
54 m = j;
55 }
56 }
57 cout<<"电梯停在第"<<m<<"层"<<endl;
58 return 0;
59 }
三、测试代码
1 // dianti.cpp : 定义控制台应用程序的入口点。
2 //
3
4 #include "stdafx.h"
5 #include<iostream>
6 #include<math.h>
7 using namespace std;
8 int main()
9 {
10 int i,j;//i表示乘电梯的人数,j表示电梯停留的层数(j<=20)
11 int m;//m表示电梯在第m层停下
12 int sum[18],summin;//sum所有人需要爬楼的层数总和,min表示sumsum的最小值
13 int max=2,min,n=0;//max表示在一楼时所有人的想去楼层中德最高楼层,n表示总人数
14 int a[15]={0};//电梯限载15人,a[i]表示去第i个人要去的楼层
15 cout<<"请输入乘电梯的人数:"<<endl;
16 cin>>n;
17 cout<<"请输入您想要去的楼层:"<<endl;
18 for(i = 0;i < n;i++)
19 {
20 cin>>a[i]; //a[i]表示去第i+1个人要去的楼层
21 if(a[i] <= 1)
22 {
23 cout<<"输入错误,请重新输入!"<<"\t";
24 cin>>a[i]; //a[i]表示去第i个人要去的楼层
25 }
26 }
27 min = a[0];
28 for(i = 0;i < n;i++)
29 {
30 if(a[i] > max)
31 {
32 max = a[i];
33 }
34 if(a[i] <= min)
35 {
36 min = a[i];
37 }
38 }
39 cout<<"目的楼层的范围:"<<max<<"——"<<min<<endl;
40 cout<<"每层楼对应的要爬的楼层数总和:"<<endl;
41 for(j = min;j <= max;j++)
42 {
43 sum[j] = 0;
44 for(i = 0;i < n;i++)
45 {
46 sum[j] += abs(a[i] - j);
47 }
48 cout<<j<<":"<<sum[j]<<endl;
49 }
50
51 summin = sum[min];
52 m = min;
53 for(j = min;j <= max;j++)
54 {
55 if(sum[j] < summin )
56 {
57 summin = sum[j];
58 m = j;
59 }
60 }
61 cout<<"电梯停在第"<<m<<"层"<<endl;
62 return 0;
63 }
四、运行结果截图
源程序结果截图:
测试结果截图:
五、总结与心得
在该实验中,对乘坐电梯的人数没有合理的处理,直接输出乘坐人数显然不合理的;另外,在计算电梯停在哪一层的算法也有待优化,但是对我来说,那些优化的算法理解起来有点不方便,故而也就用我自己方式来解决了,从这一方面来看,自己要学习的东西还有很多,以后要继续努力;最后一点我一直认为适合自己的方法才是好方法,至于那些高级的方法,就需要自己多加努力去攻克了,争取让它也成为自己的第一选择。