爱奇艺2020届Java后端开发笔试编程题第二题
有ABC三个角色 然后一个袋子里有红球和篮球。ABC按顺序去里面随机拿一个颜色的球, A拿到红球才算A获胜, B拿红球的话B就获胜, C是打酱油干扰的拿红球或者篮球都不影响结果。
输入3 4( 第一个数是红球,第二个数是篮球), 题目要求求A获胜的几率
输出 0.62857
笔试过后我才把答案AC出来, 很可惜去不了老东家了 初步代码如下(没有处理精度转换,但是问题不大)
import java.util.*; public class Main { private static Double tp = 0.0; public static void main(String[] args) { Scanner sc = new Scanner(System.in); Double red = sc.nextDouble(); Double blue = sc.nextDouble(); Double sum = red + blue; Double totalP = 1.0; helper(sum, totalP, red, blue, 0, 3, false); System.out.println(tp); } // 这道题只有当A拿到红色的时候 flag 才会等于true. public static void helper(double sum, double totalP, double red, double blue, int role, int sequence, boolean flag) { if(flag) { tp += totalP; return ; } if(role % 3 == 0 ) { // 只有A选择红球 直接获胜 double temp = totalP; if(red > 0) { helper(sum - 1, temp * red / sum, red - 1, blue, role + 1, sequence, true); } // 蓝球 继续跑 if (blue > 0) { helper(sum - 1, temp * blue / sum, red, blue - 1, role + 1, sequence, false); } } else if( role % 3 == 1){ //对于B角色而言只要考虑他选择蓝色的球继续循环的情况,因为红球则终止。 if( blue > 0) { helper(sum - 1, totalP * blue / sum, red, blue - 1, role + 1, sequence, false); } } else if( role % 3 == 2) { double temp = totalP; //对于C而言 蓝球和红球都要考虑 if( red > 0) { helper(sum - 1, temp *= (red/sum), red - 1, blue, role + 1, sequence, false); } double temp2 = totalP; if(blue > 0 ) { helper(sum - 1, temp2 *= (blue/ sum), red, blue - 1, role + 1, sequence, false); } } } }