LightOJ - 1027 (期望基础)

LightOJ - 1027 (期望基础)

题目链接:LightOJ - 1027

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

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

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

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

否则期望为 E=(a1+a2+...+acnt1)n+(b1+b2+..+bcnt2+Ecnt2)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;
}

在此输入正文

猜你喜欢

转载自blog.csdn.net/zzzzone/article/details/78231002
今日推荐