LightOJ 1027 A Dangerous Maze 概率期望

  题目链接: https://vjudge.net/problem/LightOJ-1027

  题目描述: 有N个门, 每个门的选择是等概率的, 如果选择到正数, 我将在正数秒后逃出迷宫, 如果是负数就重新选, 问逃离的期望时间是多少

  解题思路: 我这道题犯蠢了, 我认为是.....说不太明白, 看程序吧, 一下子就能看懂, 其中涉及到了一个约分, 但是我没想到就算是long long 也会溢出, 那么我将约分放进每次mul中呢? 也是不行的, 因为都是素数呢, 不是一样会溢出? 自己在半个小时后才意识到这个蠢问题.........

        正确解法是 Y = P1 * T1 + P2 * (T2 + Y) 移项就可以整理出Y = 正数个数的倒数 * ∑abs(Xi) , 再将0的情况单独扣出去就可以了

  代码: 下面第一个是我的错误代码, 谨记

#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <cstring>
#include <iterator>
#include <cmath>
#include <algorithm>
#include <stack>
#include <deque>
#include <map>
#include <set>
#include <queue>
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define mem0(a) memset(a,0,sizeof(a))
#define mem1(a) memset(a,-1,sizeof(a))
#define sca(x) scanf("%d",&x)
//#define de printf("=======\n")
typedef long long ll;
using namespace std;

ll x[103];

ll gcd(ll a, ll b) {
    return b==0 ? a : gcd(b, a%b);
}

struct node {
    ll nu;
    ll de;
    node() { nu = de = 1; }
    void mul(ll x, ll y) {
        nu *= x;
        de *= y;
        ll g = gcd(nu, de);
        nu /= g, de /= g;
    }
    void sim() {
        ll g = gcd(nu, de);
        nu /= g, de /= g;
    }
};

int main() {
    int t;
    sca(t);
    int cases = 1;
    while( t-- ) {
        ll n;
        scanf( "%lld", &n );
        ll cnt = 0;
        ll sum = 0;
        for( int i = 0; i < n; i++ ) {
            scanf( "%lld", &x[i] );
            if( x > 0 ) {
                sum += x[i];
                cnt++;
            }
        }
        if( cnt == 0 ) {
            printf( "Case %d: inf\n", cases++ );
            continue;
        }
        else if( cnt == n ) {
            node temp;
            for( ll i = 0; i < n; i++ ) {
                temp.mul(x[i], n);
            }
            if( temp.nu == 0 || temp.de == 0 ) while(1) {}
            temp.sim();
            printf( "Case %d: %lld/%lld\n", cases++, temp.nu, temp.de );
            continue;
        }
        node res;
        res.mul(sum*n, cnt);
        res.mul(n-cnt, cnt);
        res.sim();
        printf( "Case %d: %lld/%lld\n", cases++, res.nu, res.de );
    }
    return 0;
}

#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <cstring>
#include <iterator>
#include <cmath>
#include <algorithm>
#include <stack>
#include <deque>
#include <map>
#include <set>
#include <queue>
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define mem0(a) memset(a,0,sizeof(a))
#define mem1(a) memset(a,-1,sizeof(a))
#define sca(x) scanf("%d",&x)
//#define de printf("=======\n")
typedef long long ll;
using namespace std;

int gcd(int a, int b) {
    return b == 0 ? a : gcd(b, a%b);
}

int main() {
    int t;
    sca(t);
    int cases = 1;
    while( t-- ) {
        int n;
        sca(n);
        int sum = 0;
        int cnt = 0;
        for( int i = 0; i < n; i++ ) {
            int x;
            sca(x);
            sum += abs(x);
            if( x > 0 ) cnt++;
        }
        if( cnt == 0 ) {
            printf( "Case %d: inf\n", cases++ );
            continue;
        }
        int g = gcd(sum, cnt);
        sum /= g;
        cnt /= g;
        printf( "Case %d: %d/%d\n", cases++, sum, cnt );
    }
    return 0;
}

AC

  思考: 在想算法之后, 在写代码之前一定要这个算法代码到底能不能实现, 像我这个De了半个多小时的BUG才发现算法能算出来, 就是无法实现, 以后先公式, 看能不能公式出来, 概率题好多都是这样的

