最优座位排列算法

时间:2012-09-24 20:05:33

标签: algorithm

连续有二十五个酒吧凳子。进入该栏的客户遵循以下两条规则:

  1. 客户将始终坐在距离任何其他客户最远的座位上。
  2. 客户永远不会坐在另一位客户旁边。
  3. 使用这两条规则,您应该在哪里放置第一位客户,以便最大数量的客户可以坐在酒吧?

    我可以在25个大便条件下解决它。但我无法弄清楚n大便的一般算法。

3 个答案:

答案 0 :(得分:5)

听到它的声音几乎与兰多尔门罗写的优秀分析International Choice of Urinal Protocol(I.C.U.P。)完全相同,包括封闭形式方程和最佳小便器数量图。在阅读本答复的其余部分之前,您应该阅读他的文章。


在兰德尔的帖子中提到:

  

[我]你进入一个连续排空笨拙的小便池的卫生间,而不是拿一个最后的小便器,你可以走三分之一的路线。这会将尴尬的行分成两个最佳行,将最坏情况转化为最佳情况。

虽然他没有详细说明,但它暗示了我们正在努力做的事情。如果我们有一个笨拙的小便池(或大便,在我们的情况下),我们可以尝试让第一个人坐在座位上,这样他们就会成为两个不同的最佳小组的终点。

对于7个席位,基本选择行为可以解决这个问题:

1 _ _ 3 _ _ 2

离开四个无人居住的座位。但如果我们将第一个人安排在第三位,我们会得到最佳的3个和5个小组,将我们可能的占用者增加一个。

3 _ 1 _ 4 _ 2

对于25,基本行为同样是次优的,导致在尴尬之前占据了9/25:

1 _ _ 6 _ _ 4 _ _ 7 _ _ 3 _ _ 8 _ _ 5 _ _ 9 _ _ 2

但是我们可以让位于第9位的人,创建最佳的9 17个子组,如下所示:

3 _ 8 _ 5 _ 9 _ 1 _ 10 _ 6 _ 11 _ 4 _ 12 _ 7 _ 13 _ 2

导致13/25的最佳入住率。

更一般地说,我认为找到比座位数小的最大最佳数字,并且在那里安排第一个人(在25个案例中,17个,相当于从另一个方向的第9个)将始终最大化可占用的椅子。在最糟糕的情况下,如25,这相当于兰德尔提到的ceil(n/3)

在平均情况下(使用基本座位行为既不是最佳也不是最差),我们不能总是仅通过安置第一个人来达到50%的占用率,因为我们只能创建一个最佳子组,而另一个不是最佳的。因此,我们采用最大的最优子群,以最小化次优座位的数量。例如,对于20个席位,我们需要17个并创建一个17 4组,这样可以优化尽可能多的席位,只留下两个席位:

2 _ 7 _ 4 _ 8 _ 3 _ 9 _ 5 _ 10 _ 1 _ _ 6

这四个小组在技术上实际上既是最好也是最坏的情况,但希望你能看到这种模式如何扩展。

答案 1 :(得分:0)

这是我的分析。

为了争论,让我们说第一个人坐在中间的某个地方,而不是靠近两端。这将给我们一个这样的模式,其中x表示占用的座位和_一个空位:

_ _ _ ... _ x _ ... _ _ _

坐在这个人左边的第一个顾客将坐在最左边的一端。同样,坐在这个人右边的第一个顾客将坐在最右端。这给我们留下了这样的模式,其中-m-表示m个连续的免费席位:

x _ -m- _ x _ -n- _ x

将此称为“基本配置”,座位总数为s = m + n + 7.

好的,现在我们的问题被分成两个大小为m和n的子问题,每个子问题都将由尽可能靠近每个区域中间的客户填写。

为了获得最大的最终占用率,我们希望m和n为“理想”数字,定义如下:

a is ideal if a = 2b + 3 and b is ideal  (i.e., we will get -b- _ x _ -b-).

这里的想法是,理想的座位数可以最大限度地占用(1)取a的中间位置,(2)递归求解b大小的两个子问题。

最不理想的数字是1.

由此,我们可以建立前几个理想数字:

1, 5, 13, 29, ...

现在,对于s = 25,我们的基本配置是25 = m + n + 7,我们希望m和n是理想的。那么,25 - 7 = 18和18 = 5 + 13,这是理想的!

因此,对于25个座位,我们坐在座位4 + 5 = 9或4 + 13 = 17的第一人,我们保证最终占用最多。

在我们完成之前要检查的最后一件事:如果第一个顾客坐在凳子上怎么办?然后,在第二个客户坐下之后,我们会

x _ -m- _ x

其中m必须是理想数字。对于25个座位,这给出了25 - 4 = m = 21,这是不理想的。因此,第一位客户不能坐在两端,最多可容纳25个座位。

Ta daaaaaah!

答案 2 :(得分:0)

当你真正画出图片时,你会发现答案非常简单。 例如,在下列情况下,您可以从左侧或右侧或中间轻松选择座位。

E.g.1 OOO --- XOX - 1

.2000OO-XOOOX-XOXOX-从3分解为1

EOO.3OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO

从这些例子中,我们可以做出以下声明: 假设我们在两个选定座位之间有一系列免费座位,当这些免费座位数N = 2 ^ n-1时,我们可以在这个范围内选择最多座位。

证明:

  1. 基本情况:当n = 1时,N = 1,即XOX满足要求。
  2. 假设当n <= k(k> 1)时为真,这意味着当2个所选座位之间的空闲座位数为N = 2 ^ k-1时,我们可以达到最大选择。对于k + 1的情况,我们将具有N = 2 ^(k + 1)-1。然后我们可以选择这个范围内的中间座位,将自由座位分成2个段,每个段的数量为N'=(N-1)/ 2 =(2 ^(k + 1)-1-1)/ 2 = 2 ^ k-1,这是我们的假设。
  3. 所以这个问题的算法是:

    给定座位数N,找到最大数量为2 ^ n-1&lt; N-3,然后测试N-1-(2 ^ n-1)-1-1是否为2 ^ m-1的形式。

    在N = 25的情况下,我们可以发现15是25以下的最大数,并且是2 ^ 4-1的形式。由于25-1-15-1-1 = 7巫婆是2 ^ 3-1的形式。所以25个座位可以达到最大选择。根据我们的分析,我们可以选择17或9的第一个座位。