Diákolimpiai válogató 1998



Ritmusok -1 . feladat (? pont)
Egy vers ritmikai elemzéséhez fel kell ismerni a ritmusmintákat (daktilus, spondeus, jambus, ...). A ritmusminták hosszú és rövid szótagok speciális sorrendjéből állnak, melyet a MINTA.BE állományban találsz. Ennek minden egyes sora (legfeljebb 100) egy ritmusmintát ír le, a hosszú szótagokat kötőjel (–), a rövideket pedig pont (.) karakterrel jelölve. A ritmusmintákat a sorszámuk azonosítja.

Készíts programot (RITMUS.PAS), amely egy vers hosszú-rövid szótageloszlásához meghatározza a sorokhoz tartozó ritmusmintákat!

Bemenet:

A RITMUS.BE állomány sorai a MINTA.BE állományhoz hasonló sorokat tartalmaznak, az I. sorban annyi jel van (legfeljebb 255), ahány szótagból áll a vers I. sora.
Kimenet:
A RITMUS.KI állományba soronként a felismert ritmusminták sorszámait kell írni, egy-egy szóközzel elválasztva. Ha többféle ritmusminta is illeszthető egy sorra, akkor közülük tetszőleges megadható. Ha a bemenő állomány I. sorára nem illeszthető ritmusminta, akkor az eredmény I. sorába a NINCS szöveg kerüljön.
Példa:
 
MINTA.BE RITMUS.BE RITMUS.KI
-..
..-
-.
.-
-..-....-
-...--.
-.-..-.-
.--
1 1 2
1 4 3 vagy 3 2 3
3 3 4 4
NINCS


Strázsa - 2. feladat (? pont)
Egy iskola több napig tartó rendezvényén a tanulók folyamatos ügyeletet tartanak. A rendezvény kezdete az 1., vége az N-edik időegység. Minden tanuló megad egy ügyeleti idő-intervallumot (egy a b számpárt), amikor vállalná az ügyeletet. Az ügyeleti beosztást úgy kell elkészíteni, hogy az egymást váltó tanulók át tudják adni egymásnak a szolgálatot, azaz ha az A tanulót (a1 a2 intervallum) a B tanuló (b1 b2 intervallum) követi a szolgálatban, akkor b1<=a2 teljesüljön.

Írj programot (STRAZSA.PAS), amely kiszámítja, hogy minimálisan hány tanulóval lehet a kapuügyeletet megoldani a rendezvény teljes idejére a fent leírt feltételnek megfelelően!

Bemenet:

A STRAZSA.BE állomány első sora a rendezvény időtartamát (N időegység) tartalmazza (1<=N<=10000). Az állomány ezt követő minden sorában egy a b számpár van, egy szóközzel elválasztva (1<=a<=b<=N): egy tanuló által vállalt ügyeleti idő-intervallum. A bemeneti állomány utolsó sora a 0 0 számpárt tartalmazza.
Kimenet:
A STRAZSA.KI állományba egyetlen számot kell írni: a lehető legkevesebb tanulót igénylő beosztásban alkalmazott tanulók számát. Ha a feladatnak nincs megoldása (azaz nem lehet a rendezvény teljes időtartamára a jelentkezésekből megfelelő beosztást kialakítani), akkor az állományba 0-t kell írni.
Példa:
 
STRAZSA.BE STRAZSA.KI
10
1 4
2 3
3 7
2 5
4 9
5 10
0 0
3


Mérő - 3. feladat (? pont)
Van két kannánk, az első űrtartalma A liter, a másodiké B liter. Ki kell mérnünk N liter vizet a második kannába. Kezdetben mindkét kanna üres. A kannákkal a következő műveleteket végezhetjük:
TA az első kannát teletöltjük a csapról,
TB a második kannát teletöltjük a csapról,
UA az első kannát kiürítjük,
UB az második kannát kiürítjük,
AB az első kannából áttöltjük a benne lévő vizet a második kannába úgy, hogy ha mind belefér, akkor mind áttöltjük, egyébként annyit töltünk át, hogy a második kanna tele legyen,
BA a második kannából áttöltjük a benne lévő vizet az első kannába úgy, hogy ha mind belefér, akkor mind áttöltjük, egyébként annyit töltünk át, hogy az első kanna tele legyen.
Írj programot (MERO.PAS), amely a két kanna űrtartalma és az előállítandó N mennyiség ismeretében meghatároz egy olyan műveletsort, amelyet sorban végrehajtva a második kannában N liter víz lesz!

