Google KickStart 2020 RoundB D 题

Título: Hay una arena con filas W y H. El robot va de (1,1) a (W, H). Hay un agujero negro rectangular en la arena con coordenadas superiores izquierdas (L, U) y coordenadas inferiores derechas (R, D).

El robot solo puede ir hacia la derecha o hacia abajo, con una probabilidad de 1/2. Si el robot está en la última fila, solo puede ir a la derecha; si el robot está en la última columna, solo puede bajar.

Pregúntele al robot la probabilidad de alcanzar con éxito (W, H) sin caer en el agujero negro.

Rango de datos:

1 ≤ T ≤ 100. 
1 ≤ U ≤ D ≤ H. 
1 ≤ L ≤ R ≤ W. 
1 ≤ W ≤ 10 ^ 5. 
1 ≤ H ≤ 10 ^ 5.

Análisis: El robot pasará desde la parte inferior izquierda del agujero negro o desde la parte superior derecha del agujero negro, con complejidad de tiempo O (n).

Nota: Debido a que "si el robot está en la última fila, solo puede ir a la derecha; si el robot está en la última columna, solo puede bajar", por lo que la probabilidad de la última fila y la última columna debe calcularse por separado.

#include <cstdio> 
#include <cstring> 
#include <cstdlib> 
#include <cmath> 
#include <algorithm> 
#include <string> 
#include <iostream> 
#include <set> 
#include <map> 
#include <stack> 
#include <queue> 
#include <vector> 
#include <sstream> 
typedef long long LL; 
const int INF = 0x3f3f3f3f; 
usando el espacio de nombres estándar; 
const int MAXN = 200000 + 10; 
const doble eps = 1e-8; 
int dcmp (doble a, doble b) { 
    if (fabs (a - b) <eps) devuelve 0; 
    devolver a <b? -1: 1; 
} 
doble Log2 [MAXN], last_r [MAXN], last_c [MAXN]; 
int W, H, L, U, R, D; 
void init_log2 () {
    Log2 [0] = 0;
    para (int i = 1; i <MAXN; ++ i) { 
        Log2 [i] = Log2 [i - 1] + log2 (i); 
    } 
} 
void init_last () { 
    last_r [1] = pow (2, Log2 [1 + H - 2] - Log2 [1 - 1] - Log2 [H - 1] - (doble) (1 + H - 2)) ; 
    para (int i = 2; i <= W; ++ i) { 
        last_r [i] = last_r [i - 1] + 0.5 * pow (2, Log2 [i + (H - 1) - 2] - Log2 [ i - 1] - Log2 [(H - 1) - 1] - (doble) (i + (H - 1) - 2)); 
    } 
    last_c [1] = pow (2, Log2 [W + 1 - 2] - Log2 [W - 1] - Log2 [1 - 1] - (doble) (W + 1 - 2)); 
    para (int i = 2; i <= H; ++ i) { 
        last_c [i] = last_c [i - 1] + 0.5 * pow (2, Log2 [(W - 1) + i - 2] - Log2 [ (W - 1) - 1] - Log2 [i - 1] - (doble) ((W - 1) + i - 2)); 
    } 
} 
juez bool (int x, int y) {
    retorno x> = 1 && x <= W && y> = 1 && y <= H; 
} 
int main () { 
    init_log2 (); 
    int T; 
    scanf ("% d", & T); 
    para (int Caso = 1; Caso <= T; ++ Caso) { 
        scanf ("% d% d% d% d% d% d", & W, & H, & L, & U, & R, & D); 
        init_last (); 
        int x = L - 1; 
        int y = D + 1; 
        doble ans = 0; 
        while (juez (x, y)) { 
            if (y == H) { 
                ans + = last_r [x]; 
            } 
            else { 
                ans + = pow (2, Log2 [x + y - 2] - Log2 [x - 1] - Log2 [y - 1] - (doble) (x + y - 2)); 
            }
            ++ y; 
        x = R + 1; 
        y = U - 1; 
        while (juez (x, y)) { 
            if (x == W) { 
                ans + = last_c [y]; 
            } 
            else { 
                ans + = pow (2, Log2 [x + y - 2] - Log2 [x - 1] - Log2 [y - 1] - (doble) (x + y - 2)); 
            } 
            ++ x; 
            --y; 
        } 
        printf ("Caso #% d:% .8lf \ n", Caso, ans); 
    } 
    devuelve 0; 
}

  

Supongo que te gusta

Origin www.cnblogs.com/tyty-Somnuspoppy/p/12737033.html
Recomendado
Clasificación