Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 最优座位安排算法_Algorithm - Fatal编程技术网

Algorithm 最优座位安排算法

Algorithm 最优座位安排算法,algorithm,Algorithm,一排有二十五个酒吧凳子。进入酒吧的顾客遵循以下两条规则: 客户总是坐在离其他客户最远的座位上 客户永远不会坐在另一位客户旁边 根据这两条规则,你应该把第一位顾客放在哪里,这样最多的顾客可以坐在酒吧里 我可以在25个大便的情况下解决它。但我无法找出n个大便的通用算法。听上去,这几乎与Randall Munroe撰写的优秀分析(I.C.U.p.)完全相同,包括一个封闭式方程和一个最佳小便次数图。你应该先读他的文章,然后再读其余的答案 在文章中,Randall提到: [一] 如果你进入一个浴室,一排

一排有二十五个酒吧凳子。进入酒吧的顾客遵循以下两条规则:

  • 客户总是坐在离其他客户最远的座位上
  • 客户永远不会坐在另一位客户旁边
  • 根据这两条规则,你应该把第一位顾客放在哪里,这样最多的顾客可以坐在酒吧里


    我可以在25个大便的情况下解决它。但我无法找出n个大便的通用算法。

    听上去,这几乎与Randall Munroe撰写的优秀分析(I.C.U.p.)完全相同,包括一个封闭式方程和一个最佳小便次数图。你应该先读他的文章,然后再读其余的答案


    在文章中,Randall提到:

    [一] 如果你进入一个浴室,一排排的空小便器数量令人尴尬,而不是端部的小便器,你可以走三分之一的路。这将把尴尬的一行分成两个最佳的一行,将最坏的情况变成最好的情况

    虽然他没有说得更详细,但这暗示了我们正在努力做什么。如果我们的小便器(或大便,在我们的例子中)数量太多,我们可以尝试让第一个人坐在一个座位上,使他们成为两个不同的最佳分组的末端

    对于7个座位,基本选择行为如下:

    1 _ _ 3 _ _ 2
    
    留下四个空位。但是如果我们让第一个人坐在第三个位置,我们得到了最佳的3和5个子组,使我们可能的乘客增加了一个

    3 _ 1 _ 4 _ 2
    
    对于25,基本行为类似次优,导致9/25的入住率低于尴尬:

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

    3 _ 8 _ 5 _ 9 _ 1 _ 10 _ 6 _ 11 _ 4 _ 12 _ 7 _ 13 _ 2
    
    实现13/25的最佳入住率

    更一般地说,我相信找到比座位数更小的最大最佳数量,并让第一个人坐在那里(在25个案例中,即17个,相当于从另一个方向看第9个),将始终使可占用的椅子数量最大化。在最坏的情况下,如25,这相当于Randall提到的
    ceil(n/3)

    在一般情况下(使用基本座位行为既不是最好的,也不是最差的),我们不可能总是通过只让第一个人就座来达到50%的入住率,因为我们只能创建一个最优子组,而让另一个子组的入住率低于最优值。因此,我们采用最大最优子群,以最小化次优座位数。例如,对于20个座位,我们选择17个,创建一个17-4组,这将优化尽可能多的座位,一行中只剩下两个空位:

    2 _ 7 _ 4 _ 8 _ 3 _ 9 _ 5 _ 10 _ 1 _ _ 6
    
    实际上,从技术上讲,这四个组是最好和最坏的情况,但希望你能看到这种模式的规模。

    以下是我的分析

    为了论证,假设第一个人坐在中间的某个地方,而不是太靠近任何一端。这将给我们一个这样的模式,其中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个座位


    太好了

    当你真正画这幅画时,你会发现答案很简单。 例如,在以下情况下,您可以轻松地从左侧、右侧或中间选择座位

    例如,1 OOO--XOX--1

    例如,2 OOOOO--xoox--XOXOX--从3分解为1

    例如,3 ooooooooooo--xoooooox--xooooxoxoxoxox--XOXOXOXOX--从7分解为3到1

    从这些例子中,我们可以做出以下陈述: 假设我们在两个选定座位之间有一个自由座位范围,当这些自由座位的数量N=2^N-1时,我们可以得到该范围内的最大座位选择

    证明:

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

    给定座位数N,找出2^N-1

    x _ -m- _ x