电梯调度——课堂练习

一、设计思路

      题目要求:

      石家庄铁道大学基础大楼一共有四部电梯,每层都有人上下,电梯在每层都停。信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 }

四、运行结果截图

     源程序结果截图:

      

     测试结果截图:

      

五、总结与心得

      在该实验中,对乘坐电梯的人数没有合理的处理,直接输出乘坐人数显然不合理的;另外,在计算电梯停在哪一层的算法也有待优化,但是对我来说,那些优化的算法理解起来有点不方便,故而也就用我自己方式来解决了,从这一方面来看,自己要学习的东西还有很多,以后要继续努力;最后一点我一直认为适合自己的方法才是好方法,至于那些高级的方法,就需要自己多加努力去攻克了,争取让它也成为自己的第一选择。

 

posted @ 2015-04-18 18:50  快乐宝贝hyp  阅读(144)  评论(0编辑  收藏  举报