题目描述
一个盒子里面放k种颜色的球,第i种颜色的球有Ai个,每次有放回的取出一个球并得到该球的颜色。问在取出过程中得到所有颜色之前需要取多少次(K已知,Ai已知)
分析:举例有黑白两种颜色的球,分别是5个和10个,每次概率相等的取球。计算拿到2种颜色时取球次数的期望
可以取2~无穷次,因为每次是等概率取。(该例结果为3.500000)
该题就是算累加和,需要将数学累加公式实现一遍并且需要注意精度问题,test case 有三分之一没过,实在不懂为啥,又不能再次提交,烦躁呀!
import java.util.Scanner;
class Main{
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
int k = Integer.valueOf(in.next());
int[] balls = new int[k];
for (int i = 0; i < balls.length; i++) {
balls[i] = Integer.valueOf(in.next());
}
double[] eachBallProbability = new double[k];
double result = 0;
int sumBalls = 0;
for (int i = 0; i < balls.length; i++) {
sumBalls += balls[i];
}
for (int i = 0; i < eachBallProbability.length; i++) {
eachBallProbability[i] =(double) balls[i] / sumBalls;
}
for (int i = 0; i < eachBallProbability.length; i++) {
result += getExpected(k, eachBallProbability[i]);
}
System.out.println(result);
}
}
// getExpected 用于计算每种颜色期望的公式,题解就是返回K种期望的和,数学推导公式不理解就去好好复习下高中数列
public static double getExpected(int k, double p){
double result = 0;
result = k * Math.pow(1-p, k-1) + Math.pow(1-p, k)/p;
System.out.println("result:" + result);
return result;
}
}