《编程之美》--电梯调度
2009-07-03 22:22 Iron 阅读(254) 评论(0) 编辑 收藏 举报//最容易想到的算法1
#include <iostream>
using namespace std;
int main()
{
int N = 9;
int nPerson[] = {0,2,3,5,5,3,1,5,8,9};
int nFloor,nMinFloor,nTargetFloor;//总共走的楼层数,最少楼层数,电梯所停的目标楼层
nTargetFloor = -1;
for(int i=0;i<=N;i++)//对每一层楼停下的情况进行测算
{
nFloor = 0;
//i楼以下的人所走的楼层数
for(int j=1; j< i; j++)
nFloor += nPerson[j]*(i-j);
//i楼以上的人所走的楼层数
for(int j = i+1;j<=N;j++)
nFloor += nPerson[j]*(j-i);
if(nTargetFloor == -1 || nMinFloor > nFloor)
{
//如果是第一次,则执行;或者当前得到的nFloor比nMimFloor要大,则执行
nMinFloor = nFloor;
nTargetFloor = i;
}
}
cout<<nTargetFloor<<endl<<nMinFloor<<endl;
system("pause");
}
//优化过后的算法2
#include <iostream>
using namespace std;
int main()
{
int N = 9;
int nPerson[] = {0,2,3,5,5,3,1,5,8,9};
int nMinFloor,nTargetFloor;
int N1,N2,N3;
nTargetFloor = 1;
N1 = N3 = nMinFloor = 0;
N2 = nPerson[1];
//得到nTargetFloor等于1时各变量的值
for(int i = 2; i <= N; i++)
{
N3 += nPerson[i];
nMinFloor += nPerson[i] * (i-1);
}
//分别对电梯2停在以上楼层的情况进行处理
/*
* 从第二层开始,设Y(i) 为 i层的总共走的楼层数,Y(i+1) = Y(i) + (N1 + N2 - N3),
* 即只有(N1 + N2 - N3)为负值时Y(i+1) < Y(i),此时可用i + 1作为新的电梯停下的最
* 佳楼层数 ,上面的部分得到了停在一楼的情况,下面从二楼开始逐层比较,由于
* nTargetFloor 一直保留为当前最优值 ,所以新的情况只需与上一情况相比较,即可
* 确定是否替换当前最优值
*/
for(int i=2;i<=N;i++)
{
if(N1 + N2 < N3)
{
nTargetFloor = i;
nMinFloor += (N1 + N2 - N3);
N1 += N2;
N2 = nPerson[i];
N3 -= nPerson[i];
}
else
{
break;
}
}
cout<<nTargetFloor<<endl<<nMinFloor<<endl;
system("pause");
}
注:算法1 的时间复杂度为O(n2),算法2的时间复杂度为O(n)