Bemenet:

A MERO.BE állomány első sorában az előállítandó N vízmennyiség (1<=N<=100), második sorában pedig az első és a második kanna űrtartalma, egy A B egész számpár van, egyetlen szóközzel elválasztva (1<=A, B<=100).
Kimenet:
A MERO.KI állományba a megoldás műveletsorát (soronként egy-egy műveletet) kell írni. Ha nincs megoldás, akkor az állomány első és egyetlen sora a NINCS szöveg legyen.
Példa:
 
MERO.BE MERO.KI
2
3 7
TA
AB
TA
AB
TA
AB
UB
AB


Tájékozódási verseny - 4. feladat (? pont)
A tájékozódási versenyen egy adott helyről kiindulva és ugyanide megérkezve megadott idő alatt minél több állomást fel kell keresni. Az állomásokat utak kötik össze, és ismerjük, hogy melyik hány perc alatt járható be.

Írj programot (TAJEK.PAS), amely megadja azt a rajttól a célig vezető útvonalat, amelyik az út teljesítésére szánt időtartam alatt a lehető legtöbb különböző állomást érint! Ha több ilyen is van, akkor közülük azt kell megadni, ami a legkevesebb idő alatt teljesíthető.

Bemenet:

A TAJEK.BE állomány első sorában az állomások száma (1<=N<=100), a másodikban a rajt/cél állomás sorszáma, a harmadikban a verseny teljes időtartama (0<=T<=1000) van. Ezt követően soronként egy-egy út adatai vannak: a két végén található állomás sorszáma és a kalkulált idő (pozitív egész szám) egy-egy szóközzel elválasztva.
Kimenet:
A TAJEK.KI állományba a leghosszabb megtehető útvonalat kell írni: minden egyes sora egy állomás sorszámát és elérésének idejét tartalmazza, az elérés ideje szerint növekvő sorrendben.
Példa:
 
TAJEK.BE TAJEK.KI
5
1
100
1 2 20
1 4 30
1 5 20
2 3 20
2 4 40
2 5 20
3 4 40
4 5 30
1 0
2 20
3 40
2 60
5 80
1 100


Sziget - 5. feladat (? pont)
Egy, a tengeren levő sziget sorsát nagy mértékben befolyásolja a tengerszint változása. A tengerszint emelkedése esetén a sziget területe csökken, a tengerszint csökkenése esetén pedig növekszik. A vízszint emelkedésekor az alacsonyan fekvő területeket elönti a tenger, csökkenésekor pedig a magasabban fekvő területek szárazra kerülhetnek, ha a víz le tud folyni róluk. (A víz mozgásakor minden négyzet 4 oldalszomszédját kell figyelembe venni.)

A szigetet tartalmazó területet kis négyzetekre osztjuk, megadva minden négyzeten a talaj eredeti tengerszint feletti magasságát (ez a szám negatív ott, ahol jelenleg tenger van – ilyenkor a tenger mélységét jelenti). Feltehetjük, hogy a szélső négyzetek a legnagyobb tengerszint csökkenés esetén is vízzel fedettek maradnak.

Készíts programot (SZIGET.PAS), amely a terület magasságadatai és a tengerszint változása alapján kiszámítja a sziget területét (a vízzel nem fedett négyzetek számát)!

Bemenet:

