Bei einer gegebenen Folge von ganzen Zahlen finden Sie die größte Summe einer Teilsequenz (ganze Zahlen an aufeinanderfolgenden Positionen) der Folge. Die Teilsequenz kann leer sein (in diesem Fall ist die Summe 0).
Die Eingabe wird von der Standardeingabe gelesen, eine Ganzzahl pro Zeile. Die größte Summe muss in die Standardausgabe geschrieben werden.
Ich habe einen kleinen Generator für Sie geschrieben:
#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;
}
Beispiele:
$ 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
ist meine Lösung./a.out
ist der Generator
Ihre Lösung muss für alle oben genannten Tests in angemessener Zeit ausgeführt werden (meine läuft im letzten Testfall in 1,2 Sekunden).
Der kürzeste Code gewinnt.
Bearbeiten : Bitte geben Sie ein Beispiel für einen der oben genannten Tests an.
code-golf
subsequence
Alexandru
quelle
quelle
#include <stdlib.h>
füratoi()
.while (i--);
sollte nicht mit einem Semikolon enden, oder?Antworten:
Ruby, 53 Zeichen
Der letzte Testfall dauert hier ungefähr 28 Sekunden.
quelle
Python,
918464 ZeichenDauert beim letzten Testfall ca.
141272 Sekunden. Bearbeiten: mit Algorithmus Paul R gefunden. Bearbeiten: Der Import wurde mit nixedinput()
.quelle
C, 100 Zeichen
Laufzeit = 1,14 s für den endgültigen Testfall (10000000) auf 2,67 GHz Core i7 mit ICC 11.1 (zuvor: 1,44 s mit gcc 4.2.1).
Hinweis: Der für die obige Lösung verwendete Algorithmus stammt von Programming Pearls von Jon Bentley. Anscheinend ist dieser Algorithmus als Kadanes Algorithmus bekannt .
quelle
Haskell (
8864)Implementierung des Kadane-Algorithmus.
quelle
Python - 114 Zeichen
Es ist sicherlich nicht so schnell wie erforderlich, aber es funktioniert in Ordnung.
quelle
Python mit dynamischer Programmierung - 92 Zeichen
quelle
J (
3433 Zeichen)Diese Lösung implementiert eine Variante des Kadane-Algorithmus und ist relativ schnell.
Hier ist eine Erklärung:
u/ y
- Das zwischen Elementen vonu
eingefügte Verby
. ZB+/ 1 2 3 4
ist wie1 + 2 + 3 + 4
. Beachten Sie, dass alle Verben in J rechtsassoziiert sind, dh-/ 1 2 3 4
wie sind1 - (2 - (3 - 4))
und die alternierende Summe von berechnen1 2 3 4
.x >. y
- das Maximum vonx
undy
.x ([ >. +) y
- Das Maximum vonx
undx + y
.[ >. +
ist ein Verb in stillschweigender Notation und wird gleich bewertet wiex >. x + y
.([ >. +)/ y
- das nicht leere Präfix vony
mit der größten Summe.u\. y
-u
angewendet auf alle Suffixe vony
. Beachten Sie, dass spezieller Code den allgemeinen Fallu/\. y
so behandelt, dass dieser in linearer statt quadratischer Zeit ausgeführt wird.([ >. +)/\. y
- Ein Vektor, der das größte nicht leere Subarray bezeichnet, das an jeder Position von beginnty
.0 , ([ >. +)/\. y
-0
dem vorherigen Ergebnis vorangestellt, ebenso0
wie die Länge eines leeren Subarrays vony
.>./ 0 , ([ >. +)/\. y
- Das größte Subarray vony
.0 ". ];._2 (1!:1) 3
- Standardeingabe in einem Vektor von Zahlen zusammengefasst.>./ 0 , ([ >. +)/\. 0 ". ];._2 (1!:1) 3
- Das größte Subarray in der Standardeingabe.quelle
Ruby, 68 Zeichen
Auch etwas langsam, aber führt die 1-10000000-Tests in etwas mehr als einer halben Minute durch, die meiste Zeit im letzten Test ...
Eingedrückte Version:
quelle
C ++, 192 Zeichen
Funktioniert relativ schnell auf meinem Laptop (4 Sekunden für den letzten Test).
quelle
cstdlib
nichtstdlib.h
awk Code (66) , sehr langsam, 8+ Sekunden für den letzten Testfall
quelle