这道题是今天同事分享给我们做的,题目挺难的,也挺有意思的,一堆清北的人围在一起讨论了半个多小时,最后还是一个搞过ACM的人想出来了解法。特此把这道题和解法都分享一下。

题目描述

有n个伞兵从飞机上跳伞,伞兵落地后会昏迷一段时间,等到醒来后能看一眼雷达,雷达上能显示包括自己在内所有人的位置,但是雷达上显示的只是相对位置,没有东南西北这种方向,伞兵看完这一次雷达后就再也不能看了。
要求:设计一个策略能让伞兵落地后经过一系列运动最终所有人都走到一起去

补充说明

  1. 可以认为所有伞兵都同时落地,但是每个伞兵昏迷的时间长度不同
  2. 可以认为伞兵的记忆力都非常好,看完雷达之后能够一直记住,而且伞兵走路能够精确的走多少步还有方位。
  3. 不能给伞兵编号,因为每个伞兵都是相同的。(因为如果能编号,则可以直接1号伞兵去寻找其他所有人,剩余的伞兵不动就好)
  4. 伞兵会面之后可以有交流的
  5. 最后这个策略是所有伞兵在跳伞前都知道的。

思路历程

因为每个伞兵都是相同的个体,不能编号,所以一个非常直观的思路就是,需要伞兵醒来之后,看到的雷达上的图形,去在图中寻找一个其他伞兵也能找的点
所以一开始想法是找所有伞兵的中点,但是考虑到每个伞兵醒来的时间不一致,这就导致了先前醒来的伞兵在行动之后,中点会发生变化。所以士兵要去的这个点还必须随着士兵的移动不发生改变。
但是到这里就陷入了僵局,我们无论如何也找不到一个点,不随着士兵的移动而不发生变化。
这时也离最终答案就差一步了,就是需要想到可以让有些士兵不动,另外一些士兵去找那些不动的士兵所构成图形的点就好

答案

  1. 所有伞兵都落地后,可以找到一个最小外接圆将所有伞兵都围在圆内,这个圆是唯一的。
  2. 然后所有圆上的伞兵都不动,圆内的伞兵都往圆中心走。
  3. 因为伞兵醒来时间不同所以大家到达圆心的时间是不同,但是当最后一个伞兵到达圆心的时候(因为伞兵可以观察到现在圆心中有几个伞兵,算一下就知道是不是最后一个到达了)
  4. 然后中心圆点的伞兵出发到圆周上,绕圆一周把圆周上的伞兵集齐

后来想到,其实不一定非要用圆,找到闭包就好,闭包构成的多边形上的点不动,然后其余的人去到这个多边形的重心,而后再沿闭包多边形的边找就好。

补充

当面的解法有个小疏漏就是当n=3时,该如何做;或者当所有伞兵的点都在圆环上时该如何做。
我的解法是这样的:
还是做一个外接圆,然后找到外接圆上沿着圆周距离最短的两个点,让这两个点沿着圆周相互靠近,等到相遇的时候,再沿着圆周把其余所有点都找齐。
为什么这样可行,因为如果两个点距离最短那么他们在靠近的时候依旧能够保持着这个性质,所以之后苏醒的人也不会改变这个观测结果。
不过这里还会遇到一个问题,如果一个点两边两个点都距离相等且最小怎么办,那就随机往一个点走就好,因为两边两个点必然也往你这边走,总会碰到其中一个,而另外一个则走到中间那个点那停住就好。
最后还有种最极端的情况,所有点距离都相等,即等距的分布在圆周上,且伞兵同时醒来,且伞兵都按照。
对于这种情况,再加一个补丁:

  1. 当伞兵醒来发现是个等边,那就需要更新策略,比如每个伞兵都走到下一个人的位置之后,不停下继续走等走满一个圆周(这样做是为了防止有些人还在昏迷)
  2. 如果走满圆周后,还是没有碰到人,那么就往一开始的圆心走
  3. 如果走在圆周上碰到了人,就带着那个人一起走,走满之后再往圆心走

