[Théorie des graphes] C_Counting Competition_On the Elevator (bidimensionnel abstrait unidimensionnel)

1. Titre Description

Après la mise sous tension de l'ascenseur, les membres de l'expédition sont entrés dans le tunnel vertical où l'ascenseur était en marche. Ce qui était en vue était une piste menant directement au sommet de la tour, un ascenseur stationné au bas de la piste et un poteau dans l'ascenseur. L'énorme poignée qui contrôle l'ascenseur.

La tour Nescafé a N étages, et l'ascenseur a un arrêt à chaque étage.

La poignée a M emplacements de contrôle, un numéro Ci est marqué à côté du i ème emplacement de contrôle, satisfaisant C1 <C2 <C3 <... <CM.

Si Ci> 0, cela signifie que lorsque la poignée est déplacée vers cet emplacement, l'ascenseur monte jusqu'au plancher Ci; si Ci <0, cela signifie que lorsque la poignée est déplacée vers cet emplacement, l'ascenseur tombe au niveau -Ci étage; et il doit y avoir Ci = 0, la poignée C'était à l'origine dans cette fente.

Notez que l'ascenseur ne peut se déplacer qu'entre le 1er et le Nième étage, il n'est donc pas permis de tirer la fente de commande pour déplacer l'ascenseur en dessous du premier étage et au-dessus du Nième étage.

Il faut 2 secondes à chaque ascenseur pour déplacer un étage et 1 seconde pour que la poignée se déplace d'un emplacement de contrôle vers l'emplacement adjacent.

Les membres de l'équipe d'expédition sont maintenant au niveau 1, et veulent atteindre le niveau N dès que possible. Ils veulent savoir combien de temps il faudra au moins du niveau 1 au niveau N?

Format d'entrée

Deux entiers positifs N, M dans la première ligne.
M entiers C1, C2 ... CM dans la deuxième ligne.

Format de sortie

La sortie d'un entier indique la réponse, c'est-à-dire combien de temps cela prend au moins.
S'il est impossible d'atteindre la sortie -1.

Plage de données

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

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

Exemple d'explication

La poignée se déplace de la deuxième fente à la troisième fente (0 à 2), ce qui prend 1 seconde, et l'ascenseur monte au troisième étage en 4 secondes.
La poignée ne bouge pas dans la troisième fente et l'ascenseur remonte au cinquième étage en 4 secondes.
Déplacez la poignée vers le premier emplacement (2 à -1), cela prend 2 secondes, l'ascenseur descend au 4ème étage, cela prend 2 secondes.
Déplacez la poignée vers la troisième fente (-1 tire vers le bas 2), cela prend 2 secondes, l'ascenseur monte au 6ème étage, cela prend 4 secondes.
Le temps total est (1 + 4) +4+ (2 + 2) + (2 + 4) = 19 secondes.

Deuxièmement, la solution

Méthode 1: examiner la carte

À première vue, cela ressemble à dp. Oui, dp peut être fait. Une idée relativement nouvelle est de transformer le problème en un problème de théorie des graphes le plus court:

  • Le nœud 1 est le point source et n le point final.
  • C [ je ] C [i] signifiait à l'origine que l'ascenseur se déplacerait C je C_i Couche, et dans cet algorithme, je l'exprime comme le poids du bord d'un bord dirigé.
  • Chaque emplacement de contrôle C [ je ] C [i] représente différents bords dirigés, et chaque ascenseur au sol est un nœud sur la figure.
  • Étant donné que le poids du bord peut être négatif, il peut y avoir un mouvement cyclique infini.
  • Jusqu'à présent, ce problème peut être simplifié pour trouver le temps minimum du point 1 au point 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;
		}
	}
}

Analyse de complexité

  • Complexité temporelle: Le ( k m ) O (km)
  • Complexité de l'espace: Le ( . . . ) Le (...) ,

Méthode 2: dp

Chargé d'affaires ...


Analyse de complexité

  • Complexité temporelle: Le ( ) O ()
  • Complexité de l'espace: Le ( ) O ()
Publié 714 articles originaux · loué 199 · 50 000+ vues

Je suppose que tu aimes

Origine blog.csdn.net/qq_43539599/article/details/105589208
conseillé
Classement