题目大意说:有10个房间,每个房间内各有一个大小不同的宝石,如果前4个房间只看不拿,在后面的6个房间,发现一个比前面4个房间内的宝石都大的宝石就拿,否则拿最后一个,问拿到最大的宝石的概率?

设最大宝石在第i个位置(i=1...10),应该是等概率的1/10
1.设 i = 5, p =1
2.i=6...10,需要考虑前i-1个位置上的宝石大小,假设前i-1个宝石中最大的(max(i-1))不在前四位中,则因为这个宝石(max(i-1))在最大的宝石(max(10))前面,且(max(i-1))大于前四个中的任一个,所以取不到最大(max(10)),相反max(i-1)在前四个位置则可以取到最大宝石(max(10)), 而最大宝石在前四的概率为(4/i-1)

所以,概率为1/10*(1+4/5+4/6+4/7+4/8+4/9)

代码验证为:

View Code
 1 import java.util.*;
 2 class Test {
 3     //对大小量化的数列
 4     private int a[] = {1,2,3,4,5,6,7,8,9,10};
 5     public int cnt = 0;
 6     //产生所有的排列
 7     public void seq(int i) {
 8         if(i==9) cnt += process();
 9         for(int j=i;j<10;j++) {
10             swap(i,j);
11             seq(i+1);
12             swap(i,j);
13         }
14     }
15     private void swap(int i, int j) {
16         int temp = a[i];
17         a[i] = a[j];
18         a[j] = temp;
19     }
20     private int process() {
21         int max4 = 0;
22         for(int i =0;i<4;i++)max4 = max4 > a[i] ? max4 : a[i];
23         for(int i=4;i<10;i++)if(a[i]>max4){
24             //拿到最大
25             if(a[i]==10)return 1;
26             else return 0;
27         }
28         //最大在前四个位置
29         return 0;
30     }
31     
32     public static void main(String args[]) {
33         Test test = new Test();
34         test.seq(0);
35         System.out.println(test.cnt);
36     }
37 }

 

概率为 cnt/(10!)  cnt = 1445184