Construction muraille optimale

Создано: 29 декабря 2024 г.

Отвечено с использованием OpenAI 01 от OpenAI01

Вопрос


Par exemple, pour considérer un rempart de la tour 1 à la tour 2, on emprunte une porte de sortie de profondeur 2 pour aller à la porte d'entrée de profondeur 5, pour un coût de (2 − 5)² = 9.

La construction de muraille optimale est de construire un rempart de la tour 0 vers la tour 2, puis vers la tour 3, puis vers la tour 1, et revenir à la tour 0, pour un coût total de 16 + 9 + 0 + 1 = **26**.

Il n'est pas possible de prendre un cycle moins coûteux, et il n'existe pas non plus d'autre cycle du même coût.

**Contraintes**

* 2 ≤ N ≤ 10
* 0 ≤ sortieᵢ ≤ 1 000 000 000
* 0 ≤ entreeᵢ ≤ 1 000 000 000
* `sortie` est une liste strictement croissante
* `entree` est aussi une liste strictement croissante

**Contraintes de performance**

* 2 ≤ N ≤ 200 000

**Contraintes d'exécution**

* Utilisation mémoire maximum: 100000 kilo-octets
* Temps d'exécution maximum: 1000 millisecondes

Мысль

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.

Compréhension du Problème

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 pp des tours, le coût total est :

Couˆt total=i=0N1(sortieientreep(i))2\text{Coût total} = \sum_{i=0}^{N-1} (\text{sortie}_i - \text{entree}_{p(i)})^2

Notre objectif est de trouver la permutation pp qui minimise ce coût.

Approche Algorithme

  1. Expansions et Simplifications :

    Développons le coût total :

    i=0N1(sortieientreep(i))2=sortiei2+entreep(i)22sortieientreep(i)\sum_{i=0}^{N-1} (\text{sortie}_i - \text{entree}_{p(i)})^2 = \sum \text{sortie}_i^2 + \sum \text{entree}_{p(i)}^2 - 2 \sum \text{sortie}_i \cdot \text{entree}_{p(i)}

    Étant donné que sortiei2\sum \text{sortie}_i^2 et entreei2\sum \text{entree}_i^2 sont constants (indépendants de la permutation pp), minimiser le coût revient à maximiser le terme sortieientreep(i)\sum \text{sortie}_i \cdot \text{entree}_{p(i)}.

  2. Corrélation Croisée (Cross-Correlation) :

    La somme sortieientreep(i)\sum \text{sortie}_i \cdot \text{entree}_{p(i)} est une forme de corrélation croisée entre les séquences sortie et entree. La maximisation de cette somme pour différentes permutations pp correspond à la recherche de la meilleure décalage (shift) entre les deux séquences.

  3. 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.

  4. Étapes de l'Algorithme :

    • Calculer les sommes des carrés des listes sortie et entree.
    • Calculer la corrélation croisée entre sortie et entree en utilisant la FFT.
    • Identifier le décalage kk qui maximise la corrélation.
    • Calculer le coût total minimal en utilisant les sommes préalablement calculées et le maximum de la corrélation croisée.

Implémentation en Python

Voici une implémentation détaillée de l'algorithme décrit ci-dessus. Notez que pour de grandes valeurs de NN, 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()

Explications et Optimisations

  1. 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 NN nombres après le premier représentent les profondeurs de sortie, et les suivants NN nombres représentent les profondeurs d'entrée.

  2. Préparation des Séquences pour la FFT :

    • Les listes sortie et entree sont converties en tableaux NumPy de type float64 pour assurer la précision nécessaire lors de la transformation.
    • La liste entree est inversée (e_reversed) car la corrélation croisée nécessite une inversion pour le calcul via la FFT.
  3. Calcul de la Corrélation Croisée :

    • La longueur nn pour la FFT est choisie comme la puissance de deux suivante après 2N12N-1 pour optimiser les performances de la FFT.
    • Les FFT des séquences sortie et entree_reversed sont calculées.
    • La multiplication élément par élément des deux FFT donne la FFT de la corrélation croisée.
    • L'inversion de la FFT (ifft) permet d'obtenir la corrélation croisée en espace réel.
  4. Extraction et Maximisation de la Corrélation :

    • En raison du remplissage de zéros et de l'inversion, les résultats pertinents de la corrélation croisée sont extraits de l'indice N1N-1 à 2N22N-2.
    • Le maximum de cette corrélation correspond au décalage kk qui maximise sortieientree(i+k)modN\sum \text{sortie}_i \cdot \text{entree}_{(i+k) \mod N}.
  5. Calcul du Coût Total Minimal :

    • Utilisant la relation développée précédemment, le coût total minimal est calculé en soustrayant deux fois le maximum de la corrélation croisée des sommes des carrés des séquences sortie et entree.
  6. Optimisations Supplémentaires :

    • Précision Numérique : Les résultats de la FFT peuvent contenir des erreurs de précision. Ainsi, après l'inversion de la FFT, nous arrondissons les valeurs à cinq décimales pour éviter des erreurs dues aux nombres flottants.
    • Conversion en Entier : Comme les profondeurs sont des entiers et que les coûts sont définis par des carrés de différences d'entiers, le coût total minimal est également un entier. Nous convertissons donc le résultat final en entier.

Complexité Temporelle et Spatiale

  • Temps : L'algorithme principal est dominé par la FFT, qui a une complexité de O(NlogN)O(N \log N). Ceci est acceptable pour N200000N \leq 200\,000.
  • Espace : L'utilisation de tableaux de taille 2k2^kkk est tel que 2k2N2^k \geq 2N, ce qui reste dans les limites de mémoire spécifiées (100,000 kilo-octets).

Conclusion

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.

Поделиться этим Q&A