代码改变世界

《编程之美》--电梯调度

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)