首页 > 试题广场 >

一个酒吧内有排成一行的25个座位,到酒吧的客人都生性内向不擅

[问答题]
一个酒吧内有排成一行的25个座位,到酒吧的客人都生性内向不擅交际,因此他们都会坐到离其他人最远的位置(即离最近的人最远),如果新进来的客人发现左右两边都有人没有空位的话就会离开。你做为老板希望客人越多越好,如果你可以安排第一个进来的客人坐什么地方,该怎么安排?

先说答案:第一个人坐在第9和17个位置最优

首先我们找出最佳做法最后应该得到的座位情况:
人空人空人空人空人空人空人空人空人空人空人空人空人
也就是每两个人之间间隔一个空位。
然后需要去找能得出这个情况的所有第一个坐的位置,当我分析到第9和第17的时候,发现它们都具有递归效应,贪心的坐下去,最后都得到理想情况。

然后我用C++写了一个模拟的程序,得出来结果也是第一个人先坐第9个或者第17个位置最优。

程序输出:
第一个人坐在第 1 位能坐的人数 : 8

人空空人空空人空空人空空人空空人空空人空空人空空人

第一个人坐在第 2 位能坐的人数 : 8

空人空人空空人空空人空空人空空人空空人空空人空空人

第一个人坐在第 3 位能坐的人数 : 9

人空人空人空空人空空人空空人空人空空人空空人空空人

第一个人坐在第 4 位能坐的人数 : 9

人空空人空人空空人空人空空人空人空空人空空人空空人

第一个人坐在第 5 位能坐的人数 : 10

人空人空人空人空空人空人空空人空人空空人空人空空人

第一个人坐在第 6 位能坐的人数 : 10

人空人空空人空人空人空人空空人空人空空人空人空空人

第一个人坐在第 7 位能坐的人数 : 10

人空空人空空人空人空人空人空空人空人空人空人空空人

第一个人坐在第 8 位能坐的人数 : 11

人空空人空人空人空人空人空人空人空人空人空人空空人

第一个人坐在第 9 位能坐的人数 : 12

人空人空人空人空人空人空人空人空人空人空人空人空人

第一个人坐在第 10 位能坐的人数 : 11

人空人空人空人空空人空空人空人空人空人空人空人空人

第一个人坐在第 11 位能坐的人数 : 10

人空人空空人空人空空人空空人空人空人空空人空人空人

第一个人坐在第 12 位能坐的人数 : 9

人空人空空人空空人空空人空空人空空人空空人空人空人

第一个人坐在第 13 位能坐的人数 : 8

人空空人空空人空空人空空人空空人空空人空空人空空人

第一个人坐在第 14 位能坐的人数 : 9

人空空人空空人空空人空人空人空人空空人空空人空空人

第一个人坐在第 15 位能坐的人数 : 10

人空空人空人空人空空人空人空人空人空空人空人空空人

第一个人坐在第 16 位能坐的人数 : 11

人空空人空人空人空人空人空人空人空人空人空人空空人

第一个人坐在第 17 位能坐的人数 : 12

人空人空人空人空人空人空人空人空人空人空人空人空人

第一个人坐在第 18 位能坐的人数 : 11

人空人空人空人空人空人空人空人空空人空空人空人空人

第一个人坐在第 19 位能坐的人数 : 10

人空人空人空人空空人空人空人空人空空人空空人空空人

第一个人坐在第 20 位能坐的人数 : 10

人空人空人空人空空人空人空空人空人空空人空人空空人

第一个人坐在第 21 位能坐的人数 : 10

人空人空空人空人空空人空人空空人空人空空人空人空人

第一个人坐在第 22 位能坐的人数 : 9

人空人空空人空人空空人空人空空人空空人空空人空空人

第一个人坐在第 23 位能坐的人数 : 9

人空人空空人空空人空空人空人空空人空空人空空人空人

第一个人坐在第 24 位能坐的人数 : 8

人空人空空人空空人空空人空空人空空人空空人空空人空

第一个人坐在第 25 位能坐的人数 : 8

人空空人空空人空空人空空人空空人空空人空空人空空人


程序源代码:
#include <iostream>

using namespace std;

int main(void) {

  int a[26], an[26];

    int INF = 1000000;

    for (int i = 1; i <= 25; i++) {

        memset(a, 0, sizeof(a));

        a[i] = 1;

        int temp = 0;

        while (true) {

            int p, ans = 0;

            for (int i = 1; i <= 25; i++) {

                if (!a[i]) {

                    int s = 0, e = 0;

                    for (int j = i - 1;; j--) {

                        if (j == 0) {

                            s = INF;

                            break;

                        }

                        if (a[j]) break;

                        s++;

                    }

                    for (int j = i + 1; ; j++) {

                        if (j == 26) {

                            e = INF;

                            break;

                        }

                        if (a[j]) break;

                        e++;

                    }

                    if (min(s, e) > ans) ans = min(s, e), p = i;

                }

            }

            if (!ans) break;

            a[p] = 1;

           // cout << p << endl;

            temp++;

        }

        an[i] = temp;

        cout << "第一个人坐在第" << i  << "" << "能坐的人数: " << temp << endl;

        if (i) {

            for (int i = 1; i <26; i++) {

                cout << (a[i] ? "" : "") ;

            }

            cout << endl;

      }

    }

}




发表于 2015-12-20 21:22:45 回复(2)
最多坐(n+1)/2人。。。。。。 如果总共1个座位,完美分配1人。第一人坐1号。。。。。 如果总共3个座位,完美分配2人。第一人坐3号,第二人坐1号。。。。。 如果总共5个座位,完美分配3人。第一人坐5号,第二人坐1号。。。。。。 如果总共9个座位,完美分配5人。第一人坐9号,第二人坐1号。。。。。。 如果总共17个座位,完美分配9人。第一人坐17号,第二人坐1号。。。。。。 如果总共33个座位,完美分配17人。第一人坐33号,第二人坐1号。。。。。。 数列递推规律是2n-1。。。。。。。 那25个人怎么分呢?25比17大,比33小。按照上面方法,第一人坐17号,切分分1到17,17到25,17号后面剩下8个座位,按照9个座位的方式递推。。。。。。。
发表于 2019-11-16 12:45:04 回复(0)
因为25是奇数,所以仅考虑奇数情况,设座位数为N
情况分两种:
1.N/4 余1. 直接安排在左边第一个位置或右边第一个即可,
随后进来的人会坐在坐位区间的中点处,以此类推。
本题就是这种情况,最多13位顾客。
2.N/4 余3. 如像情况一那样安排,则在占据首尾,中间的位置后,
剩余坐位是偶数,无法达到最优解,例如N=7:
人空空人空人
故不能简单安排在首尾的位置上,正确方法是在中间找个位置,
可能性有很多种,
遵循的原则是分割后两个有人坐位中间剩余位置是奇数,
这样又回到二分的那种情况愉快的进行下去达到最优解:
人空人空人空人空。。。人空人空人

编辑于 2015-12-21 02:55:19 回复(0)
17个,
发表于 2015-12-20 12:44:41 回复(0)
好像,第一个放到一个尽头就好了。
第二个会自动去另外一头
剩下的就是中点,然后左右两边的中点,这样一直分下去。最多坐17个人。
发表于 2015-12-20 12:14:27 回复(0)
二分法吧,最多17个
发表于 2015-12-20 01:04:13 回复(0)