Betrachten wir drei Sätze A
, B
und C
jeweils n
ganze Zahlen. Daraus können wir das Set machen
S_n = {a * b + c | a in A, b in B, c in C}.
Vorausgesetzt n
, es gibt eine oder mehrere minimale Größen, S_n
die davon abhängen, welche Sätze A,B and C
ausgewählt wurden.
Die Mengen können beliebige n
Ganzzahlen enthalten (positiv, null oder negativ). Es ist nicht erforderlich, dass sie aufeinanderfolgende ganze Zahlen sind oder dass die Mengen beispielsweise gleich sind. A = {-1, 0, 5, 10, 27}, B = {2, 5, 6, 10, 14} and C = {-23, 2, 100, 1000,10000}
ist zum Beispiel akzeptabel (obwohl keine gute Idee).
Aufgabe
Die Aufgabe besteht darin, Code zu schreiben, um die kleinste Menge zu finden, die S_n
es für jede n
von 1
bis geben kann 20
.
Für jeden n
von 1
zu 20
Ihrem Code soll eine Ausgabe des gewählt A
, B
und C
zusammen mit der resultierenden GrößeS_n
Ergebnis
Ihre Punktzahl ist die Summe der von S_n
Ihnen erstellten Größen . Das heißt, es wird eine Summe von zwanzig Zahlen sein.
Je niedriger die Punktzahl, desto besser.
Beispiele
Wenn A = B = C = {1, 2, 3, 4}
ja, S_4 = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}
welche Größe hat sie 19
?
Dies ist jedoch keineswegs optimal. Zum Beispiel A = B = C = {-1, 0, 1, 2}
gibt S_4 = {0, 1, 2, 3, 4, 5, 6, -1, -3, -2}
was von Größe ist 10
.
Timings
Da ich Ihren Code ausführen muss, um die Ausgabe zu überprüfen, stellen Sie bitte sicher, dass die Ausführung auf einem normalen Desktop nicht länger als 30 Minuten dauert und 4 GB RAM erforderlich sind.
Anmerkungen
Ihr Code muss die Ausgabe tatsächlich berechnen. Sie dürfen vorberechnete Antworten nicht fest in Ihren Code einprogrammieren.
quelle
Antworten:
Rust, Punktzahl
14121411src/main.rs
Cargo.toml
Kompilieren und ausführen mit
cargo run --release
.Ausgabe
Auf meinem Laptop verbrauchte dies ungefähr 8 Minuten und ungefähr 1,5 GB Speicher.
Wie es funktioniert
Wir nehmen (ohne besondere Begründung) an, dass A und B der offensichtliche Bereich aufeinanderfolgender ganzer Zahlen sind, die bei 0 oder ½ zentriert sind, und führen dann eine A * -Suche nach einem optimalen C bei A durch und B durch .
quelle
B
undC
können Sie die gleiche A * Suche aufA
? Ich denke an eine Art Koordinatensinkflug. Beheben Sie alle Sätze bis auf einen, optimieren Sie den letzten und wiederholen Sie den Vorgang.A = B
und beide aufeinander folgenden ganzen Zahlen wirklich immer optimal sind. Nur ein Gegenbeispiel wäre spannend.Axiom, Punktzahl 1466
Die Mengen wären A = B = [- n / 2..n / 2], wenn n% 2 == 0, sonst A = B = [- n / 2 .. ((n / 2) +1)]
Die Menge C ist die Summe des Arrays als [-2, -1, .. (n-2)] zu einem Array arr [] dieser Art [0,0,0,0,0] oder [0,1 , 1,1,2] oder [0,0,0,0,3], damit das Array die Eigenschaft hat
Wenn Sie präziser arbeiten möchten oder Ihr PC schneller ist, können Sie versuchen, '3' in 'inc (aix, 3)' zu erhöhen, um die Anzahl der Arrays für die C-Satz-Variation zu erhöhen und so die Ergebnisgenauigkeit zu erhöhen.
In den Ergebnissen ist die gedruckte Zeichenfolge
mit B = A und | S | ist die Anzahl der Elemente von S
quelle
SQL Server 1495
Die Lösung kann hier überprüft werden .
Entschuldigung für die Ausgabe ist in tabellarischer Form.
quelle
C, Punktzahl
14481431Dies wäre das gleiche +/- Verhältnis wie bei der Implementierung von Axiom
Ergebnisse
quelle
Python 2 , Punktzahl 1495
Probieren Sie es online!
Eine einfache Grundlinie für jede Menge ist ein Intervall der Länge n, das um 0 zentriert ist und für gerade n leicht unausgeglichen ist. Das TIO verfügt über einen Python-Code zur Berechnung Ihrer Punktzahl.
Die Größe ist
(n*n+1)/2
für ungerade n und(n*n+n)/2
für gerade n.quelle
Mathematica, Punktzahl 1495
quelle
C ++, Punktzahl 1411
Vermutung A und B sind aufeinanderfolgende ganze Zahlen, die nahe 0 zentriert sind. Verwenden Sie einfach simuliertes Tempern, um C zu finden.
Quelle:
Ergebnisse:
Mit -O2 auf meinem Computer dauert es 50 Sekunden, um alle Ergebnisse zu berechnen.
quelle