您的位置:首页 > 其它

课堂训练——电梯调度

2015-04-19 15:41 246 查看
一、题目要求

•石家庄铁道大学基础大楼一共有四部电梯,每层都有人上下,电梯在每层都停。觉得在每层都停觉得不耐烦。
•由于楼层不太高,在上下课高峰期时时,电梯从一层上行,但只允许停在某一楼层。在一楼时,每个乘客选择自己的目的层,电梯则自动计算出应停的楼层。
•问电梯停在那一楼层,能够保证这次乘坐电梯的所有乘客爬楼梯的层数之和最少。
二、设计思想
用循环分别求出停在从第一层到最高层分别一共走多少层,其中对于一个i层, 假设数组中比i层小的有lcount个,等于i层的有mcount个,大于i层的有rcount个。用N[i]代表i与数组中每个数差的绝对值之和。有N(i) = m;当i+1时,设等于i+1的数有midNext个,则此时:小于i+1的数有 lcount+mcount个, 大于i+1的数有 rcount-mcount个。相比较N(i)的情况, 位于i+1左边所有数与i+1的差的绝对值,增加了lcount+mcount。相比较N(i)的情况, 位于i+1左边所有数与i+1的差的绝对值,减少了 rcount-mcount。

N(i+1) = N(i) + lcount + mcount -(rcount-mcount);
mcount = midNext;
三、代码实现

// chengxuzhimei.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "stdlib.h"
#define MAX 1000
void getFloorNo(int *input, int size)
{
int result[MAX] = {0};
int lcount,mcount,rcount;      //分别表示小于、等于、大于第i个数
int cur;
int l,r;
int i;
l = r = 0;
cur = 0;
lcount = 0;
rcount = size;
mcount = 0;
for(i = 0;i<size;i++)
{
r+=input[i];
}
result[0] = r;
printf("停在各楼层时爬楼梯的总和分别为:\n");
for(i=1;i<=input[size-1];i++)
{
lcount += mcount;
rcount -= mcount;
r -= rcount;
l += lcount;
result[i] = l + r;
printf ( "停在第%d层总共要走%d层楼梯\n",i, result[i] );

mcount = 0;
while(input[cur] == i)
{
cur++;
mcount++;
}
}
}
int main(void)
{
int nperson;
int input[MAX];
printf("请输入上电梯的人数:");
scanf("%d",&nperson);
printf("请输入每个人进入电梯后按下的楼层数\n");
for(int i=0;i<nperson;i++)
{
scanf("%d",&input[i]);
}
getFloorNo(input,nperson);

return 0;
}


四、截图



五、心得体会

课上没有了解老师说的方法,只有自己想的复杂的方法,就是时间复杂度为O(N^2)。但是在课下发现网上有好多这个问题的相关方法,经过分析还是觉得这种方法较容易理解。其实思维还是太正常化,被局限了。以后要活跃点呢。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: