------文章底部代码分享

一、题目

标题:绳圈
今有100 根绳子,当然会有200个绳头。
如果任意取绳头两两配对,把所有绳头都打结连接起来。最后会形成若干个绳圈(不考虑是否套在一起)。我们的问题是:请计算最后将形成多少个绳圈的概率最大?
注意:结果是一个整数,请通过浏览器提交该数字。不要填写多余的内容。

二、解题

    这个题在原理上是特别简单,难点在于公式的推演;

2.1

        第一步建立一个二维数组,横坐标存储绳子数量,纵坐标存储组成的圈数,内部存储该绳子数量组成的圈的概率;

        将 1 根绳子组成一个圈的情况赋值 1 ;

2.2

  直接使用暴力枚举遍历出所有情况下的概率;

2.3

  因为 概率 = 当前状况的数量 / 所有情况总数 ;

        所以我们主要想办法理出当前状况数量跟所有情况总数的规律;

        

        A.方法总数的规律:

        方法总数[ i-1 ]在增加一根绳子求方法总数[ i ]的时候有两种搭配情况,

        1.方法总数在组成曾组成过的圈数时每增加一个结点的时候相当于每次方法总量自身乘以了 ( 绳子数 - 1 ) ,因为一根线有两个结点,故每增加一根绳子的时候相当于每次方法总量自身乘以了 2 * ( 绳子数 - 1 )

        2.还有一种情况是新增绳子自成圈,即方法总数[ i-1 ]增加一根线时需要增加方法总量[ i-1 ]个情况;

        将 1 、2 组合得到:

        方法总数[ i ] = 方法总数[ i-1 ] * 2 * ( i - 1 ) + 方法总数[ i-1 ];

        化简为:

        方法总数[ i ] = 方法总数[ i-1 ] * ( 2 * i - 1 );

        

        B.圈数为 1 的变化规律:

        1.因为每增加一个结点组成数量就能需要乘以 ( 绳子数 - 1 ) ,而一条绳子有两个结点,故每次绳子数 +1 就需要乘以 2 * ( 绳子数 -1 )倍的数量;

        2.因为 ( 绳子数 -1 情况下组成 1 圈的概率 )  * ( 绳子 -1 情况下的绳子总数 ) = 绳子数 -1 情况下的组成 1 圈的方法量 ,

        故组合为 概率[ i ][ 1 ] =/ 方法总数[ i ];
        将 A 、B 组合得出 概率[ i ][ 1 ] = 概率[ i-1 ][ 1 ] * 方法总数[ i-1 ] * 2 * ( i - 1 ) / 方法总数[ i-1 ] * ( 2 * i - 1 ) ;

        

        C.圈数为 j 时的变化规律:

        1.组成圈数为 j 的情况再加一根绳可以有两种情况,一种是原绳子组成 j - 1 个圈的情况下新增绳子自成一个圈,一种是新增绳子插入到原绳子数组成 j 个圈的情况;

        2.新增绳子自成一圈的情况的计算就相当于原绳子组成 j - 1 个圈的情况的数量,即:

        概率[ i-1 ][ j-1 ] * 方法总数[ i-1 ];

        3.参考 B 可以得出,增加一根绳子插入可得到的数量为:

         概率[ i-1 ][ j ] * 方法总数[ i-1 ] * 2 * ( i - 1 );

        

        D.将 A、C 组合起来为:

        概率[ i-1 ][ j-1 ] * 方法总数[ i-1 ] + 概率[ i-1 ][ j ] * 方法总数[ i-1 ] * 2 * ( i - 1 ) / 方法总数[ i-1 ] * ( 2 * i - 1 ) ;

        将分子分母中共有的方法总数[ i-1 ]化简,得到:

        概率[ i ][ j ] = 概率[ i-1 ][ j-1 ] + 概率[ i-1 ][ j ] * 2 * ( i - 1 ) / ( 2 * i - 1 ) ;

        

        将公式写入遍历内:

2.4

        声明两个变量一个存储 100 根绳子组成 x 个圈的概率,一个存储所存概率是的 x 圈数;

        通过遍历将最大的圈数概率选取出来,最后输出圈数;

三、代码分享

public class Main {public static void main(String[] args) {double[][] arr = new double[101][101];arr[1][1] = 1;int i , j;for ( i = 2; i < 101; i++ )for ( j = 1; j <= i; j++ ){arr[i][j] = ( arr[i-1][j] * 2 * ( i - 1 ) + arr[i-1][j-1] ) / ( 2 * i - 1 );}double prob = arr[100][1];int num = 1;for ( i = 2 ; i < 101 ; i++ ){if ( prob < arr[100][i] ){prob = arr[100][i];num = i;}}System.out.println( num );}
}

