题意:给你N个骰子,1-n上标有各自的数,然后掷骰子一次,得到朝上数字数量的钱;再给你m,然后m个数表示,当该数朝上时,你可以得到这么多钱,并且可以继续掷骰子。
问你你能得到的钱的期望。
思路:若骰子上面的数字和为sum,则掷第一次:sum/n
第二次:sum/n*(m/n)
第三次:sum/n*(m/n)*(m/n)
.........
第k次:sum/n*(m/n)^k
答案为当k取无穷大时,上式的和,整理发现为等比数列,结果为:
计 q = m/n
sum/n * (1-q^k)/(1-q);
当sum==0时,无论怎么掷骰子,得到的都是0
当n==m时,无论怎么掷骰子,都掷不完,一直有下一次掷骰子,所以为inf
其余情况,由于m<n,所以当k取无穷大时,q趋向于0,则上式整理的:sum/(n-m),代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long LL;
const int maxn = 207;
double sum;
int n, m;
int main() {
while(~scanf("%d", &n)) {
sum = 0.0;
for(int i = 0; i < n; ++i) {
int t; scanf("%d", &t);
sum += t*1.0;
}
scanf("%d", &m);
for(int i = 0; i < m; ++i) {
int t; scanf("%d", &t);
}
if(sum == 0.0) printf("0.00\n");
else if(n == m) printf("inf\n");
else {
printf("%.2lf\n", sum/(n-m));
}
}
}