A SZIGET.BE állomány első sorában a terület mérete (N sor, M oszlop, 1<=N<=100, 1<=M<=100) és a tengerszint változások száma (1<=K<=100) van, egy szóközzel elválasztva. A következő N sor mindegyikében M egész szám van, az egyes területek eredeti tengerszint feletti magassága, szintén egy-egy szóközzel elválasztva. Az utolsó K sor egy-egy pozitív vagy negatív egész számot tartalmaz, amely a tengerszint növekedését vagy csökkenését írja le.
Kimenet:
A SZIGET.KI állomány K+1 sorába egy-egy egész számot kell írni. Az első sor a sziget területét (azaz a vízzel nem fedett négyzetek számát) tartalmazza a kiinduló állapotban. A további K sorban az egyes tengerszintváltozások utáni sziget terület értéke legyen!
Példa:
 
SZIGET.BE SZIGET.KI
8 10 3
-5 -5 -5 -5 -5 -5 -5 -5 -5 -5
-5 -5 +1 +2 +1 +1 +1 +1 -5 -5
-5 +1 +1 +9 +9 +9 +1 +1 +1 -5
-5 +1 +1 +9 +4 +4 +9 +1 +1 -5
-5 +1 +1 +9 +4 +4 +9 +1 +1 -5
-5 -5 +1 +4 +9 +9 +4 +4 +1 -5
-5 +0 +0 +1 +1 +1 +1 +1 +1 -5
-5 -5 -5 -5 -5 -5 -5 -5 -5 -5
5
8
-5
45
13
0
9
Egy lapos partú sziget, amelyen egy magas, gyűrű alakú hegygerinc zár körbe egy közepes magasságú völgyet.
(A +0 magasságú pont kezdetben még szárazföld.)
A tengerszint háromszor változik, kétszer nő, majd egyszer csökken.
5 méter növekedés elönti a partot, de a hegyekkel körülzárt terület szárazon marad.
Újabb 8 méter növekedés után a teljes sziget elmerül.
5 méter csökkenés után a hegyek már kilátszanak, de a belső völgyből nem tud lefolyni a víz.


Találka - 6. feladat (? pont)
A római birodalomban lovas futárok vitték a postát egyik helyről a másikra. A Róma-Aquincum útvonalon a kezdő és a végállomást is beleértve N fogadó épült, ahol a futárok megállhattak, egyenletes távolságra egymástól.
Az útvonalon M futár teljesít szolgálatot, egy napon belül egy irányban megtéve adott távolságot.

Készíts programot (TALALKA.PAS), amely megadja azokat a futár párokat, akik szolgálat közben valahol találkozhatnak egymással.

Bemenet:

A TALALKA.BE állomány els? az állomások N (1<=N<=1000), és a futárok M (1<= M<=1000) száma van, egyetlen szóközzel elválasztva. A következő M sorban az egyes futárok szolgálati adatai vannak: a kezdő- és a végállomásuk sorszáma, valamint a szol-gálatuk kezdő- és végideje (0 és 23 között egész számok), egy-egy szóközzel elválasztva.
Kimenet:
A TALALKA.KI állomány első sorába azon futár párok K számát kell írni, akik találkozhatnak a szolgálat teljesítése közben, a következő K sorba pedig az egyes párok sorszámait. (Ha az egyik végállomása azonos a másik kezdőállomásával, s az egyik érkezési ideje megegyezik a másik indulási idejével, akkor szolgálati időben még éppen találkozhatnak.)
Példa:
 
TALALKA.BE TALALKA.KI
100 5
1 10 5 14
5 20 7 14
22 18 13 14
6 9 12 18
9 10 18 19
2
2 3
4 5


Robot - 7. feladat (? pont)
Egy automatizált üzemben a gyártó berendezések egy nagy gépcsarnokban négyzet-rácsos elrendezésben vannak. A műszak végeztével egy robot gyűjti össze a legyártott alkatrészeket, amely a berendezések felett a rácsszerkezet által meghatározott pályán mozoghat, csak jobbra, lefelé vagy felfelé tud mozogni. Egy lépés megtételéhez 1 időegységre (másodperc) van szüksége, egyszerre tetszőleges számú alkatrészt tud szállíta-ni. A robot induláskor a rácsszerkezet bal felső sarkában van, és a jobb alsó sarokba kell eljuttatnia a legyártott alkatrészeket.

