KATT 2012 - uppgifter, information och regler




OBS!!! Sista inskickningen gäller (även om en tidigare version skulle ha givit mer poäng).

OBS!!! Undvik att skicka in de sista minuterna eftersom Kattis antagligen kommer att korka igen.




Uppgifter

UppgiftRättningTidsgränsMinnesgräns
Hitta talen30 % omedelbart, resten efter tävlingen4 sek64MB
Muren30 % omedelbart, resten efter tävlingen4 sek64MB
Young-diagram30 % omedelbart, resten efter tävlingen4 sek64MB
Förbjudna delordefter tävlingen4 sek64MB

Länkarna fungerar endast under tävlingstiden.

Du kan få en överblick över hur det går för andra tävlande genom att titta på resultatsidan. Omedelbart efter tävlingens slut visas där de riktiga resultaten istället.

Tävlingstid

Tävlingens start: fredag 16 mars kl. 21.00
Tävlingens slut: tisdag 20 mars kl. 24.00

Allmän info

KATT (klur- och algoritmtalangtävling) är en internet-tävling som sammantaget med den traditionella PO-finalen utgör uttagningen till de internationella olympiaderna IOI och BOI. Uppgifterna i KATT är betydligt svårare än i PO-finalen, men å andra sidan är tidspressen mindre, så man har förutsättningar att lära sig lite ny teori samt tänka ut och implementera effektiva algoritmer av den typ som krävs i de internationella tävlingarna. Syftet med att vi införde denna typ av tävling är att överbrygga glappet mellan PO och de internationella tävlingarna, vilket många upplever som enormt. Vi vill naturligtvis också sporra till en djupdykning i algoritmernas underbara värld.

Om du har frågor som inte besvaras på denna sida, kontakta Pär. Jag kommer finnas hyfsat tillgänglig på mail under tävlingstiden.

Lycka till!

/Tävlingskommitten: Jimmy Mårdell, Arash Rouhani och Pär Söderhjelm

Programmeringsmiljö

Eftersom vi använder onlinedomaren Kattis är de tillåtna språken i KATT-tävlingen begränsade till C, C++, Pascal och Java.

Observera alltså att det inte går att skicka in i andra språk som det gjorde i onlinekvalet. Anledningen är dels att det är svårt att sätta rättvisa tidsgränser om man tillåter många språk, dels att systemet med delvis öppen indata inte lämpar sig för KATT-uppgifterna. Vi beklagar att vissa inte kan använda sitt favoritspråk, men hoppas att ni försöker ändå.

Har du inget konto på Kattis, fyll i anmälan här. På samma sida kan du hitta mer information om systemet. Tänk på att kontot inte kommer att skapas ögonblickligen, så se till att göra det innan tävlingen börjar.

Poängberäkning

KATT består av fyra uppgifter (under tävlingstiden finns länkar till dessa på denna sida). Varje uppgift kan ge 10 poäng som mest. Ni som redan testat Kattis-systemet vet att poängen som där delas ut alltid är mellan 0 och 100; denna poäng kommer således att divideras med 10. Det är alltså 40 poäng som står på spel i KATT. Denna poäng kommer att adderas till poängen i PO-finalen. Lagen till IOI och BOI kommer att tas ut baserat på denna summa.

Rättning

Vi kommer använda partiell direkt feedback, d.v.s. samma princip som på uppgifterna 3-7 i onlinekvalet. När ett program skickas in kommer det att köras inte bara mot exempelindatan utan även mot en på förhand angiven del av den riktiga testdatan, troligen 30 %. Du får alltså omedelbart veta om du har rätt eller fel på denna del (men ingen mer detaljerad information och ingen tillgång till indatan). Du kan förbättra din lösning och skicka in så många gånger du vill. Full poäng på denna del av testdatan, vilket demonstrerar korrekthet men inte nödvändigtvis en effektiv algoritm, är en förutsättning för att programmet ska få några poäng alls samt att resten av rättningen genomförs. I varje uppgift kommer det vara angivet vilka gränser för storleken på indata som programmet ska klara för att kamma hem dessa korrekthetspoäng.

Observera att till skillnad från onlinekvalet och förra årets KATT så finns det ingen uppgift som ger full feedback. I samtliga fall är det alltså rekommenderat att utföra egna tester för att vara säker på att programmet är korrekt och tillräckligt effektivt.

Viktigt om tidsgränser: Varje uppgift har en tidsgräns (som anges på denna sida under tävlingstiden). Denna maxtid är alltså den som gäller på den dator där Kattis kör, vilket råkar vara en rätt gammal dator (detta är sista året vi använder den). Räkna med att era program kanske är 5-10 gånger långsammare på Kattis än på era egna datorer. Om ni vill prestandatesta era lösningar på Kattis kan ni göra det genom att fejka stora indata, och se vad exekveringstiden blir. Eftersom inläsning m.m. tar lite extra tid med Java så ges en sekund extra för Java-lösningar. I övrigt är skillnaderna i exekveringstid mellan C++ och Java så liten för exempellösningarna att gränserna har satts lika.

Tillåtna hjälpmedel

Det är inte tillåtet att samarbeta eller ens diskutera uppgifterna med någon annan när ni löser KATT-uppgifterna. Självklart får man inte heller be om hjälp "anonymt" på nätet. Det är dock tillåtet att använda sig av material som redan ligger på internet, t.ex. om ni behöver kolla upp pseudokod eller dylikt för någon generell algoritm (t ex Programmeringsolympiadens träningssida.). All kod som skickas in måste dock vara skriven av er själva. Om det uppdagas att någon brutit mot dessa regler kommer den personen få 0 poäng.

Inläsning

Viktigt om inläsningen: Om du läser in stora mängder indata (vilket du gör i en av KATT-uppgifterna) är det viktigt att du gör detta så effektivt som möjligt så att inte inläsningen äter upp en stor del av din exekveringstid. I synnerhet:

Observera att programmet ska läsa från standard input och skriva till standard output, samt att programmet inte får skriva ut någonting mer (t.ex. debugutskrifter) än det som anges i uppgiften. Däremot ignoreras extra whitespace.

Vi ger här ett exempel på hur man kan läsa in följande indata:
4 6
3.22 Text

C/C++ (rekommenderas)

   #include <stdio.h>
   ...
   int a1, a2;
   char word[100];
   double d;
   scanf("%d %d", &a1, &a2);
   scanf("%lf %s", &d, word);

Java (rekommenderas)

OBS! Du måste klistra in följande klass i din källkodsfil: kattio.java
Notera att även utskriften påverkas och att du måste stänga.

   import java.util.*;
   import java.io.*;
   ...
   Kattio io = new Kattio(System.in, System.out);
   int a1=io.getInt(), a2=io.getInt();
   double d=io.getDouble();
   String word=io.getWord();
   ...
   io.println("blabla")
   io.close()

C++ (rekommenderas ej)

   #include <iostream>
   using namespace std;
   ...
   int a1, a2;
   char word[100];
   double d;
   cin >> a1 >> a2;
   cin >> d >> word;

Java (J2SE, rekommenderas ej)

   import java.util.Scanner;
   ...
   Scanner sc = new Scanner(System.in);
   int a1=sc.nextInt(), a2=sc.nextInt();
   double d=sc.nextDouble();
   String word=sc.next();