Aperçu
Étant donné une liste de feux d'artifice a-z
et d'heures 3-78
, organisez-les avec des fusibles pour les allumer tous au bon moment.
Une ligne d'entrée est donnée sous forme de lettres et de chiffres séparés par des espaces:
a 3 b 6 c 6 d 8 e 9 f 9
Cet exemple montre que le feu d'artifice a
doit s'allumer à l'heure 3
, b
et à la c
fois à 6
, d
à 8
, avec e
et à la f
fois à 9
. Chaque ligne correspond à une carte.
La sortie est une carte de fusible / feu d'artifice pour chaque ligne, utilisant les symboles |-
pour montrer les fusibles et les lettres pour montrer les feux d'artifice.
Un -
fusible se connecte aux fusibles et aux feux d'artifice directement à gauche / droite de celui-ci, tandis qu'un |
fusible se connecte à ceux du dessus / du dessous. Par exemple, les fusibles ne||
sont pas connectés et le -|
sont .
Par exemple, deux réponses possibles à ce qui précède sont:
---a ---------f
| ||| ||
|-c ||| de
--|--d a||
| b | |c
f e b
Toutes les cartes de fusibles doivent commencer par une seule -
dans le coin supérieur gauche. C'est le point où vous allumez le fusible. Chaque personnage de fusible prend une seconde à brûler. Comme vous pouvez le voir, le a
est atteint en trois secondes dans les deux diagrammes, b
en six, etc.
Maintenant, les deux cartes données ci-dessus sont valides pour l'entrée donnée, mais l'une est clairement plus efficace. Celui de gauche n'utilise que 13 unités de fusible, tandis que celui de droite en prend 20.
Les fusibles ne brûlent pas à travers les feux d'artifice! Donc, pour l'entrée a 3 b 5
, ce n'est pas valide:
---a--b
Défi
Votre objectif est de minimiser la quantité de fusible utilisée sur tous les cas de test. La notation est très simple, le nombre total d'unités de fusible utilisées.
Si vous ne pouvez pas produire une carte pour un cas de test, que ce soit un cas impossible ou non, le score pour ce cas est la somme de tous les temps (41 pour l'exemple ci-dessus).
En cas d'égalité, le score est modifié pour que les cartes les plus compactes l' emportent. Le score de départage est la zone du cadre de délimitation de chaque carte. Autrement dit, la longueur de la ligne la plus longue multipliée par le nombre de lignes. Pour les cartes "impossibles", c'est le carré du plus grand nombre (81 pour l'exemple ci-dessus).
Dans le cas où les soumissions lieraient ces deux méthodes de notation, l'égalité irait à l'entrée / modification précédente.
Votre programme doit être déterministe, à des fins de vérification.
Cas de test
Il y a 250 cas de test, situés ici . Chacun a entre 4 et 26 feux d'artifice. Le temps de fusion minimum pour un feu d'artifice est de 3. Les feux d'artifice dans chaque cas sont "triés" par heure et lettre, ce b
qui signifie qu'ils ne s'allumeront jamais auparavant a
.
Lors de la publication, veuillez inclure votre programme complet, votre score total et la carte résultante pour (au moins) le premier cas de test donné dans le fichier:
a 6 b 8 c 11 d 11 e 11 f 11 g 12 h 15 i 18 j 18 k 21 l 23 m 26 n 28 o 28 p 30 q 32 r 33 s 33 t 34
la source
rand.nextInt(5)%4
donc de 40% de chance0
et 20% pour chacun1,2,3
.-+-
au lieu de---
ne connecterait pas automatiquement les feux d'artifice au-dessus / en dessous, il doit toujours y avoir un|
dessus / dessous pour le connecter à un feu d'artifice.-+-
à la place de-|-
va bien comme ça.Réponses:
C ++
Longueur totale: 9059, superficie totale: 27469, échecs: 13.
Remarque: Le score inclut les pénalités d'échec.
Exemple de sortie:
Sortie complète: http://pastebin.com/raw.php?i=spBUidBV
N'aimez-vous pas simplement les solutions de force brute? C'est un peu plus qu'un simple algorithme de retour en arrière: notre travailleur infatigable se déplace sur la carte, plaçant des fusibles et des feux d'artifice si nécessaire, tout en testant tous les mouvements possibles à tout moment. Eh bien, presque --- nous restreignons l'ensemble des mouvements et abandonnons tôt les états non optimaux afin que cela ne prenne pas une durée insupportable (et, en particulier, pour qu'il se termine.) Une attention particulière est prise pour ne pas créer de cycles ou involontaires. chemins et de ne pas revenir en arrière de la même façon que nous sommes venus, il est donc garanti que nous ne visitons pas le même état deux fois. Même ainsi, trouver une solution optimale peut prendre un certain temps, donc nous finissons par abandonner l'optimisation d'une solution si elle prend trop de temps.
Cet algorithme a encore une certaine marge. D'une part, de meilleures solutions peuvent être trouvées en augmentant les
FRUSTRATION
paramètres. Il n'y a pas de GAB de compétition, mais ces chiffres peuvent être augmentés si et quand ...Compiler avec:
g++ fireworks.cpp -ofireworks -std=c++11 -pthread -O3
.Exécuter avec:
./fireworks
.Lit l'entrée de STDIN et écrit la sortie dans STDOUT (peut-être hors service.)
Python
Longueur totale: 17387, superficie totale: 62285, échecs: 44.
Exemple de sortie:
Sortie complète: http://pastebin.com/raw.php?i=mgiqXCRK
Pour référence, voici une approche beaucoup plus simple. Il essaie de connecter des feux d'artifice à une seule ligne de fusible principale, créant une forme "d'escalier". Si un feu d'artifice ne peut pas se connecter directement à la ligne principale (ce qui se produit lorsque deux feux d'artifice ou plus s'allument en même temps), il retrace la ligne principale à la recherche d'un point où il peut se ramifier perpendiculairement vers le bas ou vers la droite (et échoue si un tel point n'existe pas.)
Sans surprise, il fait pire que le solveur de force brute, mais pas par une énorme marge. Honnêtement, je m'attendais à ce que la différence soit un peu plus grande.
Exécuter avec:
python fireworks.py
.la source