码迷,mamicode.com
首页 > 编程语言 > 详细

【数学】小飞的电梯调度算法

时间:2015-03-19 11:38:22      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:c++   程序员   面试   数学   

题目:《编程之美》P53

若干个乘客从一楼上电梯,电梯出发后,只能停靠在某一层。问电梯停在哪一层,可以让所有乘客走的总楼层数最少?


分析:

电梯可以停在负层,但没有0层。所以程序返回0时,表示出错。这里有个陷阱,因为没有0层,所以在计算时,应该先把负数的楼层加1.当最后算出来的结果小于等于0时,再减去一,才是实际中的负数层数。


代码中输入的数组的元素,表示每个乘客想去的楼层。最佳停靠楼层肯定落在区间[minfloor,maxfloor],其中minfloor表示乘客想去楼层的最小值,maxfloor表示乘客想去楼层的最大值。

        

int best_stop_floor(vector<int> n)
{
	if (n.empty())
		return 0;//没有0层,表示错误
	if (n.size() == 1)
		return n[0];
	//把小于1的楼层的层数加1
	for (auto& t : n)
	{
		if (t < 0)
			++t;
	}
	sort(n.begin(), n.end());
	int minfloor = n.front(), maxfloor = n.back();
	int N1 = 0, N2 = 1,N3 = 0,index=1;

	//判断minfloor是不是最优解
	int bestfloor = minfloor;
	while (index < n.size() && n[index] == n[0])
	{
		++index;
		++N2;
	}
	N3 = n.size() - N2;
	if (N1 + N2 < N3) 
		++bestfloor;

	for (int i=minfloor+1; i<=maxfloor; i++)
	{
		if (index < n.size() && i < n[index])
		{
			N2 = 0;
			N1 = index;
			N3 = n.size() - N1;
		}
		if (index < n.size() && i == n[index])
		{
			N2 = 1;	
			N1 = index;
			int prefloor = n[index];
			++index;
			while (index < n.size() && n[index] == prefloor)
			{
				++index;
				++N2;
			}
			N3 = n.size() - N1-N2;
		}
		
		if (N1 > N2 + N3)
		{
			if (bestfloor >= i)
				bestfloor = i - 1;
		}
		else if (N1 + N2 < N3)
		{
			if (bestfloor <= i)
				bestfloor = i + 1;
		}
		else
		{
			bestfloor = i;
		}
	}
	//注意这个判断条件
	if (bestfloor <= 0)
		--bestfloor;
	return bestfloor;
}

【数学】小飞的电梯调度算法

标签:c++   程序员   面试   数学   

原文地址:http://blog.csdn.net/bupt8846/article/details/44453347

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!