【ACWing】 1100. Agarra la vaca

Dirección del asunto:

https://www.acwing.com/problem/content/description/1102/

El granjero conocía la ubicación de una vaca y quería atraparla. Tanto el granjero como la vaca están en la recta numérica y el granjero comienza en el punto NNN , la vaca está en el puntoKKK . El agricultor tiene dos formas de moverse:
desdeXXX se mueve aX - 1 X − 1X - 1 oX + 1 X + 1X+1. Cada movimiento toma un minuto;
desdeXXX se mueve a2 ∗ X 2 ∗ X2 X , cada movimiento toma un minuto.
Supongamos que la vaca no se da cuenta de las acciones del granjero y se detiene. ¿Cuánto tiempo le toma al granjero al menos atrapar la vaca?

Formato de entrada:
una línea, que contiene dos números enteros NNN yKKK .

Formato de
salida : genera un número entero, que indica el tiempo mínimo que se tarda en atrapar una vaca.

Rango de datos:
0 ≤ N, K ≤ 1 0 5 0≤N, K≤10 ^ 50N ,K1 05

La idea es BFS. Se puede realizar una optimización adecuada, por ejemplo, si la posición actual xxx es mayor o igual quekkk , no es necesario expandirx + 1 x + 1al expandirX+1 suma2 x 2x2 x , porque después de la expansión,hay querestar1 11 Ir hacia la izquierda desperdiciará tus pasos en vano; además, no necesitas expandir el número negativo, porque tienes que sumar1 1después de la expansión.1 Ir a la derecha es una pérdida de pasos. el código se muestra a continuación:

#include <iostream>
#include <queue>
using namespace std;

const int N = 2e5 + 10;
int n, k;
queue<int> q;
bool st[N];

int bfs(int n, int k) {
    
    
    if (n == k) return 0;
    
    int res = 0;
    q.push(n);
    st[n] = true;
    while (!q.empty()) {
    
    
        res++;
        int size = q.size();
        for (int i = 0; i < size; i++) {
    
    
            int t = q.front();
            q.pop();
            if (t == k) return res;
			
			// 不拓展负数
            if (!st[t - 1] && t - 1 >= 0) {
    
    
                if (t - 1 == k) return res;
                q.push(t - 1); 
                st[t - 1] = true;
            }
			
			// 只有t < k的时候才拓展t + 1和2 * t
            if (t < k) {
    
    
                if (!st[t + 1]) {
    
    
                    if (t + 1 == k) return res;
                    q.push(t + 1);
                    st[t + 1] = true;
                }
                if (!st[t * 2]) {
    
    
                    if (t * 2 == k) return res;
                    q.push(t * 2);
                    st[t * 2] = true;
                }
            }
        }
    }

	// 显然题目一定有解,所以这一行是走不到的
    return -1;
}

int main() {
    
    
    cin >> n >> k;
    cout << bfs(n, k) << endl;

    return 0;
}

La complejidad del tiempo y el espacio depende de datos específicos.

Supongo que te gusta

Origin blog.csdn.net/qq_46105170/article/details/114562678
Recomendado
Clasificación