FORMAT.PAS
/ FORMAT.C
/ FORMAT.CPP
FORMAT.IN
FORMAT.OUT
Pro potřeby formátování rozumíme slovem každou souvislou posloupnost nemezerových znaků, která je na obou koncích ukončena mezerou nebo začátkem či koncem řádku. Pomocné symboly obsažené v textu jsou tedy součástí těch slov, od nichž nejsou odděleny mezerou.
Cílem formátování textu je vhodné rozložení slov na jednotlivé řádky tak, aby byl celý text zarovnán "do bloku" (tzn. k levému i pravému okraji) při zadané šířce řádku. Přitom mezery mezi slovy musí být co možná nejmenší a v textu co nejrovnoměrněji rozloženy. Tyto obecné požadavky si nyní upřesníme: Velikosti mezer mezi slovy na témže řádku (kromě posledního řádku odstavce) se mohou lišit maximálně o 1, před prvním a za posledním slovem na řádku nesmí být mezera. Pokud je na řádku pouze jedno slovo, je rozložení mezer libovolné. Na posledním řádku odstavce musí být slova oddělena právě jednou mezerou a před prvním slovem nesmí být mezera.
Splńuje-li text tyto závazné požadavky, potom kvalitu
zformátování odstavce hodnotíme trestnými body. Ohodnocení
odstavce je součtem ohodnocení jednotlivých řádků. Ohodnocení
jednoho řádku je dáno výsledkem funkce F(Width
, Chars
,
Words
, Last
), kde Width
je šířka stránky (tj. počet znaků na
řádce zformátovaného textu včetně všech mezer), Chars
je počet
nemezerových znaků na řádce, Words
je počet slov na řádce
a Last
značí, zda se ohodnocuje poslední řádek odstavce či
nikoliv.
Ohodnocovací funkce F zapsaná v programovací jazyce C vypadá následovně:
FORMAT.IN
je na prvním řádku zadána
požadovaná šířka stránky po zformátování. Na dalších řádcích se
nachází text odstavce určený ke zformátování. Můžete
předpokládat, že žádný z těchto řádků není delší než 100 znaků,
na začátku ani na konci žádného řádku není mezera a mezi
jednotlivými slovy na řádku je vždy právě jedna mezera. Vstupní
soubor nebude delší než 10 000 znaků (počítáno včetně mezer mezi
slovy).
FORMAT.OUT
zapište zadaný text odstavce
zformátovaný co nejkvalitněji podle výše uvedených zásad (tj.
s nejnižší možnou hodnotou ohodnocovací funkce).
FORMAT.IN
FORMAT.OUT
(jedno z možných řešení; symbol `_' označuje mezeru)
OKRUZNI.PAS
/ OKRUZNI.C
/ OKRUZNI.CPP
OKRUZNI.IN
OKRUZNI.OUT
Město je tvořeno křižovatkami, které jsou navzájem spojeny ulicemi. Každá ulice spojuje právě dvě křižovatky. Dvě stejné křižovatky mohou být spojeny více různými ulicemi. Křižovatkou rozumíme i místo, do kterého vede jen jedna nebo dvě ulice. Radní kladou na plánované trasy autobusových linek následujíci požadavky: Aby si turisté mohli pohodlně prohlédnout každou ulici ve městě a přitom se zbytečně neplýtvalo náklady na provoz autobusových linek, musí každou ulicí projíždět právě jedna autobusová linka. Žádná z linek nesmí projet některou z křižovatek více než jednou. Trasy linek musí být navrženy tak, aby první a poslední křižovatka na trase byla stejná - jinak by se linky provozované touto společností daly jen stěží nazývat okružní.
OKRUZNI.IN
obsahuje dvě
čísla oddělená mezerou -- počet křižovatek (N, 1<=N<=120) a
počet ulic (M). Křižovatky jsou očíslovány čísly od 1 do N.
Následujících M řádků
vstupního souboru obsahuje popis jednotlivých ulic ve městě:
Každý z těchto řádků obsahuje dvě čísla představující čísla
křižovatek, které příslušná ulice spojuje. První číslo na každém
z těchto řádků je menší než druhé z nich. Tyto řádky jsou v souboru
setříděny podle prvního čísla; v případě, že se shoduje více ulic v
prvním čísle, jsou setříděny podle druhého čísla.
Můžete předpokládat, že počet různých ulic spojujících dvě stejné
křižovatky je nejvýše 200.
OKRUZNI.OUT
obsahuje tolik řádků,
kolik má společnost provozovat autobusových linek. Každý
řádek obsahuje popis právě jedné autobusové linky. Trasa autobusové linky
je popsána jako posloupnost čísel křižovatek, kterými linka
projíždí. První a poslední číslo uvedené na řádku je tedy stejné
(linka začíná a končí na stejné křižovatce). Jednotlivá čísla
jsou na každém řádku oddělena právě jednou mezerou. Pokud nelze trasy
linek navrhnout tak, aby vyhovovaly podmínkám ze zadání úlohy,
potom výstupní soubor obsahuje jediný řádek se slovem "Nelze".
OKRUZNI.IN
OKRUZNI.OUT
OKRUZNI.IN
OKRUZNI.OUT