CSES - Tekniset ohjeet

Tehtävän ratkaiseminen

Jokaisessa tehtävässä on tarkoitus laatia ohjelma, joka lukee syötteen standardisyötteestä ja kirjoittaa tulosteen standarditulosteeseen. CSES tarkistaa automaattisesti ohjelman toimivuuden testaamalla sitä joukolla syötteitä.

Ohjelma ajetaan eristetyssä ympäristössä, eli esimerkiksi väliaikaistiedostojen tai verkkoyhteyden käyttö ei ole mahdollista. Ohjelma lopetetaan, mikäli se ylittää tehtävän aika- tai muistirajan.

Tehtävän testiaineisto ja ohjelman antamat tulokset on mahdollista nähdä ohjelman lähettämisen jälkeen. Ratkaisun tulisi kuitenkin olla sellainen, että siihen olisi ollut mahdollista päätyä pelkän tehtävänannon perusteella.

Virhetilanteet

Tarkastettuaan lähettämäsi koodin, CSES kertoo, hyväksyttiinkö ratkaisu. Mikäli ratkaisua ei hyväksytty, ilmoitetaan myös syy hylkäämiselle. Syy on aina yksi seuraavista:

COMPILE ERROR: Ohjelman kääntäminen ei onnistunut. Lisätiedoissa näet kääntäjän virheilmoituksen.

OUTPUT LIMIT EXCEEDED: Ohjelma tuotti liikaa tulostetta.

TIME LIMIT EXCEEDED: Ohjelman suoritus kesti liian kauan.

RUNTIME ERROR: Ohjelma palautti nollasta poikkeavan palautusarvon (exit code). Tämä tulee esimerkiksi, jos muisti loppuu kesken tai koodi heittää käsittelemättömän poikkeuksen.

WRONG ANSWER: Ohjelma tuotti väärän vastauksen.

Virhe ilmoitetaan ensimmäisestä testitapauksesta, jossa ohjelma toimi väärin. Mikäli tässä testitapauksessa ohjelma tuottaa useamman virheen, niistä näytetään edellisen listan mukaan ensimmäinen.

Ohjelmointikielet

Sallitut ohjelmointikielet ovat kaikki CSES:n tukemat ohjelmointikielet, eli tällä hetkellä C++, Java, Python (2 ja 3), Haskell ja Assembly. Jokainen kurssin tehtävä on mahdollista ratkaista ainakin C++:lla ja Javalla. Huomaa, että voit kuitenkin joutua käyttämään alla olevia optimointeja syötteen ja tulosteen käsittelyyn. Joidenkin tehtävien ratkaisu voi olla huomattavasti vaikeampaa muilla kielillä kuin C++:lla ja Javalla.

C++

C++ käännetään g++ 4.8.4-kääntäjällä. Kääntäjäliput ovat -std=c++0x -O2 -Wall.

C++:n cin ja cout voivat olla oletuksena liian hitaita, mutta niitä nopeuttaa huomattavasti, jos poistaa niiden synkronoinnin C:n stdio-kirjaston kanssa. Tämä tehdään lisäämällä rivi

cin.sync_with_stdio(false);

main-funktion alkuun:

#include <iostream>

using namespace std;

int main() {
	cin.sync_with_stdio(false);
	
	// ratkaise tehtävä tähän
}

Java

Käytettävä Java-jakelu on OpenJDK versio 1.8.0_101 (eli siis Java 8).

Nimeä kooditiedostosi Javan käytäntöjen mukaisesti, eli jos main-luokan nimi on Main niin uploadattavan tiedoston nimen tulee olla Main.java. Koodi ei saa olla missään pakkauksessa, tai muuten kääntö epäonnistuu.

Syötteeseen ja tulostukseen Javan Scanner-luokka ja komento System.out.println saattavat olla liian hitaita. Ajoympäristössä on käytössäsi nopeamman syötteen ja tulostuksen mahdollistava IO-luokka, jota ei tarvitse erikseen importata (IO.class on samassa hakemistossa ohjelman kanssa). IO-luokkaa käytetään seuraavasti:

public class Ratkaisu {
public static void main(String[] args) {
	IO io = new IO();
	
	String a = io.next(); // Lukee seuraavan välein erotellun merkkijonon.
	int b = io.nextInt(); // Lukee seuraavan välein erotellun int-kokonaisluvun.
	long c = io.nextLong(); // Lukee seuraavan välein erotellun long-kokonaisluvun.
	double d = io.nextDouble(); // Lukee seuraavan välein erotellun double-liukuluvun.
	
	// Toimii kuten System.out.println.
	io.println("Annoit syötteenä " + a + " " + b + " " + c + " " + d);
	
	io.close(); // TÄYTYY KUTSUA LOPUKSI, muuten tuloste voi jäädä kirjoittamatta
}
}

IO-luokan koodin löydät täältä: IO.java.