Prof. Dr. Christian Scheideler TU München

Slides:



Advertisements
Ähnliche Präsentationen
Imperative Programmierung
Advertisements

Christian Scheideler SS 2009
Hash-Tabellen und -Funktionen Hash-Tabellen in Java
Asymptotische Notation
ACM ICPC Praktikum Kapitel 4: Sortieren.
Forschungszentrum caesar
Sortieren I - Bubblesort -
Kapitel 6: Kombinatorik
3. Kapitel: Komplexität und Komplexitätsklassen
Einführung in Berechenbarkeit und Formale Sprachen
Das Halteproblem. Gibt es einen Algorithmus, mit dem man für jedes beliebig vorgegebene Programm R und für jede beliebig vorgegebene Eingabe E entscheiden.
SWITCH - Anweisung.
ARRAY oder FELD oder VEKTOR
Funktionen.
WHILE - Anweisung.
DO...WHILE Anweisung.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Prof. Dr. Th. Ottmann.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (03 – Verschiedene Algorithmen für dasselbe Problem) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Tobias Lauer.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (03 – Verschiedene Algorithmen für dasselbe Problem) Prof. Dr. Th. Ottmann.
Algorithmen und Datenstrukturen
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 4 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 2 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
WS 06/07 Algorithmentheorie 01 - Einleitung Prof. Dr. Th. Ottmann Tobias Lauer.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (03 – Verschiedene Algorithmen für dasselbe Problem) Prof. Dr. Th. Ottmann.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 4 Claudio Moraga; Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Semantische Fehler Seminar im Grundstudium WS2002/2003:
Christian Schindelhauer
Christian Schindelhauer
Planung einfache Dateibehandlung (externe Dateien, Öffnen, Lesen/Schreiben, Schließen). Diskussion des Problems, die Wörter in einem gegebenen Text.
Einführung in die Programmierung
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Programmieren in C Zeichen-/Stringfunktionen Dynamischer Speicher
Einführung in die Programmierung Wintersemester 2011/12 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS
Einführung in die Programmierung
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fakultät.
Einführung in die Programmierung
Einführung in die Programmierung Wintersemester 2013/14 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung
Programiersprache Mustafa SÖYLEMEZ e
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Algorithmen und Datenstrukturen SS 2005
Informatik II Grundlagen der Programmierung Programmieren in C Benutzerinteraktion / Ein- und Ausgabe Hochschule Fulda – FB ET Sommersemester
„einfaches Java Programm“
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen Übungsmodul 2 Dr. W. Narzt u. Dr. A. Stritzinger.
Programmieren in Assembler
1 Tagesüberblick 2 Lösung Hausaufgabe/Fragen Datei- ein- und ausgabe Schleifen Vergleiche Wahrheit.
programmieren des casio FX-7400GII
Analyse der Laufzeit von Algorithmen
A) Erklären Sie den Datentyp char. b) Erklären Sie den Datentyp Struct c) Erklären Sie die Wirkungsweise des Operators & bei Anwendung im Zusammenhang.
Robuste Programme durch Ausnahmebehandlung
1 // Laengste Zeile bestimmen // // Liest die Eingabe Zeichen fuer Zeichen, bis // das erscheint. // Die laengste Zeile wird ausgegeben (bei.
SAP Seminar 2007 Bestellung anlegen
Programmierungssprache PERL
Programmierkurs JavaUE 4 Anweisungen und ProgrammeDietrich BolesSeite 1 Programmierkurs Java Dr. Dietrich Boles Teil Imperative Programmierung Unterrichtseinheit.
Wann ist eine Funktion (über den natürlichen Zahlen) berechenbar?
Programmiersprachen II Fortsetzung Datenstrukturen Balancierte Bäume 3 Prof. Dr. Reiner Güttler Fachbereich GIS HTW.
 Präsentation transkript:

Prof. Dr. Christian Scheideler TU München ACM ICPC Praktikum Prof. Dr. Christian Scheideler TU München

ACM International Collegiate Programming Contest Hochschulinterner Wettbewerb Regionaler Wettbewerb in Universidade Nova de Lisboa, Portugal, Mitte November Weltfinale 2006: San Antonio, Texas

