Maahan on pudonnut omenoita, ja Uolevi aikoo poimia niitä. Tiedät jokaisesta omenasta, kuinka painava se on.

Samankaltaiset tiedostot
Esimerkiksi jos käytössä ovat kirjaimet FFII, mahdolliset nimet ovat FIFI ja IFIF. Näistä aakkosjärjestykssä ensimmäinen nimi on FIFI.

Kohdissa 2 ja 3 jos lukujen valintaan on useita vaihtoehtoja, valitaan sellaiset luvut, jotka ovat mahdollisimman lähellä listan alkua.

Datatähti 2019 loppu

Task list Submit code Submissions Messages Scoreboard View queue Edit contest

Kaulaketju. Syöte. Tuloste. Esimerkki 1. Esimerkki 2

8. Näppäimistöltä lukeminen 8.1

8. Näppäimistöltä lukeminen 8.1

Syötteen ensimmäisellä rivillä on kokonaisluku n, testien määrä (1 n 10). Tämän jälkeen jokaisella seuraavalla rivillä on kokonaisluku x (0 x 1000).

Task list Submit code Submissions Messages Scoreboard View queue Edit contest

S: siirtää listan ensimmäisen luvun viimeiseksi V: vaihtaa keskenään listan kaksi ensimmäistä lukua

Ohjelmoinnin jatkokurssi, kurssikoe

Merkkijono on palindromi, jos se säilyy samana, vaikka sen kääntää väärinpäin.

Javan perusteet. Ohjelman tehtävät: tietojen syöttö, lukeminen prosessointi, halutun informaation tulostaminen tulostus tiedon varastointi

7. Näytölle tulostaminen 7.1

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

Uolevin reitti. Kuvaus. Syöte (stdin) Tuloste (stdout) Esimerkki 1. Esimerkki 2

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

12. Näppäimistöltä lukeminen 12.1

Task list Submit code Submissions Scoreboard View queue Edit contest

Java-kielen perusteita

Ohjelmoinnin perusteet, syksy 2006

Metodien tekeminen Javalla

Sinulle on annettu bittijono, ja tehtäväsi on muuttaa jonoa niin, että jokainen bitti on 0.

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti

Tietojen syöttäminen ohjelmalle. Tietojen syöttäminen ohjelmalle Scanner-luokan avulla

5. HelloWorld-ohjelma 5.1

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Ohjelmoinnin perusteet Y Python

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

Datatähti 2019 alku. task type time limit memory limit. A Kolikot standard 1.00 s 512 MB. B Leimasin standard 1.00 s 512 MB

Tässä tehtävässä käsittelet metodeja, listoja sekä alkulukuja (englanniksi prime ).

Ohjelmoinnin perusteet, kurssikoe

// Tulostetaan double-tyyppiseen muuttujaan "hinta" tallennettu // kertalipun hinta ja vaihdetaan riviä. System.out.printf("%.1f euros.

Datatähti alkukilpailu

Java-kielen perusteet

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

// Tulostetaan double-tyyppiseen muuttujaan "hinta" tallennettu // kertalipun hinta ja vaihdetaan riviä. System.out.printf("%.1f euros.

Ohjelmointi 2 / 2010 Välikoe / 26.3

Kääntäjän virheilmoituksia

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Taulukoiden käsittely Javalla

ITKP102 Ohjelmointi 1 (6 op)

58131 Tietorakenteet ja algoritmit (syksy 2015)

Numeropelissä 3x3-ruudukko sisältää luvut 1, 2,, 9. Tehtäväsi on järjestää ruudukko näin:

17. Javan omat luokat 17.1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Toisessa kyselyssä alueella on 1 ruudussa A ja 3 ruudussa B, joten suosituin ehdokas on B.

C++ rautaisannos. Kolme tapaa sanoa, että tulostukseen käytetään standardikirjaston iostreamosassa määriteltyä, nimiavaruuden std oliota cout:

4. Luokan testaus ja käyttö olion kautta 4.1

1. Olio-ohjelmointi 1.1

ITKP102 Ohjelmointi 1 (6 op)

Mikä yhteyssuhde on?

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

12 Mallit (Templates)

Tietorakenteet (syksy 2013)

Tehtävä: FIL Tiedostopolut

Ohjelmoinnin peruskurssi Y1

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely

Sisältö Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 26.2

Interaktiivinen tarinankerronta

20. Javan omat luokat 20.1

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang

Metropolia ammattikorkeakoulu TI00AA : Ohjelmointi Kotitehtävät 3

Java-kielen perusteita

Rekursiolause. Laskennan teorian opintopiiri. Sebastian Björkqvist. 23. helmikuuta Tiivistelmä

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet, 1. välikoe

Listarakenne (ArrayList-luokka)

13. Loogiset operaatiot 13.1

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

