Construction muraille optimale
创建于:2024年12月29日
创建于:2024年12月29日
Construire une structure
Je suis en train de planifier un rempart en partant de la tour 0, en allant aux tours 2 et 3, puis en retournant à la tour 1, et enfin en revenant à la tour 0, avec un coût de 26.
Établir les paramètres
Je suis en train de travailler sur les contraintes pour le parcours du rempart, y compris le nombre de tours, les coûts d'entrée et de sortie, et les limites de performance. Hm, ces paramètres semblent importants pour une solution efficace.
Analyser les paramètres
Je suis en train de comprendre les contraintes du problème, notamment le nombre de tours, les coûts d'entrée et de sortie, et les limites de performance, pour proposer une solution efficace.
Évidemment
Je vois que la solution optimale consiste à construire un mur de la tour 0 vers les tours 2 et 3, puis en retournant à la tour 1, avec un coût total de 26.
Fixer le coût minimal
Je suis en train de déterminer le coût total minimal pour construire un cycle optimal entre les tours, en choisissant les portes de sortie et d'entrée avec les différences de profondeur minimisées.
Construire un cycle optimal
Je suis en train de développer un algorithme pour créer un cycle optimal en annonçant les tours, en utilisant les différences de profondeur des portes de sortie et d'entrée pour minimiser le coût total.
Calculer le coût optimal
Je suis en train de vérifier le coût moyen total des chemins depuis la tour 0 vers les tours 1 et 2. Ceci pourrait aider à identifier le chemin avec le coût minimal.
Élaborer une solution
Je suis en train de formuler un algorithme pour trouver le cycle à coût minimal, en me basant sur l'ordre des tours et des profondeurs d'entrée et de sortie, tout en respectant les contraintes fixées.
Réduire les coûts
Je suis en train de découvrir que le problème consiste à trouver une permutation des tours où la somme des différences de carrés entre les profondeurs de sortie et d'entrée est minimalisée, en formant un cycle.
Identifiant les besoins
Je suis en train de trouver un moyen efficace de déterminer le cycle avec le coût total minimal parmi les tours, en choisissant les jonctions correctes et en minimisant les différences de profondeur au carré.
Réfléchir au problème
Je suis en train de voir une solution, mais ça me fait penser que ce pourrait être similaire à un cycle de Hamiltonien dans un graphe avec des poids d'arêtes en carré, ce qui est abordable.
Réduire les différences
Pour trouver la solution, je suis en train d'organiser les tours de manière à minimiser les différences de carré entre les profondeurs de sortie et d'entrée tout en créant un cycle fermé.
Réfléchis aux paires
Je suis en train de voir qu'il me faut un algorithme pour pairs les sorties et entrées dans l'ordre, tout en respectant le cycle et en minimisant les différences de coûts.
Réfléchir à l'organisation
Pour réduire le coût général, j'explore la notion d'organiser les tours où chaque sortie est jumelée à l'entrée du tour suivant, en minimisant la somme des différences carrées.
Organiser les connexions
Je suis en train de voir que l'organisation des thorés pour minimiser la connexion des sorties aux entrées suivantes pourrait réduire la somme totale, notamment avec des listes triées et des coûts de différence carrée.
Réorganiser les plages
Je réorganise les plages de sortie et d'entrée, en vérifiant les chevauchements, notamment les 56-98 et 203-207, et en recherchant le cycle optimal pour minimise un coût total de 26.
Réorganiser les éléments
Je suis en train de réorganiser les tours dans un ordre spécifique pour minimiser les différences de coût total, en prenant en compte les coûts de sortie et d'entrée jusqu'à 1500.
Maximiser les avantages
Je suis en train de voir un algorithme pour choisir les sorties et entrées en décréscendant, permettant de maximiser le coût total tout en réduisant l'âme de carré des différences de coût.
Maximiser les coûts
Je suis en train de voir que pour maximiser le coût total, je dois maximiser la somme de la corrélation croisée des sorties et des entrées, en utilisant l'algorithme FFT pour calculer cette somme.
Réduire les coûts
Je suis en train de trouver le coût total minimal en maximisant la corrélation croisée des listes de sorties et d'entrées triées, en utilisant la FFT pour le calcul efficace.
Calculer tout cela
Je suis en train de déterminer le coût total minimal en maximisant la corrélation croisée des listes de sorties et d'entrées triées, en utilisant la FFT pour un calcul rapide.
Réflexion pendant 29 secondes
Pour résoudre ce problème efficacement, surtout avec les contraintes de performance et de mémoire, nous pouvons utiliser une approche basée sur la corrélation croisée (cross-correlation) optimisée par la Transformée de Fourier Rapide (FFT). Voici une explication détaillée de la méthode ainsi qu'un exemple d'implémentation en Python.
Nous avons N tours, chacune avec une porte de sortie (sortie
) et une porte d'entrée (entree
) à des profondeurs données. Les listes sortie
et entree
sont strictement croissantes. L'objectif est de construire un cycle passant par toutes les tours de manière à minimiser le coût total, où le coût entre deux tours consécutives est défini par le carré de la différence entre la profondeur de la porte de sortie de la première tour et la profondeur de la porte d'entrée de la deuxième tour.
Formellement, si nous avons une permutation des tours, le coût total est :
Notre objectif est de trouver la permutation qui minimise ce coût.
Expansions et Simplifications :
Développons le coût total :
Étant donné que et sont constants (indépendants de la permutation ), minimiser le coût revient à maximiser le terme .
Corrélation Croisée (Cross-Correlation) :
La somme est une forme de corrélation croisée entre les séquences sortie
et entree
. La maximisation de cette somme pour différentes permutations correspond à la recherche de la meilleure décalage (shift) entre les deux séquences.
Utilisation de la FFT :
La corrélation croisée peut être efficacement calculée en utilisant la FFT. En particulier, la corrélation circulaire peut être obtenue via la multiplication des FFT des séquences.
Étapes de l'Algorithme :
sortie
et entree
.sortie
et entree
en utilisant la FFT.Voici une implémentation détaillée de l'algorithme décrit ci-dessus. Notez que pour de grandes valeurs de , Python peut être moins performant que des langages comme C++. Cependant, avec les optimisations appropriées et l'utilisation de bibliothèques efficaces comme NumPy, cette approche reste viable.
import numpy as np import sys def read_input(): import sys import sys input = sys.stdin.read data = input().split() N = int(data[0]) sortie = list(map(int, data[1:N+1])) entree = list(map(int, data[N+1:2*N+1])) return N, sortie, entree def minimal_total_cost(N, sortie, entree): # Convert lists to numpy arrays of float64 for FFT s = np.array(sortie, dtype=np.float64) e = np.array(entree, dtype=np.float64) # Compute sum of squares sum_s_squared = np.sum(s ** 2) sum_e_squared = np.sum(e ** 2) # Reverse e for cross-correlation e_reversed = e[::-1] # Next power of two for zero-padding (for FFT efficiency) n = 1 << (2*N-1).bit_length() # Perform FFT S = np.fft.fft(s, n=n) E = np.fft.fft(e_reversed, n=n) # Element-wise multiplication cross_corr = np.fft.ifft(S * E).real # Due to numerical errors, small imaginary parts may exist # We take the real part and round to avoid floating point issues cross_corr = np.round(cross_corr, decimals=5) # The cross-correlation for circular shifts is in positions N-1 to 2N-2 # because of the reversal and zero-padding # Extract relevant part cross_corr = cross_corr[N-1:2*N-1] # Find the maximum cross-correlation sum max_corr = np.max(cross_corr) # Compute minimal total cost minimal_cost = sum_s_squared + sum_e_squared - 2 * max_corr # Since the problem statement expects an integer, we convert accordingly minimal_cost = int(minimal_cost) return minimal_cost def main(): N, sortie, entree = read_input() result = minimal_total_cost(N, sortie, entree) print(result) if __name__ == "__main__": main()
Lecture des Entrées :
La fonction read_input
lit les données d'entrée depuis le flux standard. Elle suppose que les données sont fournies sous forme de nombres séparés par des espaces, où les premiers nombres après le premier représentent les profondeurs de sortie, et les suivants nombres représentent les profondeurs d'entrée.
Préparation des Séquences pour la FFT :
sortie
et entree
sont converties en tableaux NumPy de type float64
pour assurer la précision nécessaire lors de la transformation.entree
est inversée (e_reversed
) car la corrélation croisée nécessite une inversion pour le calcul via la FFT.Calcul de la Corrélation Croisée :
sortie
et entree_reversed
sont calculées.ifft
) permet d'obtenir la corrélation croisée en espace réel.Extraction et Maximisation de la Corrélation :
Calcul du Coût Total Minimal :
sortie
et entree
.Optimisations Supplémentaires :
Cette approche utilisant la corrélation croisée optimisée par la FFT permet de résoudre efficacement le problème de minimisation du coût total de construction de la muraille en respectant les contraintes de performance et de mémoire. L'implémentation fournie peut être adaptée et optimisée davantage selon les besoins spécifiques et l'environnement d'exécution.