JAVA算法练习(10):绳圈相关推荐

  1. 1.1.10 从二分查找BinarySearch开启算法学习之路---《java算法第四版》

    文章目录 0.前言 1.功能 2.示例 有两个名单tinyW.txt和tinyT.txt,将tinyT.txt名单中不在tinyW.txt的数据打印出来 ① 实现原理 ② 实现代码 ③ 性能分析 0. ...

  2. java算法----排序----(6)希尔排序(最小增量排序)

    1 package log; 2 3 public class Test4 { 4 5 /** 6 * java算法---希尔排序(最小增量排序) 7 * 8 * @param args 9 */ 1 ...

  3. java书籍_学习Java最好的10本书,从入门到精通

    在当代,学习Java等编程课程的主要方式是视频资源,如果你想学,在网上五分钟之内就可以找到一堆学习视频,瞬间将你的硬盘填满.但是这些课程质量良莠不齐,对于小白来说很难辨别好坏. 但是书籍不同,书籍都是 ...

  4. 128位java_求一个java算法,用128位密钥的AES加密128位明文,得出的密文还是128位...很着急,非常感谢各位大神,求救!...

    求一个java算法,用128位密钥的AES加密128位明文,得出的密文还是128位...很着急,非常感谢各位大神,求救! 关注:157  答案:1  mip版 解决时间 2021-02-03 09:1 ...

  5. 悲哀!面试现场,简单几道java算法题,90%程序员没写出来

    这两天小编逛论坛的时候发现一个很有意思的事情,就是一位互联网公司的面试官分享的,他们最近想招一批java的实习生,所以他们的面试题并不难,但是前来面试的人,却很多都挂在了几道算法题上,要么就是逻辑不严 ...

  6. 黑马程序员---java算法实现输出任意奇数维数独

    java算法实现输出任意奇数维数独 ----------- android培训.java培训.java学习型技术博客.期待与您交流! ----------- /** 该类可以打印任意维数数独,但是必须 ...

  7. 我整理了50道经典Java算法题,直接进了字节跳动!!

    写在前面 最近,很多小伙伴都想进入字节跳动这个快速发展的公司,而字节跳动对于算法的要求比较高.于是乎,有些小伙伴问我能否整理一些基础的算法题,帮助他们提升下基础算法能力.我:没问题啊!于是,经过半个多 ...

  8. JAVA算法:李白遇花喝酒游戏JAVA DFS 算法设计

    JAVA算法:李白遇花喝酒游戏JAVA DFS 算法设计 看到了这样的一道题目,还挺有意思,可以通过不同的算法设计来求解. 话说大诗人李白,一生好饮.一日,他提着酒壶,从家里出来,酒壶中有酒2斗.他边 ...

  9. 格雷通路 算法 java,Java算法与数据结构教程

    北上广容不下肉身, 三四线放不下灵魂, 程序员里没有穷人, 有一种土豪叫 算法工程师. 程序 = 数据结构 + 算法 程序是为了解决实际问题而存在的.然而为了解决问题,必定会使用到某些数据结构以及设计 ...

  10. Java算法:华为机试算法(下),华为算法Java版,牛客网华为算法73~108题

    接上篇:Java算法:华为机试算法(中),华为算法Java版,牛客网华为算法55~72题   HJ73 计算日期到天数转换 计算日期到天数转换 题目描述 根据输入的日期,计算是这一年的第几天.. 测试 ...

最新文章

  1. ES6 let const 关键字
  2. python histo 改变 bins 大小_子批次大小python
  3. 推荐系统里的那些坑儿
  4. Scala键盘录入代码示例
  5. ant接口自动化 junit_ant 学习(3)--结合junit形成自动化测试小框架
  6. 马尔科夫决策过程(MDP)
  7. 超声乳化设备行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  8. 大专java考试试题_专科—程序设计基础题库-java.doc
  9. 使用递归解决斐波那契数列的性能问题
  10. 现浇板用弹性计算方法_现浇板裂缝处理办法全总结!
  11. 《未来世界的幸存者》摘录
  12. 苹果电脑上的Word打不开怎么办?Word文件怎么恢复?
  13. 做笔记的方法—— 推荐笔记方法Word方式
  14. 【战神引擎】游戏不开门怎么解决?
  15. 分享一套国产化技术开发JAVA语言,大佬手下留情
  16. 根据印刷行业的特点,整理出MES管理系统解决方案
  17. UDF和UDAF,UDTF的区别
  18. The Shawshank Redemption-17
  19. 网络流最大流----EK算法
  20. 企业邮箱的注册申请,个人企业邮箱申请流程!

热门文章

  1. 11贴图控件-09图片背景日历-imagecalendar
  2. 618游泳耳机推荐排行榜,这四款游泳必备
  3. Oracle的C 模板,Oracle 19c 官方文档系列-《Database Administrator’s Guide》
  4. 5G NR之SRS Resource Indicator(SRI)天线选择
  5. vue接口总是请求超时_vue axios请求超时的正确处理方法
  6. IDC 2022上半年中国IT安全软件市场15.1亿美元,行云管家为企业信息安全持续赋能
  7. 达梦中创建dblink链接oracle
  8. LeanTouch 案例分享
  9. C++后台实践:古老的CGI与Web开发
  10. Hexo 个人博客主题美化