时间: 2024-10-22 06:05:45

LightOJ 1027 A Dangerous Maze 概率期望的相关文章

LightOJ - 1027 A Dangerous Maze 概率

题目大意:迷宫里面有n扇门,每扇门有相应的值,假设第i扇门的值为xi,如果xi > 0,那么xi分钟后,走该扇门就可以走出迷宫了,如果xi < 0,表示走了该扇门之后,需要abs(xi)分钟后才能回到原点,问走出迷宫的期望是多少 解题思路:假设有k扇门(正值用x表示,负值用y表示)期望是d的话 那么d = 1 / k * (x1 + x2 + x3 + .. xn) + 1 / k * (abs(y1) + abs((y2) + - + abs(ym) + m * d) 表示有1/k的概率选到

LightOJ 1027 A Dangerous Maze(期望)

https://cn.vjudge.net/problem/LightOJ-1027 题意:有n扇门,每扇门有个时间ti,选择正数的门可以在ti后带你走出迷宫,负数的门会在ti后带你回到起点,然后重新选择,每扇门被选中的概率是一样的,求期望. 思路: 做这种期望的问题必须得列一个方程来求解,不然无限写下去的话算不出. 设走出去的期望的E,对于第三个案例就是 E = 1/3 * 3  + 1/3( 6 + E) + 1/3 (9 + E),(选择第一扇门就直接出去,第二扇门先6分钟回去,然后再花期

light OJ 1027 A Dangerous Maze (期望)

1027 - A Dangerous Maze PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB You are in a maze; seeing n doors in front of you in beginning. You can choose any door you like. The probability for choosing a door is equal for all

[LightOJ 1027] A Dangerous Maze

A Dangerous Maze You are in a maze; seeing n doors in front of you in beginning. You can choose any door you like. The probability for choosing a door is equal for all doors. If you choose the ith door, it can either take you back to the same positio

LightOj 1027 A Dangerous Maze【概率】

题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1027 题意: 你面前有n个门,每个对应一个数字,若为正xi,代表xi分钟后你会从它走出迷宫,负数则说明你会在-xi分钟后回到出发点且失去记忆.求出去的时间的期望. 代码: #include <iostream> #include <stdio.h> #include <math.h> #include <string> #include

lightoj 1027 A Dangerous Maze 期望

设答案为r,cnt为x[i] >=0的个数 那么r = 1/n *  (Σx[i](x[i] >= 0) + ∑(r - x[i])(x[i] < 0)) 然后把r移项到一起解方程, 得到r = ∑|x[i]| / cnt,同除gcd.记得特判下x[i]均为负数的情况即可. 1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 int T,cas,n,tot,gcd,cnt; 5 i

lightoj-1027 - A Dangerous Maze(数学期望)

1027 - A Dangerous Maze PDF (English) Statistics ForumTime Limit: 2 second(s) Memory Limit: 32 MBYou are in a maze; seeing n doors in front of you in beginning. You can choose any door you like. The probability for choosing a door is equal for all do

Light OJ 1027 - A Dangerous Maze (数学-期望)

题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1027 题目大意: 一个迷宫, 有n个门,选择一个门花费为|ai|, 如果选择的门是正数, 那么直接走出迷宫, 否则重新回到起始位置.选择每一道门的概率是一样的.求走出迷宫的花费的期望. 解题思路:n个门中正数的门有s个, 那么一次选择出去的概率为s/n, 那么出去需要次数的期望为n/s. 对于每一次选择, 需要花费的平均时间为sum(|ai|)/n, 那么走出迷宫的花费的期望

Light OJ 1027 - A Dangerous Maze(概率)

题目大意: 你在一个迷宫里,你面前有n个门,你选择门的概率是一样的,每扇门有一个数字k, 加入这个数字是负数,那么这个门会花费你abs(k)分钟后把你带回原点, 假如这个数字是正数,他可以把你带出迷宫,并且花费时间是k. 问把你带出迷宫的预计期望时间是多少?如果无解输出 “inf”,输出结果要求是最简分数的形式. #include<cstdio> #include<cstring> #include<iostream> #include<algorithm>