5. HelloWorld-ohjelma 5.1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Pakkauksen kokoaminen

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Harjoitus 3 (viikko 39)

Kenguru 2017 Benjamin (6. ja 7. luokka)

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Luokat ja oliot. Ville Sundberg

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

1. Kun käyttäjä antaa nollan, niin ei tulosteta enää tuloa 2. Hyväksy käyttäjältä luku vain joltain tietyltä väliltä (esim tai )

Olio-ohjelmointi Javalla

Pedacode Pikaopas. Java-kehitysympäristön pystyttäminen

Ohjelmoinnin perusteet Y Python

Datatähti 2000: alkukilpailun ohjelmointitehtävä

International Olympiad in Informatics 2013

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

9. Periytyminen Javassa 9.1

17. Javan omat luokat 17.1

13. Loogiset operaatiot 13.1

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu

Datatähti kilpailu

Transkriptio:

Datatähti 2015 A: Omenat Aikaraja: 2 s Maahan on pudonnut omenoita, ja Uolevi aikoo poimia niitä. Tiedät jokaisesta omenasta, kuinka painava se on. Uolevi haluaa saada mahdollisimman monta omenaa, mutta hänellä on yksi lisäehto: omenoiden yhteispaino tulee olla 3:lla jaollinen. Tehtäväsi on laskea, kuinka monta omenaa Uolevi voi poimia. Syöte Syötteen ensimmäisellä rivillä on kokonaisluku n: omenoiden määrä. Seuraavalla rivillä on n kokonaislukua p 1, p 2,, p n : kunkin omenan paino. Tuloste Ohjelmasi tulee tulostaa yksi kokonaisluku: montako omenaa Uolevi pystyy poimimaan enintään. Esimerkki Syöte: 5 6 7 6 2 1 Tuloste: 4 Selitys: Yksi ratkaisu on, että Uolevi poimii kaikki omenat paitsi 7:n painoisen. Niiden yhteispaino on 15, joka on 3:lla jaollinen.

Osatehtävä 1 (17 pistettä) 1 n 20 1 100 p k Osatehtävä 2 (30 pistettä) 1 n 100 1 100 p k Osatehtävä 3 (53 pistettä) 1 n 10 5 1 p k 10 9

Datatähti 2015 B: Urkupillit Aikaraja: 2 s Eräänä sunnuntaina Uolevi meni kirkkoon, ja urut tekivät häneen suuren vaikutuksen. Uolevi pani merkille, että urkupillejä oli rivissä n kappaletta ja niiden korkeudet olivat 1, 2,, n. Lisäksi Uolevi havaitsi, että uruissa oli yhteensä k pilliparia, joissa vasemmalla oleva pilli oli korkeampi kuin oikealla oleva pilli. Kotiin palattuaan Uolevi halusi rakentaa pienoismallin kirkon uruista, mutta ei enää muistanut tarkasti niiden rakennetta. Niinpä hän päätti tyytyä pienoismalliin, joka täyttäisi yllä mainitut ehdot. Tehtäväsi on auttaa Uolevia tässä. Syöte Syötteen ainoalla rivillä on kaksi kokonaislukua n ja k. Tuloste Ohjelmasi tulee tulostaa n kokonaislukua, jotka kuvaavat urkupillien järjestyksen. Jos ratkaisuja on useita, voit tulostaa minkä tahansa niistä. Voit olettaa, että ratkaisu on aina olemassa. Esimerkki Syöte: 5 3 Tuloste: 2 1 4 5 3 Selitys: Pillipareissa (2, 1), (4, 3) ja (5, 3) vasemmalla oleva pilli on korkeampi kuin oikealla oleva pilli. Rajat 0 k n (n 1) 2

Osatehtävä 1 (12 pistettä) 1 n 5 Osatehtävä 2 (33 pistettä) 1 n 100 Osatehtävä 3 (55 pistettä) 1 n 10 5

Datatähti 2015 C: Ruudukko Aikaraja: 3 s Uolevi on ruudukon vasemmassa yläkulmassa ja kulkee ruudukon oikeaan alakulmaan. Hän voi liikkua ruudukossa kerrallaan yhden ruudun alaspäin tai oikealle. Jokaisessa ruudussa on kirjain, joista Uolevi muodostaa merkkijonon matkan aikana. Uolevi ottaa jokaisen reitin varrella olevan kirjaimen mukaan merkkijonoon. Mikä on aakkosjärjestyksessä pienin merkkijono, jonka Uolevi voi muodostaa? Syöte Syötteen ensimmäisellä rivillä on kokonaisluku n: ruudukon koko. Tämän jälkeen syötteessä on n riviä, joista jokaisella on n merkkiä. Nämä rivit kuvaavat ruudukon kirjaimet. Jokainen kirjain on välillä A..Z. Tuloste Ohjelmasi tulee tulostaa yksi merkkijono: aakkosjärjestyksessä pienin merkkijono, jonka Uolevi pystyy muodostamaan. Esimerkki Syöte: 3 AAA BAD CCB Tuloste: AAACB

