Nemzetközi Informatikai Olimpia 1996

Veszprém, Magyarország



Munkaterv - 1. Nap, 1. feladat (30 pont, idõlimit: 20 mp)
Egy gyárban minden munkadarabon két mûveletet kell végezni: elõször az “A", aztán a “B" mûveletet. Mindkét mûvelethez adott bizonyos számú gép. A fenti ábrán a munkafolyamat látható: egy “A" típusú gép kivesz egy munkadarabot az input konténerbõl, elvégzi rajta az “A" mûveletet, majd a köztes konténerbe helyezi. Egy “B" típusú gép kivesz egy munkadarabot a köztes konténerbõl, elvégzi rajta a “B" mûveletet, majd az output konténerbe helyezi. A gépek egymástól függetlenül, egyidejûleg mûködhetnek; a konténerek befogadóképessége korlátlan. A gépek teljesítménye különbözõ, de egy adott gép mindig ugyanannyi idõ alatt végzi el az adott mûveletet.

Feladat:

Add meg a legkorábbi idõpontot, amikorra az “A" mûvelet mind az N munkadarabon végrehajtható, feltéve, hogy a munka kezdési idõpontja 0 (A részfeladat - Subtask A)! Számítsd ki azt a legrövidebb idõtartamot is, amely ahhoz szükséges, hogy az N munkadarabon mindkét mûveletet elvégezzük (B részfeladat - Subtask B)!
Bemenet:
Az INPUT.TXT fájl pozitív egész számokat tartalmaz, öt sorban. Az elsõ sor a munkadarabok száma (N, 1<=N<=1000). A második sor az “A" típusú gépek M1 száma (1<=M1<=30). A harmadik sorban M1 darab egész szám van. Minden “A" típusú géphez egy szám tartozik, amely megadja, hogy azon a gépen mennyi ideig tart az “A" mûvelet. A negyedik és az ötödik sor a “B" típusú gépek M2 számát (1<=M2<=30) és a gépekhez tartozó mûveletvégzési idõtartamokat tartalmazza. A mûveletekhez szükséges idõt idõegységekben mérjük. Az idõtartam magába foglalja a munkadarab mozgatását is (a mûvelet elõtt a konténerbõl a gépbe és a mûvelet után a gépbõl a másik konténerbe). Minden mûveletvégzési idõ legalább 1 és legfeljebb 20.
Kimenet:
A program az eredményt, amely két sorból áll, az OUTPUT.TXT nevû fájlba kell írja. Az elsõ sor egy pozitív egész számot, az A részfeladat eredményét, a második pedig a B részfeladatét tartalmazza.
Példa:
 
INPUT.TXT OUTPUT.TXT
5
2
1 1
3
3 1 4
3
5


Iskolahálózat - 1. Nap, 2. feladat (40 pont, idõlimit: 20 mp)
Néhány iskola számítógépes hálózatba van kötve. Az iskolák a szabadon terjeszthetõ programok elosztására megállapodást kötöttek: minden
iskola egy listát vezet azokról az iskolákról (“címzett iskolákról"), amelyek számára a programokat továbbküldi. Megjegyzés: ha B iskola
szerepel az A iskola terjesztési listáján, akkor A nem feltétlenül szerepel B terjesztési listáján.

Feladat:

Írj egy programot, amely meghatározza azt a legkisebb számot, ahány iskolához egy új programot el kell juttatni ahhoz, hogy - a megállapodás alapján, a hálózaton keresztül terjesztve - végül minden iskolába eljusson (A részfeladat - Subtask A). További feladat annak biztosítása, hogy az új programot bármely iskolába eljuttatva az a terjesztési listákon keresztül az összes többi iskolába megérkezzék. Ehhez szükség lehet a terjesztési listák bõvítésére. Számítsd ki, hogy minimálisan hány alkalommal kell bõvítést végeznünk ahhoz, hogy utána bármely iskolát kiválasztva a program minden iskolába eljusson (B részfeladat - Subtask B)! Egy bõvítés alatt azt értjük, hogy egy iskola terjesztési listájába felveszünk egy ott nem szereplõ iskolát.
Bemenet:
Az INPUT.TXT nevû fájl elsõ sora egy egész számot (N), a hálózatba kapcsolt iskolák számát tartalmazza (2<=N<=100). Az iskolákat az elsõ N pozitív egész számmal azonosítjuk. A következõ N sor mindegyike egy-egy terjesztési listát ír le. Az i+1-edik sor az i-edik iskola terjesztési listáján szereplõ iskolák azonosítóit tartalmazza. Minden lista végén egy 0 szám áll. Az üres lista csak egy 0 számból áll.
Kimenet:
A program az eredményt, amely két sorból áll, az OUTPUT.TXT nevû fájlba kell írja. Az elsõ sor egy pozitív egész számot: az A részfeladat eredményét, a második pedig a B részfeladatét tartalmazza.
Példa:
 
INPUT.TXT OUTPUT.TXT
5
2 4 3 0
4 5 0
0
0
1 0
1
2


Egy játék - 1. Nap, 3. feladat (30 pont, idõlimit: 20 mp)
Adott az alábbi kétszemélyes játék. A játéktábla pozitív egész számok sorozata. A két játékos felváltva lép. Egy lépés azt jelenti, hogy a játékos sorozat bal vagy jobb végérõl kiválaszt egy számot. A kiválasztott számot törlik a tábláról. A játék akkor ér véget, ha a számok elfogytak. Az elsõ játékos nyer, ha az általa választott számok összege legalább annyi, mint a második játékos által választottak összege. A második játékos a lehetõ legjobban játszik. A játékot az elsõ játékos kezdi.

Ha kezdetben a táblán levõ számok száma páros, akkor az elsõ játékosnak van nyerõ stratégiája.

Feladat:

Írj egy programot, amely az elsõ játékos szerepét játssza és megnyeri játékot! A második játékos lépéseit egy már adott számítógépes program szolgáltatja. A két játékos a rendelkezésedre bocsátott Play modul három eljárásán keresztül kommunikál egymással. Ezek az eljárások a StartGame, a MyMove és a YourMove. Az elsõ játékos a játszmát a paraméter nélküli StartGame eljárás végrehajtásával indítja. Ha az elsõ játékos a bal oldalról választ számot, akkor a MyMove('L') eljárást hívja. Hasonlóképpen a MyMove('R') hívással közli a második játékossal, hogy a jobb oldalról választott. A második játékos (tehát a gép) azonnal lép. Az elsõ játékos a lépést a YourMove(C) utasítással tudhatja meg, ahol C egy karakter típusú változó. (C/C++ nyelven YourMove(&C)). A C változó értéke 'L' vagy 'R' lesz attól függõen, hogy a második játékos a bal vagy a jobb oldalról választott.
Bemenet:
Az INPUT.TXT fájl elsõ sora a kezdõtábla N méretét (a “számok számát") tartalmazza. N páros és 2<=N<=100. A fájl maradék N sora egy-egy számot tartalmaz. Ezeket sorban beolvasva a táblán szereplõ számokat kapjuk balról jobbra haladva. A táblán 200-nál nagyobb szám nem szerepel.
Kimenet:
Ha a játék véget ért, akkor a programod írja ki a végeredményt az OUTPUT.TXT fájlba! A fájl elsõ sorában két szám legyen! Az elsõ szám az elsõ játékos által választott számok összegével, a második szám a második játékos által választott számok összegével egyezzen meg! A programodnak a játékot le kell játszania és az output a lejátszott játék eredményét kell tartalmazza.
Példa:
 
INPUT.TXT OUTPUT.TXT
6
4
7
2
9
5
2
15 14