Írj programot (ROBOT.PAS), amely kiszámítja, hogy minimálisan hány időegység alatt tudja egy robot begyűjteni az összes legyártott alkatrészt!
A feladat megoldásához rendelkezésre áll az üzemcsarnok térképe, amely azt írja le, hogy a rácsszerkezet mely helyein találhatók a gyártó gépek.

Bemenet:

A ROBOT.BE állomány els? sora a rácsszerkezet méretét megadó M és N értékeket tartalmazza egy szóközzel elválasztva  (1<=M,N<=1000). M a rácsszerkezet sorainak, N pedig az oszlopainak a száma. Az állomány ezt követő soraiban a gyártó gépek sor- és oszlopkoordinátái vannak: minden sorban egy a b (1<=a<=M, 1<=b<=N) számpár, egyetlen szóközzel elválasztva. A bemeneti állományt a 0 0 számpárt tartalmazó sor zárja. A bal felső sarok koordinátái (1, 1), a jobb alsóé pedig (M, N).
Kimenet:
A feladat megoldását adó egyetlen számot a ROBOT.KI állomány első sorába kell írni.
Példa:
 
ROBOT.BE ROBOT.KI
6 5
1 3
2 1
4 1
3 3
5 3
6 5
0 0
15


Tartozások - 8. feladat (? pont)
Egy ország vállalatai közül sokan tartoznak másoknak, de a tartozást nem tudják megadni, mert mások is tartoznak nekik.
Előfordulhat például olyan eset, hogy A tartozik B-nek 1 millió forinttal, B C-nek szintén 1 millióval, s C A-nak 2 millióval. Ebben az esetben azonban elég, ha C fizet A-nak 1 millió forintot, s a maradék 1 milliós körbetartozást (mivel mindenkinek ugyan-annyi a követelése és a tartozása egymással szemben) el lehet felejteni.

Készíts programot (TARTOZ.PAS), amely a vállalatok tartozásait a lehető legjobban egyszerűsíti: a tartozások száma a lehető legkisebb legyen, s ezen belül a tartozási összegek is a lehető legkisebbé váljanak!

Bemenet:

A TARTOZ.BE állomány első sorában a vállalatok száma (1<=N<=100) van, további soraiban (legfeljebb 1000) pedig a tartozások adatai szerepelnek: ki kinek mennyivel tartozik (1<=ki<=N, 1<=kinek<=N, 0<mennyivel<=10000000), egy-egy szóközzel elválasztva. (Ugyanaz a vállalat-pár többször is szerepelhet.)
Kimenet:
A TARTOZ.KI állomány soraiba ugyanilyen formátumban kell írni az egyszerűsített tartozásokat!
Példa:
 
TARTOZ.BE TARTOZ.KI
3
1 2 20
1 3 40
2 3 20
1 2 10
3 1 10
2 1 20
1 3 40
2 3 10


Elfogó - 9. feladat (? pont)
A városi rendőrség egy körözött bűnöző elfogását tervezi, aki autóval folyamatosan közlekedik a város utcáin. Minden utca egyirányú, bármely két útkereszteződést egy irányban legfeljebb egy utca köt össze, továbbá a városban nincs zsákutca is, azaz olyan útkereszteződés, amelyből nem vezet kifelé egyirányú utca.
Ha van olyan útkereszteződés, amelyben a bűnözőnek előbb-utóbb fel tűnnie, akkor az elfogásához elegendő a rendőröket egy ilyen helyre összpontosítani.

Írj programot (ELFOGO.PAS), amely meghatározza az összes olyan útkereszteződést, ahol a bűnözőnek előbb-utóbb fel kell bukkannia, bárhonnan induljon is, feltéve, hogy folyamatosan közlekedik.

Bemenet:

