Nemzetközi Informatikai Olimpia 1996

Veszprém, Magyarország



Munkaterv - 1. Nap, 1. feladat (30 pont, időlimit: 20 mp) /tesztadatok/
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) /tesztadatok/
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) /tesztadatok/
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