[Teoría de gráficos] C_Counting Competition_On the Elevator (resumen bidimensional unidimensional)

1. Título Descripción

Después de que se encendió la energía del elevador, los miembros de la expedición entraron al túnel vertical donde estaba funcionando el elevador. Lo que estaba a la vista era una pista que conducía a la parte superior de la torre, un elevador estacionado en la parte inferior de la pista y una barra. La enorme manija que controla el elevador.

La torre Nescafé tiene N pisos, y el ascensor tiene una parada en cada piso.

El mango tiene M ranuras de control, un número Ci está marcado al lado de la i ésima ranura de control, satisfaciendo C1 <C2 <C3 <... <CM.

Si Ci> 0, significa que cuando la manija se mueve a esta ranura, el elevador se elevará al piso Ci; si Ci <0, significa que cuando la manija se mueve a esta ranura, el elevador caerá a −Ci piso; Originalmente estaba en esta ranura.

Tenga en cuenta que el elevador solo puede moverse entre los pisos 1 y N, por lo que no está permitido tirar de la ranura de control para mover el elevador por debajo del primer piso y por encima del piso N.

Cada elevador tarda 2 segundos en moverse un piso, y el asa tarda 1 segundo en moverse de una ranura de control a la ranura adyacente.

Los miembros del equipo de expedición ahora están en el nivel 1 y quieren alcanzar el nivel N lo antes posible. ¿Quieren saber cuánto tiempo llevará al menos el nivel 1 hasta el nivel N?

Formato de entrada

Dos enteros positivos N, M en la primera fila.
M enteros C1, C2 ... CM en la segunda línea.

Formato de salida

La salida de un número entero indica la respuesta, es decir, cuánto tiempo tarda al menos.
Si es imposible alcanzar la salida -1.

Rango de datos

1≤N≤1000,
2≤M≤20,
−N <C1 <C2 <… <CM <N

输入样例:
6 3
-1 0 2
输出样例:
19

Explicación de la muestra

La manija se mueve desde la segunda ranura a la tercera ranura (0 a 2), que toma 1 segundo, y el elevador sube al tercer piso en 4 segundos.
La manija no se mueve en la tercera ranura, y el elevador vuelve a subir al quinto piso en 4 segundos.
Mueva la manija a la primera ranura (2 a -1), toma 2 segundos, el elevador desciende al 4to piso, toma 2 segundos.
Mueva la manija a la tercera ranura (-1 tira hacia abajo 2), toma 2 segundos, el elevador sube al sexto piso, toma 4 segundos.
El tiempo total es (1 + 4) +4+ (2 + 2) + (2 + 4) = 19 segundos.

En segundo lugar, la solución

Método 1: examinar el mapa

A primera vista, parece dp. Sí, se puede hacer dp. Una idea relativamente nueva es convertir el problema en el problema más corto de la teoría de grafos:

  • El nodo 1 es el punto fuente yn es el punto final.
  • C [ yo ] C [i] originalmente significaba que el elevador se movería C yo C_i Capa, y en este algoritmo lo expreso como el peso del borde de un borde dirigido.
  • Cada ranura de control C [ yo ] C [i] representa diferentes bordes dirigidos, y cada elevador de piso es un nodo en la figura.
  • Como el peso del borde puede ser negativo, puede haber un movimiento cíclico infinito.
  • Hasta ahora, este problema puede simplificarse para encontrar el tiempo mínimo desde el punto 1 hasta el punto n.
import java.util.*;
import java.math.*;
import java.io.*;
public class Main{
	static int n, m; 
	static int[] C;
	static int[][] dist;
	static int INF = 0x3f3f3f3f;
	
	static void spfa(int S) {
	    for (int i = 1; i <= n; i++)
	    for (int j = 1; j <= m; j++) {
	        dist[i][j] = INF;
	    }
		Queue<Node> q = new ArrayDeque<>();
		boolean[][] inq = new boolean[n+1][m+1];
		q.add(new Node(1, S));
		inq[1][S] = true;
		dist[1][S] = 0;
		
		while (!q.isEmpty()) {
			Node t = q.poll();
			int f = t.f, s = t.s;
			inq[f][s] = false;
			for (int i = 1; i <= m; i++) {
				int tf = f + C[i];
				if (tf < 1 || tf > n)
					continue;
				if (dist[tf][i] > dist[f][s] + Math.abs(f-tf)*2 + Math.abs(s-i)) {
					dist[tf][i] = dist[f][s] + Math.abs(f-tf)*2 + Math.abs(s-i);
					if (!inq[tf][i]) {
						q.add(new Node(tf, i));
						inq[tf][i] = true;
					}
				}
			}
		}
	}
    public static void main(String[] args) throws IOException {  
        Scanner sc = new Scanner(new BufferedInputStream(System.in));
        BufferedWriter w = new BufferedWriter(new OutputStreamWriter(System.out));
        n = sc.nextInt();
		m = sc.nextInt();
		C = new int[m+1];
		
		int start = 0;
		for (int i = 1; i <= m; i++) {
			C[i] = sc.nextInt();
			if (C[i] == 0)
				start = i;
		}
		int min = INF;
		dist = new int[n+1][m+1];
		spfa(start);
		for (int i = 1; i <= m; i++) {
			min = Math.min(min, dist[n][i]);
		}
		System.out.println(min == INF ? -1 : min);
    }
	static class Node {
		int f, s;
		Node(int f, int s) {
			this.f = f;
			this.s = s;
		}
	}
}

Análisis de complejidad.

  • Complejidad del tiempo: El ( k metro ) O (km)
  • Complejidad espacial: El ( . . . ) El (...) ,

Método 2: dp

Encargado de negocios ...


Análisis de complejidad.

  • Complejidad del tiempo: El ( ) O ()
  • Complejidad espacial: El ( ) O ()
Publicado 714 artículos originales · elogiado 199 · 50,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/qq_43539599/article/details/105589208
Recomendado
Clasificación