Bundeswettbewerb Informatik: BWINF
-
Habe gestern abend noch meine Doku geschrieben (Aufgaben 1 und 4).
Mein Kumpel hat heute morgen noch bis um 7:00 Uhr seinen Mist (Aufgaben 3 und 5) fertiggestellt.
Was ein Vogel! Der war heute dermaßen tot, dass war einfach nur herrlich.
Er hat für die die HTML-Aufgabe um die 1000 Zeilen Code fertiggestellt.
Naja...
-
Kann hier bitte mal einer mit ner Wahnsinnsgeschwindigkeit bei Aufgabe 1 seine(n) Lösung(sansatz) posten?
-
Hallo,
hier ist der betreffende Teil der Dokumentation:
Verwendete Beispieleingabedatei
3
1
2
7
4Grundansatz
Es muss versucht werden, das gegebene Budget in jedem Monat möglichst gut auszunutzen. Wenn berechnet wird, welche Objekte in einem Monat gekauft/zurückgegeben werden sollen, wird erst einmal der Gesamtwert der Objekte bestimmt, die am Anfang des Monats im Besitz des Vereins sind (z.B.: Besitz der Gegenstände für 1€ und 2€ am Anfang des Monats führt zu einer Summe von 3€). Diese Summe ergibt zusammen mit dem monatlichen Budget die Geldmenge, die in diesem Monat ausgegeben werden kann (im Beispiel: 3€ vom Vormonat+3€ Budget=6€). Für diese Geldmenge wird jetzt berechnet, wie sie am besten für eine neue Sammlung von Gegenständen ausgegeben werden kann (so, dass möglichst wenig Geld übrig bleibt). Die Menge der alten Gegenstände wird nun mit der neu berechneten Menge von Gegenständen verglichen. Wenn ein Gegenstand vorher im Besitz des Vereins war und in der neuen Menge nicht enthalten ist muss er zurückgegeben werden. Wenn ein Gegenstand nur in der neuen Menge enthalten ist muss er gekauft werden. Wenn ein Gegenstand in beiden Mengen/in keiner Menge enthalten ist passiert nichts. Diese Informationen werden ausgegeben.
Das wird so viele Monate gemacht, bis alle Gegenstände gekauft sind. Am Ende wird noch eine Zusammenfassung ausgegeben.Methoden, eine Geldmenge möglichst gut auf die Gegenstände zu verteilen:
Die einfachste Methode, eine Geldmenge möglichst effizient auf eine Menge von Gegenständen zu verteilen, ist, für jede mögliche Kombination von Gegenständen zu berechnen, wie viel Geld übrig bleibt, nachdem man diese Gegenstände gekauft hat. Wenn weniger als 0 Euro übrig bleiben kann man diese Kombination mit der gegebenen Geldmenge nicht kaufen. Wenn kein Geld übrig bleibt ist die Kombination ideal. Sonst wird die Kombination gewählt, bei der am wenigsten Geld übrig bleibt. Das Ausprobieren kann man mit Rekursion relativ einfach machen. Man fängt beim teuersten Gegenstand (im Beispiel: 7) an und startet mit ihm die Rekusion.
In der Rekursion wird immer ein Gegenstand als gekauft eingetragen, dann die Rekursion für den nächsten Gegenstand aufgerufen. Dann wird der Gegenstand als nicht gekauft eingetragen und die Rekursion wieder für den nächsten Gegenstand aufgerufen. Wenn die Rekursion beim billigsten Gegenstand angekommen ist (inzwischen ist eine Liste entstanden, die alle Objekte beeinhaltet, die während der Rekursion gekauft wurden) wird nachgeschaut, ob die Menge der Gegenstände, die im Laufe der Rekursion gekauft wurden, besser ist als die bisher beste Menge (ob weniger Geld übrig bleibt).
Für das Beispiel mögliche Kombinationen: [1, 2, 4, 7]; [1, 2, 7]; [1, 4, 7]; [2, 4, 7]; [1, 2]; [1, 4]; [1, 7]; [2, 4]; [2, 7]; [4, 7]; [1]; [2]; [4]; [7]; [].
Wenn man 6 Euro ausgeben kann ist die beste Kombination [2, 4], da dann alles Geld ausgegeben wird.
Diese Methode ist allerdings sehr langsam. Deshalb habe ich drei Verbesserungen:
Erste Verbesserung: Der Kauf des Gegenstands wird nicht simuliert, wenn nicht genug Geld übrig ist, um ihn zu kaufen. Dazu muss bei jedem rekursiven Aufruf die Information mitgegeben werden, wie viel Geld nach den vorherigen Käufen noch übrig ist.
Zweite Verbesserung: Wenn eine optimale Kombination gefunden wurde (kein Geld übrig), wird diese Kombination gespeichert und die Rekursion abgebrochen.
Dritte Verbesserung: Es geht ja bei der Rekursion darum, Möglichkeiten zu finden, mehr Geld auszugeben, als bisher maximal ausgegeben wurde. Deshalb kann die Rekursion abgebrochen werden, wenn die Summe der Preise der Objekte, die billiger als das gerade bearbeitete Objekt sind, zusammen mit dem Preis des aktuellen Objekts weniger oder gleich viel ergibt als der bisher höchste erreichte Gesamtpreis. (Beispiel: Der bisherige Bestwert ist 6€. Bisher wurde in der Rekursion noch nichts gekauft. Jetzt ist das Objekt mit dem Wert 2€ dran. Das Objekt mit 2€ und das Objekt mit 1€ sind zusammen (3€) nicht so viel wert, wie der bisherige Bestwert(6€). Deshalb kann die Rekursion bei dem Objekt für 2€ schon abgebrochen werden. Die weitere Rekursion würde keine höheren Werte als 3€ bringen).
Es wäre natürlich schlecht, wenn man die Preise aller billigeren Objekte bei jedem rekursiven Aufruf neu berechnen müsste, deshalb werden sie schon vorher von der Funktion addierePreise berechnet und dann im addierte_preise-Attribut von KaufObjekt eingetragen.
-
Hi!
Wie ist des denn so, wann bekommt man denn seine Ergebnisse, Punktzahl, oder bekommt man eine genaue Auflistung, was falsch war etc.?
Aja und hat jemand schon ne Bestätigung, dass seine Absendung bei denen eingegangen ist oder nicht? Ich hab sogar die Online-Anmeldung genutzt, aber no keine Mail erhalten?mfg
blut-lecker
-
Michael E. schrieb:
Kann hier bitte mal einer mit ner Wahnsinnsgeschwindigkeit bei Aufgabe 1 seine(n) Lösung(sansatz) posten?
Ich hab zwar nicht implementiert, hätte aber was ähnliches gemacht, wie da s. was hier http://en.wikipedia.org/wiki/Knapsack_problem als Pseudo-Polynomialzeitalgorithmus angegeben ist. Also Wert aller Gegenstände zusammenzählen und dann ein Feld der Größe Anzahl Gegenstände * Gesamtwert aller Gegenstände ausgefüllt. Anschließend läßt sich in jedem Schritt in O(Anzahl Gegenstände) bestimmen, was optimalerweise gekauft werden muß. Das dürfte ziemlich flott sein.
-
@Jester: Erstaunlich, das ist genau unser Problem. Wenn man das kennt ist die erste Aufgabe gar kein Problem mehr.
@blut-lecker: Ich hab auch Online-Anmeldung und hab meine Einsendenummer ganz fett auf die Rückseite des Umschlags geschrieben, habe allerdings auch noch keine Mail erhalten.
Laut Statistik des letzten Jahres waren es beim letzten Mal allerdings ~450 Teilnehmer. Wenn es diesmal ähnlich viele sind müssen die ziemlich viele Päckchen bearbeiten.
Letztes Jahr wurde mir die Empfangsbestätigung trotzdem an dem Tag zugeschickt, an dem die Einsendung angekommen ist (also sind sie dieses Jahr später dran). Die Ergebnisse kamen 40 Tage nach dem Einsendeschluss (allerdings nur per E-Mail). Die Urkunden kamen wegen irgendwelcher Probleme im Januar. Da gibt auch es einen Bogen mit Kästchen dazu, wo der Korrektor immer angekreuzt hat, was du falsch gelöst hast. Allerdings ist der nicht sehr detailliert. Ich hab mal meinen vom letzten Jahr hochgeladen: http://img329.imageshack.us/img329/3987/bwinfergebnis224zn7.jpg (die Durchgestrichenen habe ich nicht gemacht.) Deine Unterlagen bekommst du übrigens nicht zurück.
-
du kannst in der OnlineAnmeldung auf Bearbeitungsstatus gehen, da steht dann "bereits angekommen" mehr habe ich allerdings auch nicht erhalten.
-
Hi!
Ah sehr schön, das freut mich, dass das wenigstens schon einmal angekommen ist, hab dieses Jahr das erste mal mitgemacht, da will man natürlich auch, dass alles klar geht;)mfg
blut-lecker
-
Habe ich auch nicht bemerkt, dass unter Bearbeitungszustand steht, ob deine Einsendung angekommen ist. Ich hätte eigentlich die Bestätigungs-E-Mail erwartet. Aber ich bin auch froh, dass es da ist, egal ob mit Mail oder ohne.
-
Die zweite Runde des BWInf hat gestern begonnen. Ich habe meine Ergebnisse zumindest gestern per Post bekommen. Einen Link zu den Aufgaben als PDF kann ich nicht anbieten, da die Website des BWInf leider chronisch veraltet ist.