4.骰子期望
扔n个骰子,第i个骰子有可能投掷出Xi种等概率的不同的结果,数字从1到Xi。所有骰子的结果的最大值将作为最终结果。求最终结果的期望。
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32M,其他语言64M
输入描述:
第一行一个整数n,表示有n个骰子。(1 <= n <= 50)
第二行n个整数,表示每个骰子的结果数Xi。(2 <= Xi <= 50)
输出描述:
输出最终结果的期望,保留两位小数。
示例1
输入例子:
2
2 2
输出例子:
1.75
思路
古典概型,结果数要求为i的情况下,可能的情况为结果数为i+1的情况减去结果数为i-1的情况。
例子为骰子的结果数(面数)为5、6、10、7时
要求结果数为(面数)4的时候,计算为5555-3333
要求结果数为(面数)6的时候,计算为5666-5555
可以想成掷出更多一点点数的情况减去不可能掷出目标点数的情况,得到的就是掷出目标点数的情况。
期望在这里就是所有点数分别乘以概率的总和。
代码
#include <iostream>
#include <vector>
#include <iomanip>
using namespace std;
int main() {
int n;
cin>>n;
vector<int> num(n,0);
int maxval=0;
for(int i=0;i<n;i++){
int temp;
cin>>temp;
if(temp>maxval)
maxval=temp;
num[i]=temp;
}
double all=1;
for(auto i:num)
all*=i;
double res=1.0;
res/=all;
for(int i=2;i<=maxval;i++){
double temp1=1.0;
double temp2=1.0;
for(int j=0;j<n;j++){
if(num[j]>=i){
temp1*=i;
temp2*=(i-1);
}else{
temp1*=num[j];
temp2*=num[j];
}
}
res+=(i*(temp1-temp2)/all);
}
cout<<fixed<<setprecision(2)<<res;
//setprecision() 来用来保存有效数字,fixed 和 setprecision()一起用就变成保存小数点后有效数字。
}
// 64 位输出请用 printf("%lld")