题目:《编程之美》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