Kommentarer til oppgavene
En vanlig registreringsuppgift på grundkursnivå som löses
på valfritt sätt. Brute Force.
Kan reduceras till en maxflow-algoritm. Bipartit graf, ett
hörn ui till vänster per rad, ett hörn vj till höger per
kolumn. Dessutom källa s och utlopp t.
Källa s har kant till varje
radhörn med kapacitet = radsumma för den raden.
Utlopp t har kant från
varje kolumnhörn med kapacitet = kolumnsumman för den kolumnen. För
varje ruta (i,j) i budget-matrisen så finns
kanterna (ui,vj) och
(vj,ui).
Om villkoret är att talet i rutan ska vara a <= talet <= b så
sätter vi kapacitet b på kanten (ui,vj)
och kapacitet -a på kanten
(vj,ui).
Finn sedan maxflöde (med t.ex. Ford-Fulkerson) och kolla att
kanterna från s och kanterna till t är mättade.
Då har vi en tillåten
lösning på budgetproblemet.
En komplikation är att man måste hitta ett
tillåtet startflöde. Det är inte säkert att noll-flödet är tillåtet
eftersom vi har villkor som säger att flöde[vi,uj] >= a för vissa
(i,j).
Frogger Løses med bredde først-søk. For hver runde må man flytte på
alle bilene slik at man ser hvor frosken (grodan) kan hoppe. Det
letteste(?) er å holde alle posisjonene frosken kan nå i en runde i
en 2D-tabell av samme størrelse som den «fysiske» verden. Da vet man
at man i neste runde kan nå alle de samme rutene + alle naboruter -
alle ruter hvor det er en bil. Så snart man har merket av målruten er
problemet løst.
Løses med «brute force». Prøv først med 1 person, så 2
osv. Hver gang: Regn ut hvor mange personer som har valgt hvert
alternativ og regn tilbake prosentsatsen og sjekk om det
stemmer. Sjekk også summen av antall personer.
Komplikasjon: Pga
avrunding kan det være flere antall personer som passer til
prosentsatsen. Finn største og minste antall og summer disse for å
sjekke antallet personer.
Komplikasjon: sprintf i C avrunder ikke slik man kanskje
forventer.
Perioden mellan förekomster av «Jackpot» är det minsta
heltal som är delbart med periodiciteten för varje enskilt hjul,
dvs. hjulperiodiciteternas minsta gemensamma multipel (least common
multiple, LCM på Engelska).
En enkel implementation av LCM kan
utnyttja att
LCM(x0,x1,x2,...) =
LCM(x0,LCM(x1,LCM(x2,...)))
och att LCM(x,y) = x*y / GCD(x,y).
(GCD(x,y) beräknas som bekant
m.h.a. Euklides algoritm.)
En alternativ, men lite mer krävande
lösningsmetod är att primtalsfaktorisera varje hjulperiod, och bygga
upp LCM som en faktor av maximala antalet förekomster av varje
primtalsfaktor.
Standard dynamisk programmering.
Bra att beräkna minheight [i,h] =
minsta höjd på bygnad som medger att vi befinner oss på höjd h efter
de i första etapperna.
Börja med att plocka bort de punkter som ligger <=d från
origo. För de återstående punkterna, beräkna vinkel (atan2)
från origo
till punkten samt inom vilket vinkelintervall (trigonometri) en linje
från origo kan ha för att punkten ska vara <= d från linje. Sortera
alla intervall så att en cirkulär lista uppstår. Bryt upp listan på
alla möjliga ställen så att den blir linjär, applicera därefter en
greedy-lösning för varje linjär lista.
Vid sortering kan det krävas
att man är noga med flyttalsjämförelser. Det går förvisso att lösa
endast med heltal, men om man använder ett litet epsilon vid alla
flyttalsjämförelser går det bra. Möjliga värden på epsilon som
fungerar på min lösning är 1e-5 till 1e-18 (eller nåt sånt).
Denna uppgift blir ganska lätt om man bara angriper den från
rätt håll. Ett Zeisel-nummer (vilket det egentligen rör sig om) är en
produkt av minst tre primtal, och kan i uppgiften aldrig vara större
än 2e9. Detta sätter klara begränsningar på de två lägsta av
primtalen. Det räcker således att loopa över alla tillräckligt små
unika par av primtal och se om de utgör början av en
Zeisel-sekvens. Om de gör det, så lägger man till alla Zeisel-nummer
som har det primtalsparet som lägsta faktorer i en lista.
När detta är
klart har man en lista över samtliga 243 «explosiva» nummer som finns
i intervallet. Efter detta är det bara att söka i den listan för att
se hur många som finns inom det givna intervallet.
Mer om Zeisel-nummer.
Sist oppdatert av
Dag Langmyhr.