3 回答
TA贡献1765条经验 获得超5个赞
先是一个人和n-1人通话,之后就产生了2个全知的人,因为剩下n-2个人都不全知所以至少要被再交互1次,并且此n-2个中任何两个不全知的人交互都没有意义,必须交互一个全知的人,这样就产生了3个全知和n-3个非全知,同理这n-3个必须同那3个全知中的一个交互,以此类推,直到最后一个非全知被交互,所以是n-2,所以总共是n-1+(n-2)=2n-3
TA贡献1921条经验 获得超9个赞
这道题以前做过,正解应当是 2n - 3 。可以很容易证明增加一个人最多需要2次沟通(详见下面的方案)。问题在于怎么证明增加一个人最少需要2次沟通。后者能证明的话,通过归纳法就可以很容易地得出这个结论。下面给出一个可能不够严谨的证明吧。
记最少的沟通次数 y 为人数 x 的函数, y = f(x)。
由于每次沟通只能在两个人之间,在n个人里面收集所有信息,至少需要 n - 1 次沟通;某个人将自己的信息告诉所有其他人也至少需要 n - 1 次沟通。由于“同步信息”所需的次数显然不可能少于收集信息,所以有 f(x) >= x - 1 。
将所有人分成 p 堆(1 <= p < n),第i堆有 a[i] 个人。于是问题可以拆成3个步骤:
在每堆里面任选一个人收集该堆的信息,需要 sum(a[i] - 1) = n - p 次沟通。
在这些选出来的p个人中同步信息,需要 f(p) 次。于是这p个人都知道了所有的信息。
每堆内再同步信息,又是 sum(a[i] - 1) = n - p 次。
总共需要 g(n, p) = 2(n - p) + f(p) 次沟通,所以 y = f(x) = max(g(n, p)) ,O(n^2)的算法,对于不大的n可以很容易地求出来这个最小值;当然这不是我们的目标。下面是重点,描述可能很奇葩,我尽量。。。
这时候如果新增一个人:如果把他放在任意一堆里面,那么至多且至少需要增加2次沟通(在1、3步里面各一次);如果把他另起一堆,于是问题变成递归地求解 f(p+1) 比 f(p) 至少要增加几次。
按照上面的逻辑,把这p+1个人分成q组(1 <= q < p),新增的那个人所在的组 要么多于1个人(于是至少也要增加2次沟通),要么只有一个人(相当于增加一个组),于是又变成递归地求解f(q) 比 f(q-1) 至少要增加几次…… 不断递归,最后组的数量会得到一个比较小的值,比如3,这时候就很容易证明,新增的这个人至少需要增加2次沟通才能够同步信息。
证毕。
至于设计算法,那就太简单了:从a开始依次传递到z,然后在从y依次传递回a,这就是 2n - 3 次。如下所示:
a = b = c = …… = y - z
TA贡献1818条经验 获得超11个赞
S1 S2 ... Sn
n个战士,S1挨个和S2 S3 ... Sn交流,按照条件
每次通话,可以让通话的双方知道对方的所有情报
当交流到Sn时,S1获得了所有位置同时Sn也获得了所有位置,接下来S1再和S2 S3 ... Sn-1 交流自己的信息,所有人都有信息了。
总数 n-1 + n-2 = 2n-3
-----分割线------
如果解为2n-3,那么若有4个战士,代入方程,得到结果 2*4-3=5,但是按照LZ的补充4个战士的最小解可以为4,OMG。
所以就不妨参照4个战士4次互通消息可以知道所有情报。
记下来每增加一个战士X,X只要和战士S1报告一下(是不是打入狼牙山4战士内部了),然后4战士交互完以后,X再和S1报告一下(套取内部资料),结果X也有所有的情报了。
类推,只要战士总数N>4,那么总次数 Sum = (N-4)*2 + 4 = 2N-4
添加回答
举报