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ä.

Jokaisessa tehtävässä ohjelma saa käyttää 4 sekuntia aikaa ja 128 Mt muistia yhden syötteen käsittelyyn. Ohjelma ajetaan eristetyssä ympäristössä, eli esimerkiksi väliaikaistiedostojen tai verkkoyhteyden käyttö ei ole mahdollista. [rem]Tuloste kannattaa muotoilla täsmälleen tehtävänannon mukaisesti, vaikka tarkistin salliikin hiukan liikkumavaraa välilyöntien ja rivinvaihtojen määrässä.[/rem]

Tehtävän testiaineisto ja ohjelman antamat tulokset on mahdollista nähdä ohjelman lähettämisen jälkeen. [rem]Tämä on sallittu debuggaamisen helpottamiseksi.[/rem] Ratkaisun tulisi kuitenkin olla sellainen, että siihen olisi ollut mahdollista päätyä pelkän tehtävänannon perusteella.

Virhetilanteet

CSES tunnistaa seuraavat virhetilanteet:

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.

Mikäli ohjelma tuottaa useamman virheen, niistä näytetään edellisen listan mukaan ensimmäinen.

Ohjelmointikielet

Sallitut ohjelmointikielet ovat C++, Java, Python ja Haskell. 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.

Java

Käytettävä Java-jakelu on OpenJDK versio 1.8.0_40 (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.

C++

C++ käännetään g++ 4.8.2-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
}