Osatehtävä 1 (17 pistettä) 1 n 5 Osatehtävä 2 (42 pistettä) 1 n 100 Osatehtävä 3 (41 pistettä) 1 n 500

Datatähti 2015 D: Lukujono Aikaraja: 4 s Fibonaccin lukujono ( F n ) F 0 = 0 F1 = 1 Fn = F n 1 + F n 2, jos n 2. on erittäin tunnettu lukujono, ja se määritellään seuraavasti: Paljon vähemmälle huomiolle on jäänyt Uolevinaccin lukujono seuraavasti: ( U n ), joka määritellään U 0 = 0 U1 = 1 Un = U n/2 + U n/3 + U n/4 + U n/5 + + U n/n, jos n 2. Merkintä x tarkoittaa lukua x pyöristettynä alaspäin kokonaisluvuksi. Syöte Syötteenä annetaan yksi kokonaisluku n. Tuloste Tulosteen tulee olla luku U n. Voit olettaa, että U n on enintään 10 18. Esimerkki Syöte: 10 Tuloste: 13 Selitys: U 10 = U 5 + U 3 + U 2 + U 2 + U 1 + U 1 + U 1 + U 1 + U 1.

Osatehtävä 1 (16 pistettä) 1 n 10 3 Osatehtävä 2 (34 pistettä) 1 n 10 5 Osatehtävä 3 (50 pistettä) 1 n 10 8

Datatähti 2015 E: Pörssihai Aikaraja: 5 s Uolevi on sijoittanut rahaa erään firman osakkeisiin ja seuraa kurssin kehitystä päivittäin. Maija epäilee kuitenkin, onko touhussa järkeä. Eräänä päivänä Uolevi päätti todistaa Maijalle, että sijoitus on ollut kannattava, kunhan tarkastellaan sopivaa ajanjaksoa. Sitä varten Uolevi tarvitsee kuitenkin apuasi. Kun annettuna on osakkeen hinta n päivän aikana, tehtäväsi on etsiä joka päivälle sellainen kyseiseen päivään päättyvä ajanjakso, että hinnan keskiarvo on siinä mahdollisimman suuri. Syöte Syötteen ensimmäisellä rivillä on kokonaisluku n: päivien määrä. Tämän jälkeen syötteessä on n kokonaislukua a 1, a 2,, a n : osakkeen arvo kunakin päivänä. Tuloste Ohjelmasi tulee tulostaa n kokonaislukua: kuhunkin päivään päättyvän ajanjakson pituus, jossa osakkeen hinnan keskiarvo on korkein. Jos mahdollisuuksia on monia, tulosta mahdollisimman pitkä ajanjakso. Esimerkki Syöte: 7 1 6 4 6 2 5 5 Tuloste: 1 1 2 1 4 1 2 Selitys: Tarkastellaan esimerkiksi päivää, jolloin osakkeen arvo oli 2. Tähän päivään 1+6+4+6+2 6+4+6+2 4+6+2 6+2 päättyvät keskiarvot ovat = 3.8, = 4.5, = 4, = 4 ja 5 4 3 2 2 = 2. Näistä korkein keskiarvo saadaan valitsemalla ajanjakso 4 päivää. 1

Osatehtävä 1 (12 pistettä) 1 n 200 1 a k 10 6 Osatehtävä 2 (17 pistettä) 1 n 5000 1 a k 10 6 Osatehtävä 3 (71 pistettä) 1 n 10 6 1 a k 10 6

