编程之美-电梯调度算法

1、简单的双重循环可以解决O(N *N )

2、书中提出另一种想法 假设电梯停在i层 爬楼梯的总数为Y 若电梯停在i-1层 则i层以上的N3人 需要多爬一层 i层的N2也需多爬一层 i-1层的N1人则少爬一层 

所以总共走的数目为 Y-N1+N2+N3 即 Y-(N1-N2-N3)

若在i+1层停下  则i+1层的N3人少一层  i层和i-1层多走N2+N1  总的数目为Y-N3+N1+N2 即 Y-(N3-N1-N2)

因此可以从第二层开始  一直向上查找 最少的走楼梯数目  

int flor::cal2()
{
	sum=0;
	for(int i=0;i<num;i++)
		sum+=a[i]*i;//计算在第一楼停下 需要爬楼的总数
	//std::cout<<sum<<std::endl;
	int Y1=0;
	int Y2=0;
	int Y3=0;
	for (int i=0;i<num;i++)
		Y3+=a[i];
	std::cout<<Y3<<std::endl;
	for(int i=0;i<num && Y3>=0;i++)
	{
		Y1+=Y2;
		Y2=a[i];
		Y3-=Y2;
		//std::cout<<i+1<<' '<<Y1<<' '<<Y2<<' '<<Y3<<' ';
		if(Y1+Y2<Y3) 
		{
			sum=sum+Y1+Y2-Y3;
		}
		//std::cout<<sum<<' '<<std::endl;
	}
	return sum;
}

    原文作者:Fivesplus
    原文地址: https://blog.csdn.net/Fivesplus/article/details/45743305
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