博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[原创]阿里笔试题之战报交流
阅读量:5896 次
发布时间:2019-06-19

本文共 796 字,大约阅读时间需要 2 分钟。

问题:

战场上不同的位置有N个战士(n>4),每个战士知道当前的一些战况,现在需要这n个战士通过通话交流,互相传达自己知道的战况信息,每次通话,可以让通话的双方知道对方的所有情报,设计算法,使用最少的通话次数,使得战场上的n个士兵知道所有的战况信息,不需要写程序代码,得出最少的通话次数。

解答:

若要使通话次数尽可能地少,那么通话双方所了解的信息要尽可能地互补,即能组成全部的信息。

因此考虑分治法,最小单位为2,因为2个人之间最少需要一次通信。

设N个人通信最少需要K次通信,考虑N=5和N=6时:

如上图,线上的数字表示通信的序号,在通信时,尽可能地满足信息互补,如左图中4、5两次通信,右图中5、6两次通信,都满足信息互补,而且,两个小模块在合成大模块时,总能形成4个点(图中实心点,对于N=7和N=8时亦是如此),这四个点了解新模块的所有信息,然后只需从这四个点中任选一些点与那些了解部分信息的点进行通信(图中虚线所示),即可使得所有人都了解全部信息。

N=5时,K=6;N=6时,K=8...因此考虑K=2*N-4

当N=4、5、6、7时,可人工画图计算出K=2*N-4;

当N>=8时,

  1. 当N为偶数时,采用分治法可得每一部分所含点都为N/2,不考虑虚线所示通信的时间,只考虑其必定在左右两部分通信完之后进行,左半部分需要通信2*(N/2)-4,右半部分也是,左右两部分通信只需将4个实心点连接即可,因此总的通信次数为2*(2*(N/2)-4) + 4 = 2*N-4;
  2. 当N为奇数时,同上,只不过左半部分点数为(N-1)/2,右半部分点数为(N+1)/2,2*(N-1)/2-4 + 2*(N+1)/2-4 + 4 = 2*N-4。

故N个战士最少需要2*N-4次通信。

转载于:https://www.cnblogs.com/xpowerlord/p/3649112.html

你可能感兴趣的文章
asp.net开源CMS推荐
查看>>
csharp skype send message in winform
查看>>
MMORPG 游戏服务器端设计--转载
查看>>
SILK 的 Tilt的意思
查看>>
Html学习笔记3
查看>>
HDFS dfsclient写文件过程 源码分析
查看>>
部署P2P升级的脚本
查看>>
ubuntu下安装libxml2
查看>>
nginx_lua_waf安装测试
查看>>
WinForm窗体缩放动画
查看>>
JQuery入门(2)
查看>>
linux文件描述符
查看>>
C++ const 详解
查看>>
传值引用和调用引用的区别
查看>>
Hive简介
查看>>
hyper-v 无线网连接
查看>>
Python3.7.1学习(六)RabbitMQ在Windows环境下的安装
查看>>
Windows下memcached的安装配置
查看>>
ubuntu: firefox+flashplay
查看>>
常见的海量数据处理方法
查看>>