原题出自:http://topic.csdn.net/u/20110617/10/f9b370a2-dad8-42ad-9202-86e23cd84dea.html

问题描述:小华和小明的风筝不小心断了线,掉到了一个圆形湖圆心处的孤岛上。两人都不会游泳,幸好湖边有一条小船,不过可惜没有桨,也没有其他的动力工具。船上放着 一根绳子,两人决定利用这根绳子,将一头栓在船上,小华上船,小明在岸边拉绳子使船移动的方法,靠近小岛,由小华取回风筝,再由小明把船拉回岸边。如果他们最后成功了,请问这根绳子最少要有多长(栓在船上的部分不计)?他们是怎么做到的?

分析:设湖的圆心为O,湖的半径为r。显然绳子长度>=r, 问题是能不能达到r。下面用逼近的思想,说明绳子长度理论上应该可以做到最短为湖的半径r,具体做法是(参考下图):首先船位于A点不动(小华在船上),另一个人(即小明)手中拿着绳子沿着湖边走,直到B点,这时刚好把绳子拉直(可以做到这一点,因为设|AB|表示线段AB的长度,则A到沿途中任何点的弦都小于|AB|),设该绳子对应的线段为AB(A是船开始所在位置,B是人所在位置),然后小明停下来开始把船拉到AB的中心位置(即O到AB的垂点位置P)让船静止。接下来,保持船静止,小明拿着绳子沿着湖边走到B',这时他停下来刚好把绳子拉直,设该绳子对应的线段为A'B'(或PB'),然后开始把船拉到P'位置让它停下来(小明的动作必须温柔,否则由于惯性,船会移动),这里P'是O到线段A'B'的垂点,显然P'比上一次 的位置P更接近圆心O点(因为|OP'|<|OP|),按这种方式进行下去,每次得到船的停止位置都比上一次停止位置更接近O点。到此为止讨论的绳子长度可以是一个任意长度s(甚至s可以小于r),显然如果要让船到达湖心O点,绳子的极限值是湖的半径r。

图中绿色实线是船经过的路径,这里只显示两步。上面第二步操作中因为OB'=r>OA',所以P'比上一次的P点更靠近A',即每一次拉船的行程比上一次的行程要小。如果要精确计算的话,|OP|=sqrt(3)/2 * r,  |OP'| = sqrt(39)/8 * r。一般情况下,设上一次操作中O到垂点P的高度为x,则下一次操作中O到垂点P的高度则为x * sqrt(r^2 - x^2 / 4) / r。

如何计算小明走过的距离?

第二步操作中小明走过的一段距离为B到B'的弧长,如果知道BOB'的夹角就可以算出该弧长。设BOB'的夹角为theta,设|OP|=x,夹角OBA为alpha,可以通过sin(alpha) = x/r算出alpha,这样可以算出夹角POB = PI/2 - alpha,由于三角形OPB'是腰长等于r的等腰三角形,如果设夹角POB'等于beta,可以得到:cos(beta) = (x/2)/r=x/(2*r),这样算出beta之后,就可以算出theta = beta - 夹角POB = beta - (PI/2 - alpha) = beta + alpha - PI/2。所以B到B'的弧长 = r*theta = r*(beta + alpha - PI/2)。

程序:(计算小明和船走过的路程)

public class KiteSalvage { //return the boat's distance and xiaoming's distance in total public static double[] solve(double r){ double epsilon = 0.5; //unit: meter ( = r's unit) //set initial values double x = Math.sqrt(3)/2.0 * r; double xiaoming = Math.PI/3.0 * r; double boat = r/2.0; while(true){ double x_prime = x * Math.sqrt(r*r - x*x/4.0) / r; boat += Math.sqrt(x*x - x_prime*x_prime); double alpha = Math.asin(x/r); double beta = Math.acos(x/2.0/r); double theta = beta + alpha - Math.PI/2.0; xiaoming += r*theta; if(Math.abs(x_prime - x)< epsilon){ break; } x = x_prime; } return new double[]{xiaoming,boat}; } public static void main(String[] args) { double r = 100; //100 meter for the lake double[] result = KiteSalvage.solve(r); System.out.format("For lake radius %.2f, Xiaoming'd total distance = %.2f, Boat's total distance = %.2f%n",r,result[0],result[1]); } }

测试:

For lake radius 100.00, Xiaoming'd total distance = 885.87, Boat's total distance = 416.45

拯救湖心的风筝(一道趣味平面几何问题)相关推荐

  1. 在马克思手稿中有一道趣味的数学问题:一共有30个人,可能包括男人,女人和小孩。他们在一家饭馆吃饭共花了50先令,其中每个男人花3先令,每个女人花2先令,每个小孩花1先令。请问男人、女人和小孩各几人?

