Ahoj světe!
Tak dneska jsme chytali zločince v londýnském stylu (tj. kamera na každým rohu):
http://forum.matfyz.info/viewtopic.php? ... f92679db22
Jen abych odpověděl na poslední dotaz z výše zmíněného threadu ohledně opravy časů kamer (já jsem se taky před pár dny divil, že v podstatě nejdůležitější část úlohy byla v odpovědi takhle odfláknutá:).
Ono to totiz NEJDE. Tedy ne vzdycky - napr. pokud dostanu vsechny kamery se spatnym casem, sotva to muzu nejak zjistit. Ovsem takove pripady jsou skoro vzacnejsi nez suda cisla mezi prvocisly. Ale da se rict (a uplne to same napadlo i Topfera), ze jsou takova kvanta dat (kazdych 5 min 1000000 zaznamu, a to po dobu aspon 1 dne), ze temer vzdy se nam podari odhalit vsechny kamery. Ted priblizne jak se to da resit...
Nejprve, jedina relevantni data pro nas jsou casy, ID kamer a c. pasu. Posledni 2 si jeste nahradime poradovymi cisly od 1 do 1M (vnejsi trideni -> seskupena stejna ID/cisla pasu za sebou, a to vzestupne -> v kopii tohoto souboru to budeme psat s prislusnym poradovymi cisly). Seradime podle porad. cisel lidi, jako 2. kriterium porovnani bude cas zaznamu -> seskupi se nam to do celkoveho cestovniho logu/itinerare kazdeho jednotliveho cloveka.
Ted pujdeme "po jeho stopach" a protoze je zajimave, jen kdyz se osoba presouva mezi krizovatkami, budeme si vsimat dvojic po sobe jdoucich krizovatek/kamer (a do nejakeho pole priznaku [1..1M] si znacit '?', 'T', 'F', podle toho, co jsme o kamere zjistili). Clovek muze jit od:
(1) Spravna kam. (se spravnym casem) => spatna kam. .... v takovem pripade dotycny jakoby na 10 min zmizi (pac 2. kamera ma o 5 min vetsi cas, nez by mela mit). To je dobre, ponevadz muzeme definitvne tyto 2 kamery oznacit, vime, ktera je ktera.
(2) Spatna kam. => spravna kam. ... dotycny se objevi na 2 mistech "najednou". Vime jen, ze kamery jsou opacnych typu, ale nevime ktera je ktera. Ale i to nam muzu poslouzit (budu si pamatovat takove pary a jakmile jednou jednu z nich budu mi pozdeji urcenou, urci se tim i druha).
(3) Spatna => Spatna nebo Spravna => Spravna ... dotycny jde s prodlevou 5 min (jakoby normalne). Opet nevime, ktera je ktera, ale vime, ze jsou stejneho typu. Podobne jako ve (2) si muzeme pockat, az jednu z nich budu uz mit urcenou a tim i urcit druhou.
Ty (ne)korespondujici pary si klidne muzeme pamatovat na disku jako dluhy k vyreseni, az budeme vse ostatni uz mit hotove.
Ty je vse k oprave kamer -> proste musime DOUFAT, ze mame dost info, coz jako asi mame. Mozna jste nekdo vymyslel nejake dalsi optimalizace / heuristiky, klidne se pochlubte...
Zbytek reseni uz byl zminen drive, jen v rychlosti:
Seradim podle casu (2. krit. porad. c. kamer) -> sekupeni lide, kteri jsou v danou chvili spolu na dane krizovatce.
S predpokladem, ze vsechny casu uz jsou spravne (potrebuju u muzea poznat cas C pro oznaceni spravneych podezreleych), si v nejakym poli bool who_is_podezrely[1..1M] oznackovavam postupne podezrele. Zacnu u muzea v case C, oznackuju, v case C+5 si na jednotlivych krizovatkach oznackuji pritomne komplice (pamatuju si, kde mi zacinala krizovatka, kdyz narazim na pritomneho podezreleho, oznackuju celou krizovatku lidi), v case C+10 znova atd. atd.
V case 18:00 na CANu se kouknu, je-li tam nekdo mezi podezrelymi (pozor, ne driv, ne pozdeji - podezreli by mohli z CANu odejit uz driv & lup nenechaji jen tak na zemi).
Asi takhle, Topfer rikal, ze priblizne takhle to melo asi vypadat - jsem za to rad:)