算法题目如下:
参考解答:
a.采用分治策略。
将n 个横档分成n^1/2 组,每组n^1/2 个横档,第k 组为(k-1)n^1/2 +1 到 (k-1)n^1/2+n^1/2 的横档。从下到上检查每组的最后一个横档,如果在第k 组检查时瓶子破碎,则最高安全横档就在第k 组内。然后使用第二个玻璃瓶样品从下到上依次检查第k 组的横档,直到第二个玻璃瓶破碎,则最高安全横档为其破碎时前一个横档。
时间复杂度:O(n^1/2 + n^1/2) = O(n^1/2)
b.这一问是a 的一个拓展,同样使用 分治策略。
将n个横档分成n^1/k 组,每组n^(1-1/k) 个横档。和a中相似,首先从下到上依次检查各组最后一个横档,确定最高安全横档所在组,损失一个玻璃瓶样品,还有k-1 个玻璃瓶样品,用来检查这一组内的n^(1-1/k) 个横档。
继续将这n^(1-1/k) 个横档分成n^1/k 个组,每组n^(1-2/k) 个横档,重复上述操作,剩下k-2 个玻璃瓶样品,用来检查最高安全横档所在组的n^(1-2/k) 个横档。
如此继续,共进行k 次分组检查,问题得到解决。
时间复杂度:O(k * n^1/k),符合题意。