一.题目
石家庄铁道大学基础大楼一共有四部电梯,每层都有人上下,电梯在每层都停。信1201-1班的张一东觉得在每层都停觉得不耐烦。 由于楼层不太高,在上下课高峰期时,电梯从一层上行,但只允许停在某一楼层。在一楼时,每个乘客选择自己的目的层,电梯则自动计算出应停的楼层。 问电梯停在那一楼层,能够保证这次乘坐电梯的所有乘客爬楼梯的层数之和最少。
二.设计思路
首先我们最初设定人数为默认的8人,每次分别输入每个人想要到达的楼层,然后存入一个数组中,用到循环结构;然后再用一个循环结构分别计算停在某一层所有乘客爬楼梯的层数之和,存入数组中比较出最小数,然后再利用上次的数组,求出所有乘客爬楼梯的层数最小和所对应的楼层;在每一个阶段分别给出相应的提示。
三.源代码
#include <iostream.h>
int main ()
{
int num=0; //表示电梯到某层楼停的话,所有人需要爬楼的层数之和
int floor[19]={0}; //记录到达某层的人数
int *shuzu=new int[19]; //设置数组分别记录到达2~18层楼停的话,所有人需要爬楼的层数之和
int n; //n记录到达楼层
int x; //最后停留的层数
int y; //用次可记录有人到达的楼层
int k; //控制x-y的正负
for (int i=0;i<8;i++) //假设只能容纳8人,且达到最大容纳人数
{
cout<<"请输入第"<<i+1<<"个人要到达的楼层: ";
cin>>n;
floor[n]=floor[n]+1;
}
x=2; //此处只为给temp赋初值
for(y=2;y<=18;y++)
{
k=x-y;
if(k<0)
{
k=y-x;
}
num=k*floor[y]+num;
}
int temp=num;
for(x=2;x<=18;x++) //分别记录所有人分别到达2~18楼时所爬楼层总和,进行比较,并将其保存在数组shuzu[]中
{
num=0;
for(y=2;y<=18;y++)
{
k=x-y;
if(k<0)
{
k=y-x;
}
num=k*floor[y]+num;
}
shuzu[x]=num;
if(num<temp) //此函数是为了找出所爬楼层之和最小值
{
temp=num;
}
}
cout<<"*******************************"<<endl;
for(int e=0;e<19;e++) //此循环是为了找出与所爬楼层之和最小值对应的电梯停留层数
{
if(shuzu[e]==temp)
{
cout<<" "<<e<<" 层最好!"<<endl;
}
}
cout<<"*******************************"<<endl;
return 0;
}
四.运行截图
五.实验感想
这次实验再一次用到了多次循环嵌套,各个变量在每一层的含义都需要多次了解,否则十分容易出错;另外,在实验的测试结果中有时会出现多个结果,开始以为是程序出错,但是后来发现,这是正常的情况下可能出现的结果。
原文:http://www.cnblogs.com/fan123/p/4440160.html