Étant donné une séquence d'entiers, trouvez la plus grande somme d'une sous-séquence (entiers sur des positions consécutives) de la séquence. La sous-séquence peut être vide (auquel cas la somme est 0).
L'entrée est lue à partir de l'entrée standard, un entier par ligne. La plus grande somme doit être écrite sur la sortie standard.
J'ai écrit un petit générateur pour vous:
#include <stdio.h>
#include <assert.h>
/* From http://en.wikipedia.org/wiki/Random_number_generation */
unsigned m_w;
unsigned m_z;
unsigned get_random()
{
m_z = 36969 * (m_z & 65535) + (m_z >> 16);
m_w = 18000 * (m_w & 65535) + (m_w >> 16);
return (m_z << 16) + m_w; /* 32-bit result */
}
int main(int argc, char **argv)
{
int i;
assert(argc == 3);
m_w = atoi(argv[1]);
m_z = atoi(argv[2]);
i = 10;
while (i--);
get_random();
i = atoi(argv[2]);
while (i--)
printf("%d\n", (int) get_random() << 8 >> 22);
return 0;
}
Exemples:
$ printf "1\n2\n-1\n4\n" | ./sum
6
$ printf "0\n-2\n-3\n" | ./sum
0
$ ./a.out 1 1 | ./sum
387
$ ./a.out 1 10 | ./sum
571
$ ./a.out 1 100 | ./sum
5867
$ ./a.out 1 1000 | ./sum
7531
$ ./a.out 1 10000 | ./sum
27268
$ ./a.out 1 100000 | ./sum
101332
$ ./a.out 1 1000000 | ./sum
187480
$ ./a.out 1 10000000 | ./sum
666307
./sum
est ma solution./a.out
est le générateur
Votre solution doit s'exécuter dans un délai raisonnable pour tous les tests ci-dessus (la mienne s'exécute en 1.2s sur le dernier scénario de test).
Le code le plus court gagne.
Modifier : veuillez fournir un exemple exécuté sur l'un des tests ci-dessus.
code-golf
subsequence
Alexandru
la source
la source
#include <stdlib.h>
pouratoi()
.while (i--);
ne devrait pas se terminer par un point-virgule, n'est-ce pas?Réponses:
Ruby, 53 caractères
Cela prend environ 28 secondes pour le dernier test ici.
la source
Python,
918464 caractèresPrend environ
141272 secondes sur le dernier cas de test. Edit: en utilisant l'algorithme Paul R trouvé. Edit: annulé l'importation, en utilisantinput()
.la source
C, 100 caractères
Temps d' exécution = 1,14 s pour le cas de test final (10000000) sur le Core i7 à 2,67 GHz avec ICC 11.1 (auparavant: 1,44 s avec gcc 4.2.1).
Remarque: l'algorithme utilisé pour la solution ci-dessus provient de Programming Pearls de Jon Bentley. Apparemment, cet algorithme est connu sous le nom d'algorithme de Kadane .
la source
Haskell (
8864)Implémentation de l'algorithme de Kadane.
la source
Python - 114 caractères
Ce n'est sûrement pas aussi rapide que nécessaire, mais cela fonctionne bien.
la source
Python, utilisant la programmation dynamique - 92 caractères
la source
J (
3433 caractères)Cette solution implémente une variante de l'algorithme de Kadane et est relativement rapide.
Voici une explication:
u/ y
- Le verbeu
inséré entre les éléments dey
. Par exemple,+/ 1 2 3 4
c'est comme1 + 2 + 3 + 4
. Notez que tous les verbes de J sont associés à droite, c'est-à-dire-/ 1 2 3 4
est similaire1 - (2 - (3 - 4))
et calcule la somme alternée de1 2 3 4
.x >. y
- le maximum dex
ety
.x ([ >. +) y
- Le maximum dex
etx + y
.[ >. +
est un verbe en notation tacite et a la même valeur quex >. x + y
.([ >. +)/ y
- le préfixe non vide dey
avec la plus grande somme.u\. y
-u
appliqué à tous les suffixes dey
. Notez que le code spécial gère le cas commun deu/\. y
telle sorte qu'il s'exécute en temps linéaire plutôt qu'en temps quadratique.([ >. +)/\. y
- Un vecteur indiquant le plus grand sous-tableau non vide qui commence à chaque position dey
.0 , ([ >. +)/\. y
-0
précédé du résultat précédent, tout comme0
la longueur d'un sous-tableau vide dey
.>./ 0 , ([ >. +)/\. y
- Le plus grand sous-tableau dey
.0 ". ];._2 (1!:1) 3
- Entrée standard organisée en un vecteur de nombres.>./ 0 , ([ >. +)/\. 0 ". ];._2 (1!:1) 3
- Le plus grand sous-tableau en entrée standard.la source
Rubis, 68 caractères
Également un peu lent, mais termine les tests 1-10000000 en un peu plus d'une demi-minute, la plupart du temps passé dans le dernier test ...
Version en retrait:
la source
C ++, 192 caractères
Fonctionne assez rapidement sur mon ordinateur portable (4 secondes pour le dernier test).
la source
cstdlib
passtdlib.h
awk Code (66) , très lent, 8+ secondes pour le dernier cas de test
la source