Oppgave: FIL File Paths norwegian BOI 2015, dag 2. Tilgjengelig minne: 256 MB. 1.05.2015 Byteasar liker å leve farlig. Han løper med saks, leverer løsninger til konkurranseproblemer uten å teste med testdata, og vil at alle filene sine skal ha nøyaktig så lange navn som operativsystemet tillater (for eksempel er dette 4095 tegn på Linux). Når Byteasar arbeider på noen andres datamaskin, så kan det hende at ikke alle filer møter hans kriterium. I dette tilfellet prøver han å introdusere symbolske lenker (symlinks), som han kan bruke til å lage nye filstier. Du skal løse følgende problem: For hver fil i filsystemet skal du avgjøre om det er mulig å indrodusere en enkel symbolsk lenke (med en forhåndsbestemt lengde), slik at man referere til filen via en filsti med lengde på nøyaktig k tegn. Hvis en fil med navn file befinner seg i en kjede med mapper dir1, dir2,..., dirj, så er den absolutte filstien for filen /dir1/dir2/.../dirj/file. Rotmappen har absolutt filsti / og enhver fil som befinner seg direkte i rotmappen har absolutt filsti /file. En symbolsk lenke er en navngitt snarvei til en mappe, som kan plassereres i enhver mappe i filsystemet. I denne oppgaven kan man ikke ha symbolske lenker til filer. Ved å bruke symbolske linker kan vi lage alternative filstier. Hvis vi for eksempel introduserer en symbolsk lenke til / med navn hello i mappen /, så ville /dir/file, /hello/dir/file og /hello/hello/dir/file alle referere til den samme filen, men ha forskjellig lengde på filstien. Som et annet eksempel kan vi lage en symbolsk lenke til / med navnet hi i mappen /dir, da kunne vi fått filstiene: /dir/file, /dir/hi/dir/file og /dir/hi/dir/hi/dir/file, som alle vil referere til samme fil. Merk at det er fult lovlig for en symbolsk lenke å referere oppover, nedover eller til siden i filsystemhierarkiet, man kan også referere tilbake til den mappen som lenken befinner seg i. I denne oppgaven er sti-komponentene./ og../ og // ikke tillatt i filstier. Input Den første linjen med input innholder tre positive heltall: n (antall mapper bortsett fra rotmappen), m (antall filer) og k (den ønskede lengden på filstien). Rotmappen har nummer 0, og alle andre mapper er nummerert fra 1 til n. Filene er nummerert fra 1 til m. Den andre linjen med input innholder lengden s på navnet til den introduserte symbolske linken (vi bryr oss ikke om navnet i seg selv, vi antar at det ikke kolliderer med noe annet på filsystemet). Etter det følger det n linjer som beskriver mappene (unntatt rotmappen) som eksisterer på filsystemet. Den i-ende linjen av disse beskriver mappen med nummer i og innholder to heltall: p i og l i. De forteller at mappe med nummer i har navn med lengde l i og foreldremappen dens (altså mappen som direkte innholder den i-ende mappen) har nummer p i. Det er garantert at p i < i. Til slutt følger m linjer som beskriver filene i filsystemet. Den j-ende av disse linjene beskriver fil nummer j, har et navn med lengde l j og befinner seg direkte i mappen p j. Alle filer og mapper vil ha navn med positiv lengde, og deres absolutte filstier vil på det meste være k tegn lange. Output Programmet ditt skal skrive m linjer, en for hver fil. Den j-ende linjen skal innholde et enkelt ord, eller NO, som svarer på følgende spørsmål: er det mulig, ved å introdusere en symbolsk lenke med lengde s å lage en filsti med nøyaktig lengde k, som referer til fil nummer j? v. 3.1 File Paths 1/2
Eksempler 2 4 22 2 0 1 1 5 2 13 2 10 1 4 0 7 NO Forklaring av eksemplene: La oss referere til den symbolske lenken som LL, mappenavnene som a og bbbbb, og filnavnene som ccccccccccccc, dddddddddd, eeee og fffffff, respektivt. Rotmappen innholder mappen a og filen fffffff; mappen a innholder mappen bbbbb og filen eeee; og til slutt innholder mappen bbbbb filene ccccccccccccc og dddddddddd. / -- a -- bbbbb -- ccccccccccccc +-- dddddddddd +-- eeee +-- fffffff Den første filen har absolutt filsti /a/bbbbb/ccccccccccccc, som allerede har den ønskede lengden, så vi behøver ikke å introdusere en symbolsk lenke. For den andre filen kan vi introdusere den symbolske lenken /a/ll -> /a, og referere til /a/ll/bbbbb/dddddddddd. For den tredje filen kan vi introdusere den symbolske lenken /a/ll -> /, og referere til /a/ll/a/ll/a/ll/a/eeee. For den fjerde filen kan vi ikke oppnå målet uansett hvor vi introduserer en symbolsk lenke. Grading I alle deloppgaver er 1 k, s 1 000 000. Subtask Begrensninger Poeng 1 n, m 500 33 2 n, m 3000 og hvis svaret for en fil er, så vil det være mulig å introdusere 33 en symbolsk lenke som bare behøver å bli traversert én gang 3 n, m 3000 34 v. 3.1 File Paths 2/2
Oppgave: HAC Hacker norwegian BOI 2015, dag 2. Tilgjengelig minne: 256 MB. 1.05.2015 Hackeren Byteaser har kvalifisert seg for årets IHO, Den Internasjonalle HackerOlympiaden. En av oppgavene i olympiaden innvolverer å konkurere mot en systemoperatør. Det er n datamaskiner nummerert fra 1 til n, koblet i en ring, altså i er koblet til i + 1 (for i = 1,..., n 1), i tillegg er datamaskinene n og 1 også koblet sammen. Konkurransen gjennomføres som et spill mellom hackeren og systemoperatøren: Byteasar og operatøren spiller alternerende trekk, Byteasar starter. Som første trekk, så velger Byteasar en datamaskin og hacker den (for eksempel ved å utnytte systemsvakheter). Som sitt første trekk, så velger operatøren en ikke-hacket datamaskin og forsvarer maskinen (for eksempel ved å installere siste sikkerhetsoppdatering) I alle sine påfølgende trekk, så velger Byteasar enten å (a) gjøre ingen ting eller (b) velge hvilken som helst datamaskin som hverken er forsvart eller hacket, samt er direkte koblet til hvilken som helst hacket datamaskin, og hacker den. I alle sine påfølgende trekk, så velger operatøren enten å (a) gjøre ingen ting eller (b) velge hvilken som helst datamaskin som hverken er hacket eller forsvart, samt er direkte koblet til hvilken som helst forsvart datamaskin, og forsvarer den. Spillet slutter så fort begge har gjort ingen ting i to påfølgende runder På starten av spillet er ingen av datamaskinene hacket eller forsvart. Hver datamaskin i har data med verdi v i. For hver hackede datamaskin i, blir Byteasar belønnet med datanes verdi v i. Byteasar er en temmelig god hacker, men har ikke peiling på algoritmer. Derfor spør han deg om å skrive et program som finner ut hans maksimale poengsum, gitt at operatøren spiller optimalt. Input Den første linjen med input er et positivt heltall n (n 2), antall datamaskiner. Den andre linjen innholder en sekvens med n heltall v 1, v 2,..., v n (1 v i 2000); tallet v i er verdien på datene lagret på datamaskin i. Output I den første og eneste linjen med output skal programmet ditt skrive et heltall: Byteasars maksimale mulige poengsum mot en optimalt spillende operatør. Eksempler 4 7 6 8 4 5 1 1 1 1 1 13 3 v. 3.2 Hacker 1/2
Forklaring av eksemplene: I det første eksemplet, så bør Byteasar sitt første trekk være å hacke datamaskin 2 (og får 6 poeng). Operatøren sitt motsvar vil være forsvare datamaskin 3. I det neste trekket kan Byteasar hacke datamaskin 1 (og får 7 poeng). Til slutt vil operatøren forsvare datamaskin 4. Grading Subtask Begrensninger Poeng 1 n 300 20 2 n 5000 20 3 n 500 000, det optimale første trekket til Byteasar vil være å hacke datamaskin 20 1 4 n 500 000 40 v. 3.2 Hacker 2/2
Oppgave: TUG Tug of War norwegian BOI 2015, dag 2. Tilgjengelig minne: 256 MB. 1.05.2015 Tautrekking er en veldig populær sport i Byteland. Reglene er enkle: to lag drar i et tau i motsatt retning av hverandre. Den årlige veldedighetskonkurransen i tautrekking skal arrangeres, og det er mange påmeldte deltagere. Du har fått oppgaven med at ting skal foregå så rettferdig som mulig. Du skal dele deltagerne inn i to lag, slik at kampen kan foregå lenge. Siden det er totalt 2n påmeldte deltagere, så vil hvert lag bestå av n deltagere. Tauet har n plasser på venstre side og n plasser på høyre side. Tautrekkingeliten i Byteland er veldig kresne: hver person har nøyaktig en plass på den venstre siden av tauet og en plass på høyre siden av tauet som han eller hun liker å bruke. Du vet også styrken til hver deltager. Organisatøren har spurt deg følgende: Gitt et heltall k, er det mulig å lage to lag, slik at hvert lag har n deltagere, hver deltager bruker en plass han eller hun liker (selvsagt kan ingen av deltagerne dele en plass), og summen av styrkene til de to laggene avviker ikke med mer enn k fra hverandre? Input Den første linjen med input innholder et positivt heltall n, antall plasser på hver side av tauet, og et heltall k 20n, den største tillatte forskjellen på lagenes styrker. For enkelhetens skyld nummerer vi deltagerne fra 1 til 2n. Hver av de påfølgende 2n linjene beskriver en deltager: disse linjene har tre positive heltall l i, r i og s i (1 l i, r i n, 1 s i 20), som forteller at deltager i har styrke s i og ønsker å bruke enten plass l i på venstre side av tauet eller plass r i på høyre side av tauet. Output På den første og eneste linjen av outputen skal programmet ditt skrive enten eller NO, avhengig om det er mulig å lage to lag som tilfredstiller kravene satt over. Eksempler 4 1 1 1 1 2 1 2 2 2 8 1 2 2 3 3 5 3 3 2 4 4 1 4 4 2 v. 3 Tug of War 1/2
2 5 1 1 1 1 2 4 2 2 1 2 1 4 NO Forklaring av eksemplene: I det første eksemplet kan vi putte deltagerene 1, 3, 6 og 7 på venstre side (som resulterer i et lag med styrke 1 + 8 + 2 + 1 = 12) og deltagerne 2, 4, 5 og 8 på høyre side (som resulterer i et lag med styke 2 + 2 + 5 + 2 = 11). Forskjellen på styrken mellom lagene er 1. I det andre eksemplet må begge spillerene med styrke 4 være på det samme laget, og den minste forskjellen på styrken mellom de to lagene blir 6. Grading Subtask Begrensninger Poeng 1 n 10 18 2 n 2000 30 3 n 30 000, s i = 1 23 4 n 30 000 29 v. 3 Tug of War 2/2