一个有趣的面试题:伞兵跳伞问题相关推荐

  1. 今天碰到一道比较有趣的面试题,大家来探讨一下。

    甲乙两地相距100公里,有一辆火车以每小时15公里的速度离开甲地直奔乙地,另一辆火车以每小时20公里的速度从乙地开往甲地.如果有一只鸟,以30公里每小时的速度和两辆火车同时启动,从甲地出发,碰到另一辆 ...

  2. 从一个基础Javascript面试题谈起

    记得第一次面试前端工程师的时候,面试官出了一个机试题,要求每个p单击时弹出不同的值,我是这么写的,执行的时候发现每次都是alert(5),当时坚持认为我的代码没有任何问题,心想这么简单的功能我怎么会弄 ...

  3. 一个经典编程面试题的“隐退”

    [转] 一个经典编程面试题的"隐退" 作者:童燕群 | 发布日期:三月 22, 2014 本文由 伯乐在线 – 王伯 翻译自 The Noisy Channel. 面试程序员很困难 ...

  4. java 有意思面试题_一些JAVA中有趣的面试题

    这几天的JAVA培训课上,不断的唤醒自己对JAVA的理解(时间太长,大学学的快忘干净了),其中有一些很有趣的面试题,都是在抠JAVA细节(唉,我是那种见坑就往下跳的人,一做就错),下面就来分享一下: ...

  5. 给小孩发布一个有趣的网站 在线动物园

    给小孩发布一个有趣的网站 在线动物园,可以实时看到动物园里的动物实时摄像头. 非常有意思,大热天也不用到动物园里看了. http://zoo.baidu.com/video.html

  6. 一个有趣的实验:用0.1f 替换 0,性能提升 7 倍!

    点击关注上方"视学算法",设为"置顶或星标",第一时间送达技术干货. 本文来源:http://cenalulu.github.io/linux/about-de ...

  7. 3个CCIE对一个工程师的面试题(远去之路无比艰辛啊!)

    3个CCIE对一个工程师的面试题这是某人10月初的一个面试题目,售后职位:高级网络工程师.面试官是三位CCIE,面试过程历时2个多小时,印象非常深刻.现在这个offer基本已经确定了,事主还在考虑诸如 ...

  8. 一个有趣的小例子,带你入门协程模块-asyncio

    上篇文章写了关于yield from的用法,简单的了解异步模式,[上次的内容链接]这次让我们通过一个有趣例子带大家了解asyncio基本使用. 目标效果图 在控制台中显示一个由ASCII字符" ...

  9. 这是一个有趣的问题,Java 8 Lambda 表达式被编译成了什么?

    在了解了Java 8 Lambda的一些基本概念和应用后, 我们会有这样的一个问题: Lambda表达式被编译成了什么? 这是一个有趣的问题,涉及到JDK的具体的实现.本文将介绍OpenJDK对Lam ...

最新文章

  1. CEikEdWin 类的使用
  2. datastage服务器项目nls安装,datastage 安装
  3. 学长毕业日记 :本科毕业论文写成博士论文的神操作20170316
  4. pwm控制的基本原理_最详细的电机控制说明
  5. maven(一) 基础知识
  6. html5 子标题栏,HTML5 建构主义标题栏页面模板
  7. Jquery的知识图谱
  8. pandas pivot 计算占比_pandas使用9:如何处理时间序列数据
  9. 计算机网络 王道考研2021 第六章:应用层 -- 域名系统 DNS、域名解析
  10. 计算机专业论文谢辞,计算机专业论文致谢信.docx
  11. 如何设计百万人抽奖系统
  12. 神、上帝以及老天爷(递推公式)
  13. 《Al安全之对抗样本入门》读书笔记 2
  14. citrify免费在线图片处理云软件
  15. fake rolex watches sale Stuff.co.nz - 新西兰最新新闻和世界新闻,体育新闻和天气预报新西兰
  16. 如何用普通电脑去看3D电影
  17. FFmpeg源代码简单分析-通用-avio_open2()
  18. python显示程序运行进度_显示Python程序运行进度
  19. 启示录:日本东京都二子玉川站TOD成功建设经验
  20. 什么性格的人适合做好的程序员?

热门文章

  1. 联想电脑如何进入BIOS
  2. hadoop集群概述
  3. 阿里巴巴-笔试前的测验题:星球大战
  4. 用Python实现两数之和(python)
  5. AAAI 2017论文简析:利用可拍照移动设备感知空气质量---Crowdsensing Air Quality with Camera-enabled Mobile Devices
  6. mysql (errcode 13)_解决Mysql - can't get stat of (errcode:13)
  7. 上海小学生几年级开始学计算机,上海的小学一年级到底是什么水平和真实情况...
  8. 微信公众号开发——获取AccessToken接口调用凭据
  9. Vue中echarts图表x轴文字倾斜展示(防止字迹展示重叠)
  10. C# 数据库SqlServer基础增删改查(返回单个值)