现在有一根蜡烛长n厘米,从一端点火,然后对n-1个位置进行随机切割,将蜡烛分为两段,x和n-x,等较短的一端燃尽后(这里假设x段比较短,较短的一段燃尽后,两段蜡烛长度就变成了0和n-x-x了,注意这里两段蜡烛是同时在燃烧!!),再对剩余的蜡烛(即n-x-x段)进行下一段切割
注意:最多只能切割两次
一种切割方案会产生一个蜡烛燃烧的时间t
求所有切割方案下蜡烛燃烧时间的期望值
注意:有可能切割方案的概率不同(陷阱)
下面献上我的代码和思路,欢迎一起探讨
public class Main {
/*
现在有一根蜡烛长n厘米,从一端点火,然后对n-1个位置进行随机切割,
将蜡烛分为两段,x和n-x,等较短的一端燃尽后
(这里假设x段比较短,较短的一段燃尽后,两段蜡烛长度就变成了0和n-x-x了,注意这里两段蜡烛是同时在燃烧!!),
再对剩余的蜡烛(即n-x-x段)进行下一段切割
注意:最多只能切割两次
一种切割方案会产生一个蜡烛燃烧的时间t
求所有切割方案下蜡烛燃烧时间的期望值
*/
/*
分析:
一个长 n cm的蜡烛,每个位置的切割概率都相同,都为1/(n-1)
切割后,两种情况:
1:两根一样长:时间就是:长度
2:一根长m1,一根短m2。
燃烧m2分钟,短的燃烧燃尽
蜡烛还剩下:m2-m1长度。第一次每个位置点的切割概率都相同
注意::::但是第二次切割的时候,概率不同!!!!!!!!!!!!!
例如:7cm的蜡烛
第一次切一个5cm,一个2cm,有6中切法
第二次切一个5cm的,有4中切法,概率都是不同的
一个时间t的概率:
如果只能切割一次:
第一次切割点的概率*第一次燃烧的时间
如果可以切割两次:
第一次切割点的概率*第二次切割点的概率*(第一次燃烧的时间+第二次燃烧的时间)
第一次切割点的概率:1/第一次可以切割的次数
第二次切割点的概率:1/第二次可以切割的次数
每次可以切割的次数=当前蜡烛长度-1
*/
static int[] two; //two[0]=第一次切割前长度-1=第一次有多少种切法,two[1]=第二次切割前长度-1=第二次有多少种切法
static double n; //记录最终的平均燃烧蜡烛时间的期望值
//len代表长度,cur代表当前所用的时间,count代表第几次切割
public static void dfs(