编程之美-电梯调度算法

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;
}



评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值