Übersicht Einführung Datenstrukturen Zeichenketten Sortieren Arithmetik und Algebra Kombinatorik und Zahlentheorie Backtracking und Branch-and-Bound Graphalgorithmen Dynamische Programmierung Geometrie Buch: S. Skiena und M. Revilla Programming Challenges Springer Verlag, 2003

Anforderungen Anwesenheit im Kurs Korrekte Lösung der wöchentlichen Programmieraufgaben (in Teams bis zu 3 Personen) Einreichung der Lösungen: http://acm.uva.es/p/ Email an scheideler@in.tum.de

ICPC Problemarchiv http://acm.uva.es/p/ Users->Register Users->Submit your Code Statistics->Problem Status Statistics->Authors Ranklist Klassifizierung: http://www.cs.uleth.ca/%7Echeng/contest/hints.html

Feedback Akzeptiert (AC): Herzlichen Glückwunsch! Präsentationsfehler (PE): Ausgabe richtig, aber nicht im richtigen Format Akzeptiert (PE): Ein geringfügiger Präsentationsfehler, aber das Problem wird trotzdem noch als gelöst betrachtet. Falsche Antwort (WA): Einer oder mehrere Fälle sind falsch gelöst worden. Compilerfehler (CE): Die Fehlermeldungen werden zurückgeschickt. Laufzeitfehler (RE): Das Programm brach während der Abarbeitung mit einem Fehler ab. Die Fehlermeldung wird zurückgeschickt.

Feedback Zeitlimit überschritten (TL): Das Programm hat zu lange gebraucht. Speicherlimit überschritten (ML): Das Programm hat zuviel Speicher gebraucht. Ausgabelimit überschritten (OL): Zuviel Ausgabetext (deutet auf Endlosschleife) Beschränkte Funktion (RF): Benimm Dich! Einreichungsfehler (SE): User ID oder Problem ID inkorrekt.

Programmiersprachen Erlaubte Programmiersprachen: C, C++, Pascal, Java Ein- und Ausgabe über Standard I/O C: while (scanf(“%ld”, &x)!=EOF) … printf(“%ld\n”,y); C++: while (cin >> x) … cout << y << endl; Pascal: while not eof do … readln(x); … writeln(y);

Tipps zum Programmieren Wichtige Kriterien: Zeitaufwand und Platzaufwand, aber vor allem Programmieraufwand! Schreib zunächst Kommentare! Dokumentiere jede Variable! Verwende symbolische Konstanten! Vermeide komplexe Datentypen (Objekte, Pointer)! Verwende Subroutinen! Verwende Debugging-Anweisungen klug! (bedingte Ausgabe bei Problemen, gib Erläuterungen zu Ausgabewerten)

Elementare Datentypen char, int, long, real, double,... Einfache Arrays (A[i]): oftmals vorzuziehen gegenüber Pointerstrukturen - mit Bereichsüberprüfung - etwas größer als notwendig Mehrdimensionale Arrays (A[i][j]): gut für Gitter und Matrizen Structs: Nur sinnvoll, wenn Arrays nicht anwendbar (besser typedef int point[2]; als struct point { int x, y; };)

Das 3n+1 Problem Betrachte den folgenden Algorithmus zur Berechnung einer Folge von Zahlen: Starte mit einer natürlichen Zahl n. Falls n gerade ist, teile durch 2. Falls n ungerade ist, multipliziere sie mit 3 und addiere 1 hinzu. Wiederhole diese Regel für die neue Zahl, bis die Zahl 1 erreicht ist. Die folgende Folge ergibt sich zum Beispiel für n=22: 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1 Man nimmt an, dass der Algorithmus für alle natürliche Zahlen terminiert, aber bisher konnte noch niemand einen Beweis dafür finden. Zumindest ist bekannt, dass der Algorithmus für alle Zahlen bis 1.000.000 terminiert. Für eine Zahl n sei die Folgenlänge von n die Anzahl der Zahlen, die erzeugt werden bis und inklusive 1. D.h. im obigen Beispiel ist die Folgenlänge 16. Gib für beliebige zwei Zahlen i und j die maximale Folgenlänge für alle Zahlen zwischen i und j (inklusive i und j) aus.

