1 / 37

4. tekmovanje IJS v znanju računalništva

4. tekmovanje IJS v znanju računalništva. Naloge in rešitve Janez Brank 28. marca 2009. 1.1 Kolikokrat najmanjši. Dano je zaporedje števil Kolikokrat se v njem pojavi najmanjše število? Primer: 10, 5, 8, 7, 5, 5, 20, 7, 8, 8, 8, 6 Rezultat: 3 (ker se 5 pojavi trikrat)

bazyli
Download Presentation

4. tekmovanje IJS v znanju računalništva

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 4. tekmovanje IJS v znanju računalništva Naloge in rešitveJanez Brank28. marca 2009

  2. 1.1 Kolikokrat najmanjši • Dano je zaporedje števil • Kolikokrat se v njem pojavi najmanjše število? • Primer: 10, 5, 8, 7, 5, 5, 20, 7, 8, 8, 8, 6 • Rezultat: 3 (ker se 5 pojavi trikrat) • Napiši program, ki prebere zaporedje in izpiše število pojavitev najmanjšega števila.

  3. 1.1 Kolikokrat najmanjši • Berimo števila eno po eno • V neki spremenljivki hranimo najmanjše število doslej (recimo m) • V drugi spremenljivki pa število pojavitev m-ja • Če je naslednje število < m, postane novi m (in števec postavimo na 1) • Sicer, če je naslednje število = m, povečamo števec za 1

  4. 1.2 Označevanje kovancev • Izpiši 20 milijonov različnih 5-mestnih nizov, v katerih nastopajo le znaki 0123456789ABCDEFGHJKMNPRTVWXYZ • Možnih je veliko različnih rešitev • Npr. 5 gnezdenih zank od 0 do 29 • V najbolj notranji zanki sestavimo iz vseh petih števcev naslednji niz in ga izpišemo • V neki spremenljivki štejmo izpisane nize, če jih je že 20 mio, ne izpisujemo več

  5. 1.3 Citati • Dano je zaporedje številk strani: • 2 5 6 8 11 28 29 30 31 67 • Če se pojavlja več zaporednih številk, jih hočemo zapisati z vezajem • Vmes pa vejice • 2, 5-6, 8, 11, 28-31, 67

  6. 1.3 Citati • V spremenljivki si zapomnimo začetek in konec trenutne skupine več zaporednih številk (npr. 28, 29, 30, 31) • Ko preberemo naslednjo številko, pogledamo, ali nadaljuje to skupino ali začenja novo skupino • Če začenja novo, staro skupino izpišemo • Če sta začetek in konec skupine enaka, izpišemo to številko strani samo po sebi • Sicer pa začetek in konec, vmes pa vezaj • V spremenljivki si zapomnimo, ali smo že kaj izpisali, tako da lahko pred vsako skupino razen prve postavimo še vejico in presledek

  7. 1.4 Smrkci • Imamo kvadrat 256 × 256 enot • Osemkrat ga razpolovimo • Po vsaki razpolovitvi obdržimo S, J, Z ali V polovico • Kakšne so koordinate ostanka po vseh osmih razpolavljanjih?

  8. 1.4 Smrkci • Rešitev: • Koordinate hranimo v spremenljivkah, npr. xMin, xMax, yMin, yMax • V vsakem koraku eno od njih spremenimo • Npr. če obdržimo severno polovico:yMax := (yMin + yMax) / 2 • Če obdržimo vzhodno polovico:xMin := (xMin + xMax) / 2 • Ipd.

  9. 1.5 Železnica • Imamo dva optična senzorja, ki zaznata, ali je nad njima vagon ali ne • Razmik med senzorjema je manjši kot med vagoni • Vagoni lahko prihajajo levo ali desno(tir pa je en sam) • Sistem te pokliče ob spremembi stanja senzorja • Štej vagone v vsaki smeri vožnje

  10. 1.5 Železnica • Rešitev: • V neki spremenljivki si zapomnimo dosedanje stanje senzorjev • Če sta bila prej oba žarka neprekinjena in je zdaj eden prekinjen, vemo, da je prišel nov vagon • Če je zdaj prekinjen desni žarek, prihaja vagon z desne in se pelje proti levi, sicer pa je ravno obratno • V še dveh globalnih spremenljivkah imamo števca vagonov (posebej za leve in za desne), ki ju povečamo, ko se pojavi nov vagon

  11. 2.1 Soglasniški podnizi • Dan je seznam besed • Zanima nas, katera vsebuje najdaljši strnjeni soglasniški podniz • strjenka, besedna, skrbstvo, pristno

  12. 2.1 Soglasniški podnizi • Besede obdelujmo eno za drugo • V spremenljivki hranimo najboljšo dosedanjo besedo (in dolžino njenega najdaljšega soglasniškega podniza) • Za trenutno besedo pogledamo, kako dolg je njen najdaljši soglasniški podniz • Če je boljša od dosedanje najboljše, si jo zapomnimo • Kako ugotoviti dolžino najdaljšega soglasniškega podniza? • Postavimo nek števec na 0 • Gremo po črkah besede • Pri soglasniku povečamo števec za 1 • Pri samoglasniku ga postavimo na 0 • Zapomnimo si največjo vrednost števca. strjenka012340120

  13. 2.2 Kje sem že to posnel? • Imamo seznamtočk, posnetih z GPSom: (ti, xi, yi) • In seznam slik, za vsako je tudi znan čas • Oba seznama sta urejena po času • Radi bi vsaki sliki pripisali koordinate tiste točke, ki ji je po času najbližja

  14. 2.2 Kje sem že to posnel? • V spremenljivkah hranimo časa (t1 in t2) in koordinati dveh zaporednih točk • Naj bo t čas trenutne slike • Če je t1 ≤ t < t2, pripišimo tej sliki koordinate ene od obeh točk in se pomaknimo na naslednjo sliko • Sicer se pomaknimo naprej po zaporedju točk (preberimo naslednjo točko, ipd.) • Posebej moramo paziti še na slike, ki so po času pred prvo ali za zadnjo točko

  15. 2.3 Avtocesta • Tovornjaki peljejo mimo dveh postaj na avtocesti: • Začetna postaja dodeli tovornjaku zaporedno številko (1, 2, 3, …), on si jo zapomni • Končni postaji tovornjak sporoči svojo številko(ki jo je dobil od začetne postaje) • Sistem nas pokliče v obeh primerihin nam sporoči številko tovornjaka • Zanima nas, kateri tovornjaki so pot prevozili prehitro • Varčevati moramo s časom in pomnilnikom

  16. 2.3 Avtocesta • Imejmo seznam parov (številka tovornjaka, čas prevoza prve postaje) • Urejeni so po zaporedni številki, kar hkrati pomeni tudi po času • Ko pride mimo prve postaje, dodamo nov zapis na konec • Sproti brišemo z začetka seznama stare zapise (take, ki gotovo niso vozili prehitro) • Ko pride tovornjak T mimo druge postaje, pogledamo zapis na začetku seznama; če ima večjo številko kot T, potem T-ja ni več v seznamu in ni vozil prehitro, sicer pa je • Če je pomnilnika premalo, lahko najstarejše zapise brišemo tudi, če še niso prestari • Ampak potem lahko kakšnega prehitrega voznika spregledamo

  17. 2.4 UTF-5 • 21-bitno številko znaka v standardu Unicode lahko takole razbijemo na več 5-bitnih: • Vrinimo na levi ničle, da bo število bitov večkratnik 4 • Razbijemo na četverice bitov • Vsaki četverici vrinemo na začetku 0, razen zadnji, ki dobi 1 • Primer: 1 1100 0100 0111  00001 01110 00100 10111 • Po neki liniji prihajajo takšne peterice, naš podprogram jih sprejema • Ko se jih nabere za cel znak, ga moramo sporočiti naprej

  18. 2.4 UTF-5 • Doslej prebrani del znaka hranimo v neki globalni spremenljivkix • Ko pride nova peterica, zamaknemox za štiri bite v levo in v spodnje štiri bite skopiramo istoležne bite nove peterice • Če ima nova peterica najvišji bit prižgan, znak izpišemo in postavimo x spet na 0

  19. 2.5 Break considered harmful • Mislimo si preprost programski jezik, ki podpira med drugim stavke while, if/else, continue, break • Radi bi se znebili stavka break • Opiši postopek, ki predela dani program tako, da bo deloval enako, ne bo pa vseboval breaka

  20. 2.5 Break considered harmful • Zanke obdelujmo od notranjih proti zunanjim • Namesto break lahko uporabimo continue • Preprečiti pa moramo, da bi se zanka nadaljevala z naslednjo iteracijo • Na primer: iz while (Pogoj) Staveknaredimo { B = false; while (! B && Pogoj) Stavek' } • Pri tem smo Stavek' dobili iz Stavek tako, da smo vsak break spremenili v { B = true; continue; } • Spremenljivka B ne sme biti ena sama za vse zanke, pač pa po ena za vsak nivo gnezdenja

  21. 3.1 Undo • Dani sta operaciji WRITE(s) in UNDO(n), pri čemer undo razveljavi tudi prejšnje razveljavitvene ukaze • Primer: • WRITE(danes); WRITE(je); UNDO(1); WRITE(lep); UNDO(2); WRITE(dan)  danesjedan • Preberi dolgo zaporedje takih operacij in izpiši končni rezultat

  22. 3.1 Undo • Učinkovita rešitev je npr. ta, da pregledamo zaporedje od konca proti začetku • Ko vidimo UNDO(n), preskočimo prejšnjih n ukazov • Pri vsakem označimo, ali smo ga preskočili ali ne • Na koncu izpišemo nize iz nepreskočenih ukazov WRITE(…)

  23. 3.2 Žaba in lokvanji • Dano je zaporedje lokvanjev 1..nv ravni vrsti, v enakomernih presledkih • Po njih skače žaba • Včasih se lokvanj, s katerega se odrine žaba, potopi • Kdaj je žaba prvič na takem lokvanju, da k enot levo in desno od njega ni nobenega drugega lokvanja?

  24. 3.2 Žaba in lokvanji • Naivna rešitev: imejmo tabelo potopljen[1..n], v vsakem koraku poglejmo k sosednjih v vsaki smeri, če so vsi potopljeni • Bolj učinkovito: za vsak lokvanj i vzdržujmo številki najbližjega nepotopljenega v vsaki smeri (recimo L[i] in D[i]) • Ko se i potopi, popravimo:D[L[i]] := D[i];L[D[i]] := L[i] • Posebej moramo seveda paziti na začetku/koncu zaporedja ali pa postaviti stražarje

  25. 3.3 Otoki • Dan je zemljevid, predstavljen s črno-belo karirasto mrežo (pike = otoki, # = kopno) • Zanima nas največja globina gnezdenja otokov .................................................... ............................#######........######... ........#############.......########.....###....###. .......#####..###.######.....#########...##..#...##. ......####............######..####..###..##....###.. ....#####..########..######.....#######..########... ....#####..#.....##..#####..........###..########... .####.....##.###..#.....#####..#.##.###....###..###. ...####...#..#.#..##..#################......#####.. ..###....##.####..##..................###.....####.. ....##..##..###...#....########...##..#####.....##.. ....#..###......###....##.###.#######.######...##... ..###.#############..###########..##..######..##.... ..#...#######...########..............####.......... ..#.......................#################......... ..###########################....................... ....................................................

  26. 3.3 Otoki • Rešitev: barvanje (npr. z iskanjem v širino) • Dodaj začetno polje v vrsto in ga pobarvaj v ciljno barvo • Dokler vrsta ni prazna: • Vzemi polje z začetka vrste, recimo mu p • Tiste p-jeve sosede, ki so primernega tipa (vodni/kopni) in jih še nismo pobarvali, pobarvaj v ciljno barvo in dodaj v vrsto. • Pobarvajmo vsa vodna polja, dosegljiva z zunanjega roba, z barvo 0 (to je morje) • Pobarvajmo z barvo 1 vsa kopna polja, dosegljiva s polj barve 0 • Nato z barvo 2 vsa vodna polja, dosegljiva s polj barve 1 • Nato z barvo 3 vsa kopna polja, dosegljiva s polj barve 2 • Ipd.

  27. 3.4 Strupi • Dani so strupi 1..n (n ≤ 15) • Nekatere od njih ima pacient že v telesu • Nekatere kombinacije strupov povzročijo takojšnjo smrt • Nekatere kombinacije strupov se med seboj izničijo in izginejo iz telesa • Radi bi postopoma dodajali v telo strupe tako, da bi se sčasoma vsi izničili med sabo, ne da bi pacient med tem kdaj umrl

  28. 3.4 Strupi • To je v bistvu iskanje najkrajših poti v grafu • Za vsako možno kombinacijo strupov je ena točka • Npr. z iskanjem v širino: • Dodaj začetno kombinacijo strupov v vrsto • Dokler vrsta ni prazna: • Poberi kombinacijo z začetka vrste, npr. A • Za vsak strup s od 1 do n: • Če vsebuje A {s} kakšno smrtonosno kombinacijo then continue • Pobriši iz A  {s} strupe vseh tistih kombinacij, ki so vsebovane v njem in se izničijo. • Dobimo neko novo kombinacijo B. • Če je še nismo nikoli dodali v vrsto, jo dodajmo zdaj in si zapomnimo dolžino poti do nje

  29. 3.5 EPS • Dan je majhen nabor ukazov za obdelavo podatkov na skladu • Nimamo pa spremenljivk, zank ipd.; imamo pa pogojni skok • Napiši program, ki obrne vrhnjih n elementov sklada.

  30. 3.5 EPS • Glavni izziv je, kako imeti ves čas pri roki na vrhu sklada tisto, kar tisti hip potrebujemo, ostale stvari pa odmakniti tako, da nam niso v napoto, vendar pa da bomo obenem še vseeno znali spet priti do njih, ko jih bomo potrebovali • Možnih je več rešitev, tale je razmeroma preprosta:

  31. Robot v labirintu (tekmovanje programov)

  32. Opis naloge • Karirasta mreža, nekatera polja so prosta, druga zazidana • Na prostem polju lahko stoji kocka • Po mreži se giblje robot • Kocke ne loči od zidu • Kocke lahko pobira in odlaga (na prosta polja) • Vidi le pod kotom 45 stopinj in omejeno daleč • Iščemo izhod iz labirinta • Možne poteze: naprej, levo, desno, u-obrat, poberi, odloži.

  33. Možna rešitev • Obnašanje robota opišimo na dveh ravneh: • Na katero polje hoče robot priti? • Kako naj pride do tja? • Na katero polje hočemo priti? • Če vemo za kakšno izhodno polje, pojdimo tja • Sicer, če vemo za kakšno polje, s katerega bi lahko videli kakšen del labirinta, ki ga še nismo videli, pojdimo tja • Sicer, če vemo za kakšno polje, ki je ali kocka ali zid, ne vemo pa, kaj od tega dvojega je, pojdimo tja in ga skušajmo pobrati (da bomo videli, ali je kocka ali zid) • Če nič od tega ne gre, pomeni, da smo zazidani in ne moremo ven (v naših testnih primerih tega ni bilo)

  34. Možna rešitev • Kako priti do želenega ciljnega polja? • Kot problem najkrajše poti po grafu (graf = že znani del labirinta) • Korak od enega polja je lahko sestavljen iz 1 ali več potez robota • Če nam je v napoto kocka, moramo mogoče narediti kaj takega: poberi, naprej, u-obrat, odloži, u-obrat

  35. Robot v labirintu Rezultati

  36. Izvedba tekmovanja Prejeli smo 3 rešitve 1 v pascalu, 2 v C++ Ocenjevanje: 31 labirintov Ocena tekmovalca pri posameznem labirintu = (cena najboljšega zaporedja potez)/(cena njegovega zaporedja potez) Če robot ni prišel iz labirinta, ima pri njem oceno 0 Na koncu seštejemo ocene po vseh 31 labirintih

  37. Rezultati

More Related