标签:
一、设计思路
本来我的思路是根据上楼的人数和上楼的层数来计算出平均值,但是我发现这个思路不对。于是我选择了最笨的方法,复杂度为O(n2)。
(1)输入坐电梯的人数和要去的楼层;
(2)找到输入楼层里最高的,这样可以减少遍历的次数;
(3)从最低楼层开始遍历,直到最高层。内部循环计算每个人所要爬楼的层数之和,并比较找出最小的。
(4)输出结果
二、源代码
1 // 电梯.cpp : Defines the entry point for the console application. 2 // 3 4 #include "stdafx.h" 5 #include "iostream.h" 6 #include "stdlib.h" 7 #define MAXSIZE 15 8 9 void Input(int &num,int flour[]) //输入乘坐电梯的人数及楼层 10 { 11 cout<<"请输入乘坐电梯的人数(限定15人):"; 12 cin>>num; 13 if(num>15) 14 { 15 cout<<"输入错误!"<<endl; 16 exit(0); 17 } 18 cout<<"请输入每个人要去的层数(最高18层):"; 19 for(int i=0;i<num;i++) 20 { 21 cin>>flour[i]; 22 if(flour[i]>18) 23 { 24 cout<<"输入错误!"<<endl; 25 exit(0); 26 } 27 } 28 } 29 void getSmallestFlour(int num,int flour[],int &small) //计算出爬楼梯层数最少的楼层 30 { 31 int sum,temp=small; 32 int highest,lowest; 33 highest=lowest=flour[0]; 34 for(int i=0;i<num;i++) //找出要去的楼层中最高的楼层 35 { 36 if(flour[i]>highest) 37 { 38 highest=flour[i]; 39 } 40 else //找出最低楼层 41 { 42 lowest=flour[i]; 43 } 44 } 45 for(i=lowest;i<=highest;i++) //从最低楼层开始遍历直到最高楼层 46 { 47 sum=0; 48 for(int j=0;j<num;j++) 49 { 50 if((flour[j]-i)<0) //计算爬楼梯的层数之和 51 { 52 sum=sum+i-flour[j]; 53 } 54 else 55 { 56 sum=sum+flour[j]-i; 57 } 58 } 59 cout<<"若停在"<<i<<"层,则爬楼梯的总和为"<<sum<<endl; 60 if(sum<temp) 61 { 62 small=i; //记录和最小的楼层号 63 temp=sum; //记录最小的和 64 } 65 } 66 } 67 68 int main(int argc, char* argv[]) 69 { 70 int num,aver,flour[MAXSIZE]; 71 Input(num,flour); 72 aver=0; 73 for(int i=0;i<num;i++) 74 { 75 aver+=flour[i]; 76 } 77 getSmallestFlour(num,flour,aver); 78 cout<<"电梯将停在"<<aver<<"层。"<<endl; 79 return 0; 80 }
三、结果截图
四、心得体会
上课的时候老师,讲了对这个算法进行优化,终于知道数学学得好有什么优势了。本来觉得编程与数学有关,但是关系不大,现在觉得老师说的不错,算法就是数学。以后碰到这种算法优化的或是对算法要求比较高的,可以深入研究一下。
标签:
原文地址:http://www.cnblogs.com/JJJanepp/p/4438209.html