Tehtävien deadline: su-ma yö 4.4. 1:59.
Tehtävissä 1 ja 2 käsitellään ongelmanratkaisua puissa. Tehtävien 3-5 aiheena on keko, jolle löytyy valmis toteutus PriorityQueue
javassa.
Kauppamatkustaja haluaa käydä n
kaupungissa, joiden väliset etäisyydet on tallennettu n×n
matriisiin (eli kaksiulotteiseen taulukkoon) et
. Kauppamatkustaja haluaa kiertää kaikki kaupungit läpi mahdollisimman nopeasti. Hän aloittaa kierroksensa kaupungista 0, käy kaikissa muissa kaupungeissa tasan kerran ja palaa lopuksi kaupunkiin 0. Auta kauppamatkustajaa selvittämään lyhimmän mahdollisen kierroksen pituus.
Toteuta metodi
int kierros(int[][] et)Syötteenä annettu taulukko
et
sisältää tiedon kaupunkien välisistä etäisyyksistä. Kaupunkien i ja j välinen etäisyys on et[i][j] == et[j][i]
. Kun siirrytään kaupungista i suoraan kaupunkiin j käymättä missään muussa kaupungissa, on reitin pituus et[i][j]
, vaikka olisikin epäsuora reitti, joka olisi lyhyempi.
Kaupunkien määrä n
on korkeintaan 10. Matriisin et
sisältämät luvut ovat välillä 0..106.
Olkoon matriisi et
seruaavanlainen:
0321 3042 2404 1240Matriisin kuvaama verkko näyttää siis tältä:
Nyt yksi esimerkki lyhimmästä mahdollisesta kierroksesta käy kaupungit läpi järjestyksessä 0->2->1->3->0. Tämän reitin pituus on 2+4+2+1=9, joka on haettu vastaus.
Tee metodi
void ratkaise(int[][] sudoku)
,
joka
ratkaisee annetun sudokun. Sudoku annetaan
kaksiulotteisena
int
-taulukkona.
Taulukossa 0
tarkoittaa tyhjää paikkaa ja numerot 1-9 tarkoittavat numeroita 1-9.
Metodin pitäisi muokata annettua taulukkoa niin että se on oikein
täytetty sudoku, eli:
Voit olettaa, että metodille annettuun sudokuun on olemassa yksikäsitteinen ratkaisu.
Suomalainen Arto Inkala on laatinut "maailman vaikeimman Sudokun":
Tee ohjelmastasi sellainen, että se ratkaisee kyseisen sudokun (ja muutkin löytämäsi sudokut) silmänräpäyksessä.
Vihje! Luentokalvojen kuningattaret shakkilaudalla -esimerkki.
(Tämän pitäisi ratketa hyvin nopeasti)
Anna sudoku: 8??93???2 ??9????4? 7?21??96? 2??????9? ?6?????7? ?7???6??5 ?27??84?6 ?3????5?? 5???62??8 Ratkaisu: 846937152 319625847 752184963 285713694 463859271 971246385 127598436 638471529 594362718
Anna sudoku: ??53????? 8??????2? ?7??1?5?? 4????53?? ?1??7???6 ??32???8? ?6?5????9 ??4????3? ?????97?? Ratkaisu: 145327698 839654127 672918543 496185372 218473956 753296481 367542819 984761235 521839764
Anna sudoku: ????????? ?????3?85 ??1?2???? ???5?7??? ??4???1?? ?9??????? 5??????7? ??2?1???? ????4???9 Ratkaisu: 237658914 469173285 851924367 123567498 784239156 695481732 546392871 972815643 318746529
Asunnonvälitystoimisto toimii seuraavasti: kullekin henkilölle määritellään jonoon liittyessä kiireellisyysarvo. Asunnon vapautuessa sen saa henkilö, jonka kiireellisyysarvo on suurin. Jos monella henkilöllä on yhtä suuri kiireellisyysarvo, asunnon saa aakkosissa ensimmäinen henkilö. Jos monella henkilöllä on sama nimi, kuka tahansa heistä voi saada asunnon.
Toteuta luokka Toimisto
, joka tarjoaa seuraavat metodit:
void lisaaJonoon(String nimi, int kiire)
nimi
jonoon
kiireellisyysarvolla kiire
String annaAsunto()
Jokainen nimi muodostuu kirjaimista a..z. Nimen ensimmäinen kirjain on iso ja kaikki muut pieniä. Nimen pituus on enintään 10 kirjainta.
Kiireellisyysarvo on kokonaisluku välillä 1..109. Mitä suurempi luku on, sitä kiireellisempi henkilön tilanne on.
Testauksessa metodeita kutsutaan enintään 105 kertaa.
Seuraava koodi testaa luokkaa:
Toimisto t = new Toimisto(); t.lisaaJonoon("Uolevi", 8); t.lisaaJonoon("Maija", 4); System.out.println(t.annaAsunto()); t.lisaaJonoon("Liisa", 5); System.out.println(t.annaAsunto()); System.out.println(t.annaAsunto());
Koodin tulostuksen tulisi olla seuraava:
Uolevi Liisa Maija
Tehtaassa on koneita, joista jokainen pystyy valmistamaan yhden tuotteen tietyssä ajassa. Tehtäväsi on valmistaa mahdollisimman nopeasti annettu määrä tuotteita käyttämällä koneita parhaalla mahdollisella tavalla.
Oletetaan että koneet ovat seuraavat:
kone | toiminta-aika |
---|---|
A | 1 |
B | 2 |
C | 3 |
D | 4 |
Kun haluat valmistaa 10 tuotetta, yksi optimaalisista tavoista on seuraava:
ajanhetki | tapahtumat |
---|---|
0 | Laitat käyntiin koneet A, B, C ja D. |
1 |
Kone A saa valmiiksi tuotteen. Laitat uudestaan käyntiin koneen A. (1 tuote valmiina.) |
2 |
Koneet A ja B saavat valmiiksi tuotteen. Laitat uudestaan käyntiin koneet A ja B. (3 tuotetta valmiina.) |
3 |
Koneet A ja C saavat valmiiksi tuotteen. Laitat uudestaan käyntiin koneet A ja C. (5 tuotetta valmiina.) |
4 |
Koneet A, B ja D saavat valmiiksi tuotteen. Laitat uudestaan käyntiin koneen B. (8 tuotetta valmiina.) |
5 |
Käyt hesarin nettisivulla lukemassa päivän fingerporin. |
6 |
Koneet B ja C saavat valmiiksi tuotteen. (10 tuotetta valmiina.) Tehtävä suoritettu! |
Toteuta seuraava metodi:
long lyhinAika(int[] koneet, int maara)
Taulukko koneet
sisältää tiedon,
kuinka kauan kullakin koneella menee valmistaa tuote.
Koneiden määrä on välillä 1..105.
Jokainen taulukon arvo on kokonaisluku
välillä 1..109.
Kokonaisluku maara
on valmistettava
tuotteiden määrä. Tämä luku on välillä 1..105.
Metodin tulee palauttaa pienin mahdollinen aika, jossa saat valmistettua tuotteet koneiden avulla.
# | metodin kutsu | haluttu palautusarvo |
---|---|---|
1 | lyhinAika(new int[] {1}, 5) | 5 |
2 | lyhinAika(new int[] {1, 1, 1}, 6) | 2 |
3 | lyhinAika(new int[] {5, 1, 1}, 6) | 3 |
4 | lyhinAika(new int[] {1, 2, 3, 4}, 10) | 6 |
Asuinalueen ohi kulkevan tien laitaan ollaan rakentamassa meluestettä, jotta liikenteen aiheuttama melu vähenisi. Ajattelemme tässä tietä yksiulotteisena janana, jolla on jokin alkupiste 0. Kohdalla k
, missä k
on jokin kokonaisluku, viitataan siihen kohtaan tietä, johon päädytään kulkemalla tietä eteenpäin alkukohdasta k
metrin verran.
Alueen asukkaat ovat esittäneet toiveita meluesteestä. Nämä toiveet ovat muotoa "kohtien a
ja b
välillä meluesteen tulisi olla vähintään h
metriä korkea". Mikä on pienimmän mahdollisen sellaisen aidan pinta-ala, joka toteuttaa kaikkien asukkaiden toiveet?
Toteuta metodi
long pieninAita(long[] a, long[] b, long[] h)joka selvittää pienimmän mahdollisen aidan pinta-alan, kun asukkaiden toiveet on annettu syötteenä tulevissa taulukoissa. Taulukoiden
a
, b
ja h
pituudet ovat samat, ja yhden toiveen tiedot saadaan kolmikosta a[i], b[i], h[i]
.
Taulukoiden a
, b
ja h
pituudet ovat korkeintaan 105, ja niiden sisältämät luvut välillä 0..109. Voit olettaa, että a[i]<b[i]
.
Tarkastellaan koodipohjan mukana tulevaa esimerkkiä numero 2, jossa siis syöte on
a={0, 1, 4, 5} b={4, 3, 6, 7} h={1, 2, 3, 2}Nyt toiveita voi visualisoida seuraavalla tavalla: ja seuraavassa kuvassa on merkitty pienin nämä toiveet toteuttava aita sinisellä: tämän aidan pinta-ala on selvästi 14, joka onkin haettu vastaus.