Play the Dice
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 2914 Accepted Submission(s): 927
Special Judge
The first line is an integer n (2<=n<=200), following with n integers ai(0<=ai<200)
The second line is an integer m (0<=m<=n), following with m integers bi(1<=bi<=n), which are the numbers of the special sides to get another more chance.
什么题啊这是,题意感觉不太清晰啊……读着以为每次投的时候,要算有特殊标记的上的数字,然后再投,其实投到有特殊标记的就只是多获得的一次机会而已啊?
并不算这个特殊面上的数字是多少。
这样的话每次投到有特殊标记的概率是m / n
设q = m / n, a = sum / n
那么最后的期望就是
E(Y) = a + a * q + a * q^2 + a * q^3 + ... + a * q^k , k->无穷
E(Y) = lim a(1 - q^(k + 1)) / (1 - q), k ->无穷
这时候就看q = m / n的大小了
如果m == n,那么1 - q == 0,发散
如果m > n,那么q^(k + 1)趋于无穷,发散
如果m < n,那么E(Y) = a(1 - 0) / (1 - q) = (sum / n) / (1 - m / n) = sum / (n - m)
另外就是sum = 0的时候不管怎么样最后肯定是0
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int n, m, sum;
int a[205], b[205];
int main()
{
while (~scanf("%d", &n)) {
sum = 0;
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
sum += a[i];
}
scanf("%d", &m);
for (int i = 0; i < m; i++) {
scanf("%d", &b[i]);
}
if (sum == 0) {
puts("0.00");
continue;
}
if (m >= n) {
puts("inf");
} else {
printf("%.2f\n", 1.0 * sum / (n - m));
}
}
return 0;
}