A ELFOGO.BE állomány első sora az útkereszteződések N számát tartalmazza (2<=N<=200). Az útkereszteződéseket a 1,...,N természetes számokkal azonosítjuk. Az állomány második sorában az egyirányú utcák száma (M) van. Az állomány ezt követő M sora az egyirányú utcákat adja meg. Az egyes sorokban az A-ból B-be vezető utcát az A B számpár írja le, egyetlen szóközzel elválasztva (1<=A, B<=N).
Kimenet:
A ELFOGO.KI állomány egyetlen sorába az összes olyan útkereszteződés azonosító számát kell írni (egy-egy szóközzel elválasztva), amelyen a bűnözőnek előbb-utóbb fel kell bukkannia. Ha nincs ilyen útkereszteződés, akkor a sor tartalma a egyetlen 0 szám legyen.
Példa:
 
ELFOGO.BE ELFOGO.KI
6
9
1 2
2 3
3 4
4 5
1 6
2 5
6 3
6 4
5 1
1 5


Net - 10. feladat (? pont)
ByteLand SuliNet hálózata olyan gerinchálózatra épül, amelynek pontjai a városok. Minden városban elhelyeztek egy szolgáltató számítógépet, amely a régiót hivatott ellátni. Bizonyos városokat kétirányú átvitelt biztosító átviteli vonalak kötnek össze. Ha az A és B várost közvetlenül összeköti átviteli vonal, akkor azt mondjuk, hogy A és B szomszédosak a hálózatban. (A városokat az 1..N természetes számokkal azonosítjuk.)

A hálózat biztonságos működése érdekében minden szolgáltatóhoz (A városhoz) ki kell jelölni pontosan egy szomszédos másodlagos szolgáltatót (B várost) úgy, hogy ha A-hoz a B város van kijelölve másodlagosnak, akkor B-hez nem lehet A-t kijelölni. Egy város több más városnak is lehet a másodlagos szolgáltatója. Továbbá, a másodlagos szolgáltató hozzárendelésnek olyannak kell lenni, hogy legyen legalább egy olyan K város, amely a másodlagos szolgáltató kapcsolat mentén bármely másik városból elérhető. Azaz, létezzen olyan K város, hogy bármely A városhoz legyen olyan A1->A2->... ->Au sorozat, hogy A1=A, Au=K és az Ai városhoz rendelt másodlagos szolgáltató Ai+1 (i=1,...,u-1).

Írj programot (NET.PAS), amely meghatároz egy másodlagos szolgáltató hozzáren-delést, azaz minden városhoz megad pontosan egy szomszédot, amely teljesíti a fenti feltételeket.

Bemenet:

A NET.BE állomány első sorában a városok száma (3<=N<=250), második sorában a szomszédos városok M száma van. A következő M sor mindegyike szomszédos városok A B sorszám-párját tartalmazza, egyetlen szóközzel elválasztva (1<=A, B<=N).
Kimenet:
A NET.KI állomány az egyetlen sorába N számot kell írni, egy-egy szóközzel elválasztva, amely megad egy másodlagos szolgáltató hozzárendelést: az i. szám az i városhoz rendelt másodlagos szolgáltató azonosítója legyen! Ha feladatnak nincs megoldása, akkor a sor tartalma a 0 szám legyen!
Példa:
 
NET.BE NET.KI
8
10
1 2
2 3
3 4
4 5
2 4
5 6
5 2
6 7
7 8
8 6
4 7
2 3 4 5 6 7 8 6


Lefed -11. feladat (? pont)
Egész számok [a,b] intervalluma azon x egész számok halmaza, amelyekre teljesül-nek az a<=x<=b egyenlőtlenségek. Az [a,b] intervallum hossza az intervallum elemeinek száma, azaz b-a+1. Azt mondjuk, hogy egész számok intervallumainak egy H halmaza lefedi az [1,N] intervallumot, ha az intervallum minden x-eleméhez van olyan interval-lum H-ban, amelynek x eleme. Egy lefedés költsége a lefedéshez használt intervallumok hosszainak összege.

Írj programot (LEFED.PAS), amely kiszámítja, hogy adott [1,N] lefedendő intervallum és lefedéshez használható intervallumok egy H halmaza esetén mekkora a minimális lefedés költsége, ha létezik lefedés.

