LightOJ - 1027 (期望基础)
题目链接:LightOJ - 1027
题目大意: 给你n个门,每次进每个门的概率都是一样的,正数代表你x分钟后可以离开这里,负数代表你x分钟后回到这里。求预期离开的时间, 如果时间无限大,输出inf。
数据范围:
1≤abs(xi)≤10000
解题思路:
用 E 表示离开所需要的时间。考虑两种情况:
- 选了正数, 概率为
1n , 期望为 1k∗ni , 结束。- 选了负数, 概率为 1n , xi 分钟之后回到原点, 那么期望为 1n∗(E+xi)
如果正数个数为0, 答案为inf。
否则期望为 E=(a1+a2+...+acnt1)n+(b1+b2+..+bcnt2+E∗cnt2)n
其中 ai 是正数, bi 是负数的绝对值, cnt1,cnt2 分别是正数和负数的个数。
最后化简结果: E=sumcnt1 , cnt1 是正数的个数, sum 是 ∑ni=1xi 。
代码:
/******************************************** *Author* :��ZZZZone *Created Time* : 五 10/13 18:48:36 2017 * Ended Time* : 五 10/13 18:54:58 2017 *********************************************/ #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <cmath> #include <cstdlib> #include <ctime> #include <stack> using namespace std; typedef pair<int, int> PII; typedef long long LL; typedef unsigned long long ULL; int T, n, Case; int gcd(int a, int b){ if(!b) return a; else return gcd(b, a % b); } int main() { scanf("%d", &T); while(T--){ scanf("%d", &n); int cnt = 0, sum = 0; for(int i = 1; i <= n; i++){ int x; scanf("%d", &x); if(x > 0) cnt++; sum += abs(x); } printf("Case %d: ", ++Case); if(cnt == 0) printf("inf\n"); else{ int Gcd = gcd(sum, cnt); printf("%d/%d\n", sum / Gcd, cnt / Gcd); } } return 0; }
在此输入正文