Datatähti 2015 F: Kartta Aikaraja: 5 s Vuosisatojen aikana merenpinta Uolevin asuinseudulla on kohonnut. Kun perinnepäivät koittivat, Uolevi pyydettiin pitämään esitelmä aiheesta. Uolevilla on käytössä korkeuskartta seudusta, ja hän haluaa pystyä näyttämään jokaiselle korkeudelle x kuvan, jossa sinisellä on merkitty alueet, joiden korkeus on enintään x 1, ja vihreällä alueet, joiden korkeus on x tai enemmän. Ongelmana on kuitenkin, että Uolevilla on käytössään vain dokumenttikamera, 40 kalvoa sekä vihreää ja sinistä läpinäkymätöntä maalia. Tehtäväsi on päättää, miten Uolevin tulisi maalata kalvot, jotta hän voi mille tahansa korkeudelle x muodostaa kalvoista oikeanlaisen kuvan. Uolevi muodostaa kalvoista kuvan valitsemalla joukon kalvoja ja pinoamalla ne johonkin järjestykseen. Tämän jälkeen jokaisessa pisteessä näkyy väri, joka on mahdollisimman korkealla pinossa olevassa kalvossa kyseisessä pisteessä. Jos pisteen kohdalla missään kalvossa ei ole väriä, kuva on virheellinen. Uolevi pinoaa kalvot tarkalleen päällekkäin eikä hän muuta niiden asentoa. Syöte Ensimmäisellä rivillä on kolme kokonaislukua: korkeuskartan korkeus sekä suurin mahdollinen korkeus h. n ja leveys m Seuraavat n riviä sisältävät korkeuskartan: kukin rivi sisältää sen rivin korkeudet ( m kokonaislukua väliltä 1 h). Tuloste Ohjelmasi tulee tulostaa ensin, miltä kukin 40 kalvosta näyttää. Jokaista kalvoa kohden tulosteessa tulee olla n riviä, joilla on m merkkiä. Jokainen rivi koostuu merkeistä S (sininen), V (vihreä) ja L (läpinäkyvä). Kalvot on numeroitu kokonaisluvuin 1, 2,, 40. Sitten ohjelman tulee tulostaa h riviä: jokaiselle korkeudelle x = 1, 2,, h jokin tapa esittää kuva kalvojen avulla. Rivin alussa on käytettävien kalvojen määrä, minkä jälkeen rivillä on kalvojen numerot järjestyksessä pinon pohjalta ylös. Samaa kalvoa saa käyttää vain kerran.

Esimerkki Syöte: 3 5 4 1 1 2 1 2 3 1 1 1 3 1 1 4 1 3 Tuloste: VVVVV VVVVV VVVVV SSLSL LSSSL SSLSL LLSLS LLLLL LLLLL LLLLL SLLLS LLLLS LLLLL LLLLL LLSLL... 1 1 2 1 2 3 1 2 3 4 1 2 3 4 Merkinnän... kohdalle kuuluu 35 mitä tahansa kalvon kuvausta (niitä ei tarvita kuvien muodostamisessa tässä syötteessä). Rajat 1 n, m 100

Osatehtävä 1 (12 pistettä) 1 h 40 Osatehtävä 2 (27 pistettä) 1 h 200 Osatehtävä 3 (15 pistettä) 1 h 1000 Osatehtävä 4 (46 pistettä) 1 h 10 4

Datatähti 2015 Tekniset ohjeet Rajat Jokaisen tehtävän aikaraja on ilmoitettu tehtävän alussa. Jokaisen tehtävän muistiraja on 128 Mt. Pinomuistia saa käyttää enintään 64 Mt. Koodin koko saa olla enintään 128 kt. Ohjelmointikielet Sallitut ohjelmointikielet ovat C++ ja Java. Huomaa, että voit joutua käyttämään alla olevia optimointeja, jotta syötteen lukeminen ja tulostus on riittävän nopeaa. C++ C++ käännetään g++ 4.8.2-kääntäjällä. Kääntäjäliput ovat -std=c++0x -O2 -Wall. C++:n cin ja cout voivat olla oletuksena liian hitaita, mutta niitä nopeuttaa huomattavasti, jos poistaa niiden synkronoinnin C:n stdio-kirjaston kanssa. Tämä tehdään lisäämällä rivi cin.sync_with_stdio(false); main-funktion alkuun: #include <iostream> using namespace std; int main() { cin.sync_with_stdio(false); } // ratkaise tehtävä tähän

Java Käytettävä Java-jakelu on OpenJDK versio 1.8.0_40 (eli siis Java 8). Nimeä kooditiedostosi Javan käytäntöjen mukaisesti, eli jos main-luokan nimi on Main niin uploadattavan tiedoston nimen tulee olla Main.java. Koodi ei saa olla missään pakkauksessa, tai muuten kääntö epäonnistuu. Syötteeseen ja tulostukseen Javan Scanner-luokka ja komento System.out.println saattavat olla liian hitaita. Ajoympäristössä on käytössäsi nopeamman syötteen ja tulostuksen mahdollistava IO-luokka, jota ei tarvitse erikseen importata (IO.class on samassa hakemistossa ohjelman kanssa). IO-luokkaa käytetään seuraavasti: public class Ratkaisu { public static void main(string[] args) { IO io = new IO(); String a = io.next(); // Lukee seuraavan välein erotellun merkkijonon. int b = io.nextint(); // Lukee seuraavan välein erotellun int-kokonaisluvun. long c = io.nextlong(); // Lukee seuraavan välein erotellun long-kokonaisluvun. double d = io.nextdouble(); // Lukee seuraavan välein erotellun double-liukuluvun. // Toimii kuten System.out.println. io.println("annoit syötteenä " + a + " " + b + " " + c + " " + d); } } io.close(); // TÄYTYY KUTSUA LOPUKSI, muuten tuloste voi jäädä kirjoittamatta