题目:《编程之美》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;
}原文地址:http://blog.csdn.net/bupt8846/article/details/44453347