Das 3n+1 Problem Eingabe: Eine Folge von Zahlenpaaren, ein Paar pro Zeile. Alle Zahlen sind kleiner als 1.000.000 und größer als 0. Ausgabe: Für jedes Zahlenpaar i und j, gib i und j und die maximale Folgenlänge für i und j aus. Diese drei Zahlen sollen durch ein Leerzeichen getrennt sein und in einer Zeile stehen, mit einer Zeile pro Zahlenpaar. Beispiel: 1 10 1 10 20 100 200 100 200 125

Erster Versuch #include <iostream.h> void main() { unsigned long a, b, c, d, max, i; while (cin >> a >> b) { max = 0; for (c=a; c<=b; c++) { i = 1; d = c; while (d!=1) { if (d%2) d = 3*d+1; else d = d/2; i = i+1; } if (i>max) max = i; cout << a << " " << b << " " << max << "\n";

Das 3n+1 Problem Das Problem ist kniffeliger als es scheint! Lies die Spezifikation genau!!! Fallstricke: Es ist nicht vorgegeben, dass i<j sein muss! Die Zahlen können sehr groß werden!

Bignum #include <stdio.h> #define MAXDIGITS 100 /* max length */ typedef struct { char digits[MAXDIGITS]; /* number */ int lastdigit; /* max digit */ } bignum;

Bignum print_bignum(bignum *n) { int i; for (i=n->lastdigit; i>=0; i--) printf("%c",'0'+ n->digits[i]); printf("\n"); }

Bignum int_to_bignum(int s, bignum *n) { int i; /* counter */ int t; /* int to work with */ for (i=0; i<MAXDIGITS; i++) n->digits[i] = (char) 0; n->lastdigit = -1; t = abs(s); while (t > 0) { n->lastdigit ++; n->digits[ n->lastdigit ] = (t % 10); t = t / 10; } if (s == 0) n->lastdigit = 0;

Bignum add_bignum(bignum *a, bignum *b, bignum *c) { int carry; /* carry digit */ int i; /* counter */ initialize_bignum(c); c->lastdigit = max(a->lastdigit,b->lastdigit)+1; carry = 0; for (i=0; i<=(c->lastdigit); i++) { c->digits[i] = (char) (carry+a->digits[i]+b->digits[i]) % 10; carry = (carry + a->digits[i] + b->digits[i]) / 10; } zero_justify(c);

Die Katze im Hut Eine clevere Katze spaziert in einen unordentlichen Raum, in dem sie aufräumen muss. Anstatt die Arbeit alleine zu tun, benutzt sie ihre kleineren Hilfskatzen. Diese hält sie in ihrem Hut. Jede Hilfskatze besitzt auch eine Menge von kleineren Hilfskatzen in ihrem eigenen Hut, und so weiter, bis die Hilfskatzen eine kleinstmögliche Größe erreichen. Diese kleinsten Katzen haben keine weiteren Katzen in ihrem Hut und müssen daher die Aufräumarbeit leisten. Die Anzahl Katzen im Hut einer Katze ist eine Konstante N. Die Größe dieser Katzen ist 1/(N+1) mal die Größe der Katze, in deren Hut sie sind. Die kleinsten Katzen haben die Größe 1 und alle Größen sind natürliche Zahlen. Gegeben die Größe der Anfangskatze und die Anzahl der arbeitenden Katzen (der Größe 1), bestimme die Anzahl der Katzen, die nicht arbeiten müssen (also Katzen der Größe größer als 1) und die Summer der Höhen aller Katzen.

Die Katze im Hut Eingabe: Eine Folge von Zahlenpaaren, ein Paar pro Zeile. Die erste Zahl gibt die Größe der Anfangskatze an und die zweite Zahl repräsentiert die Anzahl der arbeitenden Katzen. Ein Paar mit Nullen zeigt das Ende der Eingabe an. Ausgabe: Für jede Eingabezeile (Katze-in-Hut Spezifikation), gib die Anzahl der Katzen aus, die nicht arbeiten, gefolgt von einem Leerzeichen, gefolgt von der Summe der Größen aller Katzen. Für jede Eingabezeile soll eine Ausgabezeile verwendet werden, nur nicht für “0 0”, für das die Eingabe terminiert.

Die Katze im Hut Beispieleingabe: 216 125 5764801 1679616 0 0 Beispielausgabe: 31 671 335923 30275911