Bemenet:

A LEFED.BE szöveges állomány első sorában a lefedendő intervallum végpontja (1<=N<=10000), második sorában pedig a lefedéshez használható intervallumok M száma van (1<=M<=1000). Az állomány ezt követő M sorának mindegyike a lefedéshez használható [a,b] intervallumok végpontjait tartalmazza, egyetlen szóközzel elválasztva (1<=a<=b<=N).
Kimenet:
A LEFED.KI állomány egyetlen sorába a minimális lefedési költséget kell írni. Ha a feladatnak nincs megoldása, akkor ez a szám 0 legyen.
Példa:
 
LEFED.BE LEFED.KI
10
7
1 3
1 4
7 10
5 7
2 6
3 7
4 8
11


Buszjáratok - 12. feladat (? pont)
Egy közlekedési vállalat minimalizálni szeretné egyik útvonalán az induló járatok költségét. Ha sok az utas, akkor egyszerre több járatot is kell indítani, de nem feltétlenül mindegyik az első állomásról indul, s az utolsóra érkezik.
Írj programot (BUSZ.PAS), amely a buszok kapacitása, és az utazóközönség igényei ismeretében megadja, hogy
A. Hány járatot kell indítaniuk, s azok hány állomásnyi utat tesznek meg, ha a lehető legkevesebb buszt akarják indítani, s azon belül a lehető legkisebb távolságot megtenni?
B. Hány járatot kell indítaniuk, s azok hány állomásnyi utat tesznek meg, ha a lehető legkisebb távolságot akarják a buszokkal megtenni, ezen belül pedig a legkevesebb buszt használni?
Bemenet:
A BUSZ.BE állomány első sorában a buszvonalon levő megállók száma (1<=M<=100), második sorában az egy buszra maximálisan felférő emberek száma (1<=E<=100) van. Ezt követően soronként egy-egy szóközzel elválasztva szerepel, hogy honnan (melyik megállóból) hova (melyik megállóba) hány ember szeretne utazni (1<=honnan< hova<=M, hány>0).
Kimenet:
A BUSZ.KI állomány első sorába az A, a második sorába a B részfeladat eredményét kell írni. Mindkét sorban az első szám az indítandó buszok száma, a második pedig az általuk összesen megtett távolság (állomások közötti szakaszok száma) legyen!
Példa:
 
BUSZ.BE BUSZ.KI
10
6
1 10 3
1 5 3
2 10 2
8 9 3
2 17
3 14
Magyarázat:
A. Az első busz 1-ből 10-be megy, a második vagy 1-ből 9-be, vagy 2-ből 10-be.
B. Az első busz 1-ből 10-be megy, a második 1-ből 5-be, a harmadik pedig 8-ból 9-be.


Defrag - 13. feladat (? pont)
A lemez tartalmát optimalizálhatjuk úgy, hogy megszüntetjük az állományok között levő üres helyeket, amik így a diszk végére kerülnek. Az ilyen üres helyek a gyakori állományműveletek miatt keletkeznek.

Írj programot (DEFRAG.PAS), amely megmondja, hogy minimálisan hány blokkművelet (másolás a memóriába, majd a memória kiírása a diszkre) szükséges a lemezfelület "lyukmentesítéséhez" úgy, hogy az állományokon belül a blokkok sorrendje ne változzon (egy állomány részenként másolható, de ahogyan eredetileg sorrendben voltak a blokkok, a végén ugyanolyan sorrendben kell lenniük, egymás mellett).

Bemenet:

A DEFRAG.BE állomány első sorában az állományok száma (0<=N<=100), második sorában blokkok méretét megadó szám van (1<=M<=1000). Ezt követi N db sorban soronként két szám, hogy az aktuális állomány mettől meddig helyezkedik el (0<=Hely<=2000000).
Kimenet:
A DEFRAG.KI állományba írja ki, hogy minimum hány blokkművelet szükséges az optimalizációhoz.
Példa:
 
DEFRAG.BE DEFRAG.KI

100
200 500
800 900
900 1200
1500 1700
5