Recreatieve algoritmiek Gerard Tel, Thomas van Dijk
UKP BAPC NWERC.eu World Finals
3 personen 5 uur 8+ opgaven Algoritmische puzzels Snel programmeren
Details kunnen belangrijk zijn String + String tijd lineair in de lengtes van de strings. – (java.lang.String) String total = “”; for( String s : myStrings ) total = total + s; Kost kwadratische tijd! Gebruik toepasselijke streams/buffers, bijv StringBuilder.
Geheugenbeheer Heap (new) Allocaties zijn duur Veel ruimte Vrij te referencen Garbage collection Stack Allocaties zijn goedkoop Beperkte ruimte Beperkte scope
Comments Goede comments zijn moeilijk. Veel is niet per se goed. Gaat om leesbaarheid / begrijpbaarheid. “Als de code en de comments elkaar tegenspreken, zijn ze waarschijnlijk allebei fout.”
Amortized analyse Dynamisch programmeren Korste paden Spanning trees Lin. time order statistics Datastructuren: Zoekbomen Prio queue Binary search Datastructuren: Zoekbomen Prio queue Binary search Max flow / matching Divide & conquer Greedy NP-volledigheid Randomisering Linear programming Tries Approximatie
Discodrukte Persoon i komt op tijd s i en gaat op tijd f i. Hoeveel mensen waren er maximaal tegelijk binnen?
Discodrukte Persoon i komt binnen op tijd s i en gaat op tijd f i. Hoeveel mensen waren er maximaal tegelijk binnen? Sorteer s en f Tegelijk doorlopen als in een ‘merge’ Lopend maximum bijhouden
Taarten snijden Er komen n vrienden op bezoek. Er zijn k taarten, met omvang r i. Verder identiek. Iedereen krijgt 1 stuk uit 1 taart. Iedereen krijgt evenveel taart. Grootst mogelijke stuk taart?
Taarten snijden Elegante greedy oplossing met prio queue. Grootst mogelijke stuk taart? Haalbaarheid van een bepaalde grootte triviaal te controleren. Binary search! (Alert: specs vermeldt precisie)
Verhuizen Dozen moeten naar verdieping N m personen Staan op verdieping a i, al dan niet met doos Er staan nog k dozen op de begane grond De trap is smal: Mensen kunnen elkaar niet passeren Kan wel op de trap een doos doorgeven Hoe lang duurt het voordat alle dozen boven zijn?
Verhuizen het gaat om de dozen! Antwoord makkelijk te bepalen met simulatie, maar
Maanspullen Ruimteschip naar de maan Objecten verzamelen – Opbrengst – Gewicht – Tijd nodig om in te laden Ruimteschip kan max gewicht W vervoeren Er is maar beperkte tijd T voor inladen Welke objecten neem je mee voor opt opbrengst?
Maanspullen Ruimteschip naar de maan Objecten verzamelen – Opbrengst – Gewicht – Tijd nodig om in te laden Ruimteschip kan max gewicht W vervoeren Er is maar beperkte tijd T voor inladen Welke objecten neem je mee voor opt opbrengst? Knapsack!
Vrij korte paden Tour operator Amsterdam-Brussel. Klant mag route kiezen; gewogen graaf. Maar geen grote omweg: alleen kortste pad of 1 langer. Hoeveel mogelijke routes?
Vrij korte paden (…) kortste pad of 1 langer. Dijkstra aanpassen? Hoeveel mogelijke routes? Wellicht dynamisch programmeren: kan ‘meestal’ uitgebreid worden om te tellen.
Vrij korte paden Dijkstra aanpassen? Dynamisch programmeren over die graaf. Volgorde? Misschien elegant, maar … te veel details. Gewone Dijkstra om lengte kortste pad te bepalen. Recursief aantal paden tellen: Aantal paden van lengte k dat in knoop v uitkomt, met de extra stap al wel/niet genomen. Memoisatie.
Schaduwen Lichtbron op punt p. Lijnstukken van punt a i naar b i. Beschouw de schaduw op de lijn y=0. Hoeveel aaneengesloten stukken schaduw? Of: totale lengte van schaduw
Schaduwen Lichtbron op punt p. Lijnstukken van punt a i naar b i. Beschouw de schaduw op de lijn y=0. Hoeveel aaneengesloten stukken schaduw? Of: totale lengte van schaduw
Schaduwen Lichtbron op punt p. Lijnstukken van punt a i naar b i. Beschouw de schaduw op de lijn y=0. Hoeveel aaneengesloten stukken schaduw? Of: totale lengte van schaduw 01012
Penguin bashing Een Yeti slaat met een knuppel een pinguïn Slaat pinguïn onder te kiezen hoek ( graden) Gegeven mechanica: zwaartekracht, wrijving, etc. Bommen: pinguïn wordt verder gelanceerd. Valkuilen: pinguïn verloren. Welke integer hoek brengt de penguïn het verst?
Penguin bashing Een Yeti slaat met een knuppel een pinguïn Slaat pinguïn onder te kiezen hoek ( graden) Gegeven mechanica: zwaartekracht, wrijving, etc. Bommen: pinguïn wordt verder gelanceerd. Valkuilen: pinguïn verloren. Welke integer hoek brengt de penguïn het verst? 182 is weinig. Voor gegeven hoek: gewoon doorrekenen.
Penguin bashing vs taart snijden Bij het taartsnijden is de JA/NEE beslissing monotoon (als stuk s niet kan, dan groter stuk ook niet) Binary search! Bij penguin bashing onvoorspelbaar Brute force
Rookverbod Ruimtes in een restaurant, verbonden met deuropeningen. Aangegeven ruimtes: Ingang en Keuken. Partitioneer het restaurant met rooksluizen in aaneengesloten “rokers-” en “niet-rokersgebieden”. De Ingang is rokersgebied. De Keuken is niet-rokersgebied. Hoeveel rooksluizen zijn er minimaal nodig?
Rookverbod Ruimtes in een restaurant, verbonden met deuren. Een graaf, uiteraard. De Ingang is rokersgebied. De Keuken is niet-rokersgebied. Hoeveel rooksluizen zijn er minimaal nodig? Scheid Ingang en Keuken met zo min mogelijk kanten. Dat probleem heet Min Cut = Max Flow!
Priem kamernummers Alle kamernummers zijn 4-cijferige priemgetallen. Kamernummer p moet veranderd worden in q, ook priem. Kamernummer kan alleen per cijfer veranderd worden. Alle tussenstappen moeten ook priem zijn. Kan dit? Minst aantal stappen?
Priem kamernummers 4-cijferige priemgetallen. Zijn er niet veel van. KNOPEN (Zeker <10k. Hm. 10k/ln(10k), ~1000) Mag van de een naar de ander als 1 cijfer verschil. KANTEN Minst aantal stappen? Korste pad in ongewogen graaf: BFS.
Chip routing Gigantisch grid N x N k “input” en “output” punten op de rand. Verbind input i met output i over de grid. Paden mogen elkaar niet kruisen. Is dat mogelijk in de gegeven instantie?
Chip routing Verbind input i met output i over de grid. Paden mogen elkaar niet kruisen. Klinkt als (node capacity) flow Gigantisch grid N x N Maar niet letterlijk op de grid… … simplificatie?
Chip routing Is dat mogelijk in de gegeven instantie? Hoeft niet constructief! Greedy: beschouw de rand als corresponderende in/output naast elkaar: weghalen als geen: instantie onmogelijk
Mixtape Verzameling van k nummers voor een mixtape (k~20). Sommige nummers passen beter na elkaar dan anderen. Kwaliteit van nummer i na j is c ij. Beste volgorde?
Mixtape Verzameling van k nummers voor een mixtape (k~20). 20 is erg weinig. Beste volgorde? Brute force geeft 20! mogelijkheden, ~ 2.4 x Toch erg veel.
Mixtape Kwaliteit van nummer i na j is c ij. Beste volgorde? Klinkt een beetje als Traveling Salesman Problem (“TSP”). Volgorde-problemen kunnen soms in O * ( 2 n ) tijd met dynamisch programmeren. “Beste score voor deelverzameling S van de nummers, eindigend op nummer i” 2 20 ~ 1 miljoen
Pinguïnvergadering n ijsschotsen. p i pinguïns op schots i. Gegeven is van welke schots je naar welke andere kan springen. Landen op een schots doet schade: kan maar s i keer, dan is de schots weg. Kunnen de pinguïns verzamelen op 1 schots?
Pinguïnvergadering Gegeven is van welke schots je naar een andere kan springen. (…) verzamelen op 1 schots? Iets met een graaf / paden. Landen op een schots doet schade: kan maar s i keer, dan is de schots weg. Node capacity flow Gok vergaderschots
Succes met toets 2 en practicum