LightOJ

来源:互联网 发布:我思考所以我存在知乎 编辑:程序博客网 时间:2024/06/03 21:06

LightOJ - 1027 (期望基础)

题目链接:LightOJ - 1027

题目大意: 给你n个门,每次进每个门的概率都是一样的,正数代表你x分钟后可以离开这里,负数代表你x分钟后回到这里。求预期离开的时间, 如果时间无限大,输出inf。
数据范围: 1abs(xi)10000
解题思路:

E表示离开所需要的时间。考虑两种情况:

  • 选了正数, 概率为1n, 期望为1kni, 结束。
  • 选了负数, 概率为1nxi分钟之后回到原点, 那么期望为1n(E+xi)

如果正数个数为0, 答案为inf。

否则期望为E=(a1+a2+...+acnt1)n+(b1+b2+..+bcnt2+Ecnt2)n

其中ai是正数, bi是负数的绝对值, cnt1,cnt2分别是正数和负数的个数。

最后化简结果:E=sumcnt1, cnt1是正数的个数,sumni=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;}

在此输入正文

原创粉丝点击