电梯调度算法
由于楼层不高,那么繁忙的上下班时间,每次电梯从一层往上走,只允许停留在其中某一层。所有乘客都从一楼上电梯,到达某层楼之后,电梯停下来,所有乘客上自己的目的层。试问电梯停在哪一层,保证乘客爬楼梯层数之和最少?
#include<iostream>
using namespace std;
// 电梯停在哪一层 保证所有乘客爬楼梯层数最少
// 返回值:楼梯层数 函数参数:1.每层人数 2.一共多少层
int lowestPersonStairLevel(int *,int);
int main()
{
const int iElevatorLeval=11; // 电梯层数 10层 第0层不用
int iPerson[iElevatorLeval]={0}; // 每层电梯的人数
cout<<"各楼层乘客数目:"<<endl;
for(int i=1;i<iElevatorLeval;++i)
{
iPerson[i]=rand()%10+1; // 每层电梯人数赋值
cout<<iPerson[i]<<" ";
}
cout<<endl;
int iStairLevel=0;
iStairLevel=lowestPersonStairLevel(iPerson,iElevatorLeval-1);
cout<<"电梯停留第"<<iStairLevel<<"层,乘客爬楼梯层数最少"<<endl;
int i=0;
int sum1=0,sum2=0;
for(i=1;i<=10;++i)
{
sum1+=iPerson[i]*i;
sum2+=iPerson[i];
}
cout<<"输出:"<<sum1/sum2<<endl;
system("pause");
return 0;
}
// 电梯停在哪一层 保证所有乘客爬楼梯层数最少
// 返回值:楼梯层数 函数参数:1.每层人数 2.一共多少层
int lowestPersonStairLevel(int *iPerson,int iElevatorLeval)
{
int N1=0,N2=iPerson[1],N3=0; // N2表示第i层楼的乘客,N1个乘客目的楼层在第i层以下,N3个乘客目的楼层在第i层以上
int itargetFloor=0,iminFloor=0; // itargetFloor表示层数 iminFloor表示在itargetFloor层乘客爬楼梯的最少数
for(int i=2;i<=iElevatorLeval;++i)
{
N3+=iPerson[i];
iminFloor+=iPerson[i]*(i-1);
}
for(int i=2;i<=iElevatorLeval;++i)
{
if(N1+N2<N3) // 往上走一层 N1、N2就会增加走的楼梯数 N3就会减少走的楼梯数 N1+N2-N3>0继续往上走
{
itargetFloor=i;
iminFloor+=(N1+N2-N3);
N1+=iPerson[i-1];
N2=iPerson[i];
N3-=iPerson[i];
}
else
break;
}
return itargetFloor;
}
using namespace std;
// 电梯停在哪一层 保证所有乘客爬楼梯层数最少
// 返回值:楼梯层数 函数参数:1.每层人数 2.一共多少层
int lowestPersonStairLevel(int *,int);
int main()
{
const int iElevatorLeval=11; // 电梯层数 10层 第0层不用
int iPerson[iElevatorLeval]={0}; // 每层电梯的人数
cout<<"各楼层乘客数目:"<<endl;
for(int i=1;i<iElevatorLeval;++i)
{
iPerson[i]=rand()%10+1; // 每层电梯人数赋值
cout<<iPerson[i]<<" ";
}
cout<<endl;
int iStairLevel=0;
iStairLevel=lowestPersonStairLevel(iPerson,iElevatorLeval-1);
cout<<"电梯停留第"<<iStairLevel<<"层,乘客爬楼梯层数最少"<<endl;
int i=0;
int sum1=0,sum2=0;
for(i=1;i<=10;++i)
{
sum1+=iPerson[i]*i;
sum2+=iPerson[i];
}
cout<<"输出:"<<sum1/sum2<<endl;
system("pause");
return 0;
}
// 电梯停在哪一层 保证所有乘客爬楼梯层数最少
// 返回值:楼梯层数 函数参数:1.每层人数 2.一共多少层
int lowestPersonStairLevel(int *iPerson,int iElevatorLeval)
{
int N1=0,N2=iPerson[1],N3=0; // N2表示第i层楼的乘客,N1个乘客目的楼层在第i层以下,N3个乘客目的楼层在第i层以上
int itargetFloor=0,iminFloor=0; // itargetFloor表示层数 iminFloor表示在itargetFloor层乘客爬楼梯的最少数
for(int i=2;i<=iElevatorLeval;++i)
{
N3+=iPerson[i];
iminFloor+=iPerson[i]*(i-1);
}
for(int i=2;i<=iElevatorLeval;++i)
{
if(N1+N2<N3) // 往上走一层 N1、N2就会增加走的楼梯数 N3就会减少走的楼梯数 N1+N2-N3>0继续往上走
{
itargetFloor=i;
iminFloor+=(N1+N2-N3);
N1+=iPerson[i-1];
N2=iPerson[i];
N3-=iPerson[i];
}
else
break;
}
return itargetFloor;
}