Frequent Mistakes in Competitive Programming - Proclub/Knowledge-Repo GitHub Wiki
Di bagian ini akan dibahas tentang frequent mistakes in competitive programming. Umumnya dalam OJ kita dapat 4 macam jenis feedback yaitu Accepted, Compile Error, Wrong Answer, Runtime Error dan Time Limit Exceeded. Yang akan dibahas disini hanya 3 jenis feedback yaitu :
-
Wrong Answer : Feedback ini muncul biasanya jika output yang diharapkan tidak sesuai dengan yang diminta soal. Kadang ada beberapa kesalahan konyol yang biasanya dibuat oleh para pemula, seperti kurang "newline", kelebihan atau kekurangan spasi, memasukan output diluar yang diminta soal seperti menulis "input :" di tampilan program dan lain lain. Yang Perlu diingat bahwa OJ ini sifatnya "exactly matched" jadi input dan output yang diharapkan soal harus benar2 sama, artinya jika output kita berbeda 1 karakter saja dengan output yang diminta oleh soal kita akan mendapatkan feedback "Wrong Answer".
-
Runtime Error : Feedback ini muncul biasanya jika kita melakukan akses diluar batas atau melakukan kesalahan aritmatika seperti membagi bilangan dengan 0.
-
Time Limit Exceeded : Umumnya untuk setiap soal diberikan sebuah time limit untuk mengeksekusi program dimulai dari membaca input yang diberikan juri sampai mengeluarkan output. Dengan adanya TLE (Time Limit Exceeded) ini program kita dituntut untuk berjalan secara cepat. Sebagai contoh saat jika program kita melakukan looping sebanyak 1 milyar ini akan memakan waktu yang sangat lama dan mengakibatkan TLE. Salah satu cara untuk membuat program kita lebih cepat adalah dengan melakukan optimasi pada algoritma yang kita buat.
-
Kalo mau alokasi array yang besar lebih baik deklarasinya jadi variabel global (diluar
int main()
), kalo di dalem fungsi (int main()
contohnya ) maximum memorinya cuman 8MB kalo buatint
cuman kuat nampung kira2 8juta data. Coba bandingin ini: Kode 1 sama Kode 2 -
Alokasikan memori lebih banyak daripada yang dibutuhkan. Sebagai contoh, jika soal meminta mu untuk menyimpan bilangan bulat sebanyak 100 bilangan, alokasikan
int bilangan[105];
atauint bilangan[110];
dan bukannyaint bilangan[100];
. Beri ruang toleransi bagi dirimu dan kodemu. -
Untuk C/C++ gunakan main fungsi lebih baik
int main()
dan diakhiri denganreturn 0;
, hal ini dilakukan agar judging bisa membaca verdict runtime error. -
Untuk
cin/scanf
itu input berhenti sama spasi atau newline (enter)
- Biasanya setiap baris output selalu ada "newline"
-
Mengakses elemen di luar indeks, contoh deklarasi
arr[100]
dan kita mengakses indeks ke-100. Padahal range aksesnya hanya dari 0..99. -
Kesalahan aritmatika seperti membagi bilangan dengan angka 0.
-
Kalo input datanya cukup besar sampai > 100 ribu, jangan pernah pake
cin/cout
untuk input/output. Lebih baik pakescanf/printf
,scanf/printf
jauh lebih cepat daricin/cout
. -
getch()
ataureadln();
yang berada diakhir program bisa menyebabkan program tidak berhenti (masih menunggu input dari keyboard), akibatnya program bisa mendapat Time Limit Exceed.