Résumé
Compte tenu de l' entrée k
, trouver une partition d'entiers 1
à n
en k
sous - ensembles sans somme pour le plus grand n
possible dans les 10 minutes.
Contexte: numéros Schur
Un ensemble A
est sans somme si son auto-somme A + A = { x + y | x, y in A}
n'a aucun élément en commun avec lui.
Pour chaque entier positif, k
il y a un plus grand entier S(k)
tel que l'ensemble {1, 2, ..., S(k)}
peut être partitionné en k
sous-ensembles sans somme. Ce numéro est appelé le k ème numéro Schur (OEIS A045652 ).
Par exemple S(2) = 4
,. Nous pouvons partitionner en {1, 2, 3, 4}
tant que {1, 4}, {2, 3}
, et c'est la partition unique en deux sous-ensembles sans somme, mais nous ne pouvons pas maintenant ajouter un 5
à l' une ou l'autre partie.
Défi
Écrivez un programme déterministe qui fait ce qui suit:
- Prendre un entier positif
k
en entrée - Ecrire l'horodatage Unix actuel sur stdout
- Génère une séquence de partitions de
1
àn
enk
sous-ensembles sans somme à augmentern
, en suivant chaque séquence avec l'horodatage Unix actuel.
Le gagnant sera le programme qui imprime une partition pour la plus grande n
dans les 10 minutes sur mon ordinateur lorsqu'il est saisi 5
. Les liens seront rompus par le temps le plus rapide pour trouver une partition pour le plus grand n
, en moyenne sur trois exécutions: c'est pourquoi la sortie devrait inclure des horodatages.
Détails importants:
- J'ai Ubuntu Precise, donc si votre langue n'est pas prise en charge, je ne pourrai pas la noter.
- J'ai un processeur Intel Core2 Quad, donc si vous voulez utiliser le multithreading, il est inutile d'utiliser plus de 4 threads.
- Si vous souhaitez que j'utilise des indicateurs ou une implémentation de compilateur particuliers, documentez-le clairement dans votre réponse.
- Vous ne devez pas casse spéciale votre code pour gérer l'entrée
5
. - Vous n'êtes pas obligé de générer chaque amélioration trouvée. Par exemple, pour l'entrée,
2
vous ne pouvez générer que la partitionn = 4
. Cependant, si vous ne produisez rien dans les 10 premières minutes, je noterai celan = 0
.
n=59
et le tri par le plus grand nombre de nombres autorisés moins que le nombrenextN
donnén=64
. Le tri selon la longueur de la liste des numéros non autorisés (qui peut avoir des répétitions) conduit très rapidement à unn=30
motif élégant .