【概率&数学期望】A Dangerous Maze LightOJ

来源:互联网 发布:免费通达信看盘软件 编辑:程序博客网 时间:2024/05/22 06:50

Think:
1知识点:概率&数学期望
2题意:
(1):T组测试数据
(2):每组测试数据,n扇门,每扇门对应一个xi,等概率进入任意一扇门,若进入门的xi为正,则xi秒之后离开迷宫,若进入们的xi为负,则xi秒之后返回初始点
(3):询问离开迷宫的数学期望
(4):输出格式:测试数据 期望值最简分子/期望值最简分母
3解题思路:
(1)xi > 0: d1 = (1/n) * (x1+x2+…+xu)
(2)xi < 0: d2 = (1/n) * (abs(y1)+abs(y2)+…+abs(yv) + v*d)
即d = d1 + d2 = (1/n) * (x1+x2+…+xu) +(abs(y1)+abs(y2)+…+abs(yv) + v*d)
即(n-v) * d = x1 + x2 + … + xu + abs(y1) + abs(y2) + … + abs(yv)
即:
若v == n 则 d = inf
除此之外:
sum = x1 + x2 + … + xu + abs(y1) + abs(y2) + … + abs(yv)
t = gcd(sum, n-v)
d = p/q
p = sum/gcd(sum, n-v)
q = (n-v)/gcd(sum, n-v)

vjudge题目链接
建议参考博客——题意分析

以下为Accepted代码

#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std;int gcd(int x, int y);int main(){    int cas = 1, T, n, m, sum, i, x;    scanf("%d", &T);    while(T--){        scanf("%d", &n);        m = 0, sum = 0;        for(i = 0; i < n; i++){            scanf("%d", &x);            if(x > 0) sum += x;            else {                sum += -x;                m++;            }        }        if(m == n){            printf("Case %d: inf\n", cas++);        }        else {            int t = gcd(sum, n-m);            printf("Case %d: %d/%d\n", cas++, sum/t, (n-m)/t);        }    }    return 0;}int gcd(int x, int y){    if(!y) return x;    else return gcd(y, x%y);}
原创粉丝点击