    在马克思手稿中有一道趣味的数学问题:一共有30个人,可能包括男人,女人和小孩.他们在一家饭馆吃饭共花了50先令,其中每个男人花3先令,每个女人花2先令,每个小孩花1先令.请问男人.女人和小孩各几人?请 ...

  2. C语言马克思手稿中有这样一道趣味数学题

    马克思手稿中有这样一道趣味数学题:男人.女人和小孩总计30个人,在一家饭店里吃饭,共花了50先令,每个男人各花3先令,每个女人各花2先令,每个孩子各花1先令,请用穷举法编程计算男人.女人和小孩各有几人 ...

  3. P1506 拯救oibh总部(一道我永远也过不了的题)

    P1506 拯救oibh总部(一道我永远也过不了的题) 题解:(gg染色法 ) 在矩阵外加一圈0,再DFS 其实,挺水的,但是,这不是一道一般的题,我下载了第一个点的数据,本地过了,但是,我竟然爆零了 ...

  4. 一道初等平面几何竞赛题的暴力解法

    问题 一道初中数学竞赛,平面几何题计算: 这里改成了证明题,反正思路是一样的. 暴力解法 中学的题就应该有中学的解法.但是,看习惯了高等数学的内容之后,更习惯暴力解法.暴力破解的方法是怎样的? 首先, ...

  5. 7道腾讯算法编程真题,你能做对几道?包含一道趣味题

    1.生成格雷码 在一组数字的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(GrayCode),请编写一个函数,使用递归的方法生成N位的格雷码.给定一个整数n,请返回n位的格雷 ...

  6. 一道腾讯面试题:厉害了我的杯

    题目描述 有一种玻璃杯质量确定但未知,需要检测. 题目解析 2 个杯子的脆弱程度是一样的 如果杯子从 N 楼扔下来没有碎,那么它从小于 N 楼扔下来,也不会碎 如果杯子从 N 楼扔下来碎了,那么它从大 ...

  7. c/c++ 趣味程序百例

    C/c++趣味程序百例(献给C/C++初学者) C/c++趣味程序百例(献给C/C++初学者) 1.绘制余弦曲线 2.绘制余弦曲线和直线 3.绘制圆 4.歌星大奖赛 5.求最大数 6.高次方数的尾数 ...

  8. 趣味数学--贷款计算

    趣味数学题(50分) 题目内容:马克思手稿中有这样一道趣味数学题:男人.女人和小孩总计n个人,在一家饭店里吃饭,共花了cost先令,每个男人各花3先令,每个女人各花2先令,每个小孩各花1先令,请用穷举 ...

  9. C/C++趣味编程经典100例详解

    更新记录   2019-08-27 28题 重写     C/C++语言经典.实用.趣味程序设计编程百例精解 1.绘制余弦曲线 在屏幕上用"*"显示0~360度的余弦函数cos(x ...

最新文章

  1. 简明 Python 编程规范v2
  2. CentOS的改变系统启动级别
  3. 数据湖三种方案的流行度调查
  4. Voronoi diagram应用
  5. flash+xml 制作电子相册教程
  6. 芯片数据分析笔记【01】 | 基因芯片的基本原理
  7. 2018ACM/ICPC 焦作网络预选赛-A Magic Mirror
  8. 单片机多功能电子琴课设_基于单片机的简易电子琴课程设计.doc
  9. win10 应用程序exe图标突然变成白色,怎么恢复?
  10. 谁痛苦谁改变 落到谷底时,唯一的出口就是向上
  11. Learning to ranking简介
  12. checkbox选中时如何改变默认样式
  13. 【渝粤教育】广东开放大学 学前教育研究方法 形成性考核 (23)
  14. hydrus1d使用说明_HYDRUS——1D中文说明书.pdf
  15. 猿创征文|Google Earth Engine(GEE)实现土地利用数据栅格转矢量
  16. mac idea 配置 cmd+ 向上/向下 移动光标到 首/尾行
  17. phpnow下安装cmstop大众版需要注意的地方
  18. .net core 压力测试 web性能工具
  19. 信息学奥赛训练体系(2023.02.21)
  20. 骚年,来填坑了!!!

热门文章

  1. 手机连锁店经营可视化
  2. LeetCode 141.带环问题(判断是否带环) 142.带环问题(返回入环点)
  3. 水果忍者未能连接到服务器,打开水果忍者提示网络异常或者连接不上
  4. 怎么让PPT分享不那么枯燥?
  5. 计算机黑屏鼠标不亮,技术员给你电脑开机后显示器黑屏 鼠标灯亮 键盘灯不亮?...
  6. jdread刷机包_jdread1怎么样?
  7. 在word输入上标下标
  8. javabean和xml相互转化的工具类
  9. simulink测量任意波形的平均功率或者有效功率或者一定时间内的功
  10. 苹果13磁吸充电宝哪个牌子好?苹果13磁吸充电宝推荐