Penjelasan Soal Programming Struktur Soal Setiap soal terdiri atas 4 bagian, deskripsi soal, format input/output, contoh input/output dan biasanya terdapat penjelasan contoh input/output. o o
o
o
Deskripsi soal berisi penjelasan mengenai permasalahan yang harus diselesaikan oleh peserta. Format input/output berisi penjelasan tentang format input yang digunakan oleh juri untuk menguji kebenaran program peserta. Pada bagian ini terdapat batasan – batasan input yang harus ditangani peserta. Input yang diberikan oleh juri pasti akan sesuai dengan format input. Contoh input/output adalah contoh – contoh input yang akan diberikan oleh juri dan contoh – contoh output yang tepat. Hal ini ditujukan agar peserta bisa memahami maksud soal dan format input/outputnya. Contoh input/output tidak bertujuan untuk menguji kebenaran program peserta. Jika program peserta menghasilkan output yang benar untuk contoh input/output, bukan berarti peserta pasti benar. Tetapi jika peserta tidak mengikuti format input output, pasti jawaban peserta akan dinilai salah. Penjelasan contoh input/output bertujuan untuk menjelaskan hubungan antara contoh input dan contoh output sesuai dengan deskripsi soal. Ini bertujuan agar peserta lebih memahami deskripsi permasalahan.
Contoh Soal Berikut contoh soal programming dan contoh penyelesaiannya.
A+B-C Diberikan 3 buah bilangan bulat, A, B, dan C, tentukan hasil operasi matematika A + B – C! Input Input dimulai dengan satu integer T (T <= 1000) yang menunjukkan jumlah testcase yang akan diberikan. Setiap case akan terdiri dari 1 baris yang terdiri dari 3 integer A, B, dan C (-1000 <= A, B, C <= 1000). Output Untuk setiap case, cetak hasil dari A + B – C dalam satu baris! Sample Input 3
2 3 4 -1 -3 -7 5 10 0 Sample Output 1 3 15 Penjelasan : 1. Case pertama 2+3-4=5–4=1 2. Case kedua -1 + (-3) – (-7) = -4 – (-7) = 3 3. Case ketiga 5 + 10 – 0 = 15 – 0 = 15 Salah satu contoh program C/C++ yang benar untuk menyelesaikan masalah tersebut adalah #include <stdio.h> int main(){ int t; scanf("%i",&t); for(int i=1;i<=t;i++){ int a, b, c; scanf("%i %i %i",&a,&b,&c); printf("%i\n",a + b - c); } return 0; } Perhatikan di format input disebutkan bahwa T ≤ 100 dan -1000 ≤ A, B, C ≤ 1000, ini adalah batasan input. Peserta tidak perlu melakukan validasi input lagi karena data uji juri yang diinputkan sudah dipastikan berada pada batasan input yang disebutkan di soal.
Cara Penjurian Penjurian jawaban peserta tidak dilakukan dengan melihat detail dari isi program peserta melainkan dengan menjalankan program peserta dengan data uji input (masukan) yang dimiliki juri, lalu membandingkan output atau keluaran dari program peserta dengan output dari jawaban juri. Jadi, penjurian tidak akan memperhitungkan source code dari jawaban peserta, tetapi hanya hasil output dari program peserta ketika dijalankan dengan data uji dari juri. Jenis – jenis jawaban yang dianggap ada adalah sebagai berikut : a. COMPILE ERROR, program peserta tidak bisa dicompile dikomputer juri. b. WRONG ANSWER, output peserta (file *.out) berbeda dengan output juri (file *.ans). c. RUNTIME ERROR, program peserta mengalami crash pada saat dijalankan dengan data uji juri (file *.in). Hal ini biasanya disebabkan kesalahan akses array atau pembagian dengan 0 atau yang lainnya.
d. TIME LIMIT EXCEED, program peserta memerlukan waktu yang melebihi batas waktu yang telah ditentukan oleh juri untuk mengolah data uji dan menghasilkan output. e. MEMORY LIMIT EXCEED, program peserta memerlukan memory yang melebihi batas memory yang ditentukan oleh juri untuk mengolah data uji dan menghasilkan output. f. ACCEPTED, program peserta benar.
Ranking Ranking peserta diurutkan berdasarkan jumlah soal yang berhasil disolved (ACCEPTED). Untuk peserta yang memiliki jumlah ACCEPTED yang sama akan diurutkan berdasarkan total penalti waktu terkecil. Total penalti waktu adalah total waktu pengiriman jawaban (relatif terhadap waktu kontes dimulai) untuk setiap jawaban yang ACCEPTED ditambah dengan 20 menit untuk setiap jawaban yang salah pada jawaban yang telah ACCEPTED. Ilustrasi cara perhitungan penalti waktu:
Tim 1 mengirimkan jawaban soal A pada menit ke 69 (terhitung dari awal kontes dimulai) dan mendapatkan status ACCEPTED. Maka penalti waktu untuk Tim 1 adalah 69. Jika sebelumnya Tim 1 pernah mengirimkan dua kali jawaban untuk soal A dan tidak berhasil mendapatkan ACCEPTED (sebelum pengiriman ketiga pada menit 69 yang akhirnya ACCEPTED), maka total penalti waktu ketika soal A berhasil diselesaikan adalah 69 + 2 * 20 = 109.
Poin yang didapat peserta adalah jumlah jawaban benar peserta dikali 20 lalu dikurangi dengan peringkat peserta berbanding dengan jumlah peserta lain yang memiliki jumlah jawaban benar yang sama dengan peserta tersebut dikalikan 20. POIN = (JB * 20) – ((PJB – 1) / JJB) * 20, dimana
POIN JB JJB PJB
= Jumlah poin yang diterima peserta = Jumlah jawaban peserta yang benar (ACCEPTED) = Jumlah peserta yang memiliki JB yang sama dengan peserta tersebut = Peringkat peserta berbanding dengan JJB
Contoh Ranklist Rank 1 2 3 4 5 6 7
Team Gajah Singa Kuda Zebra Ular Burung Naga
Solved 3 3 2 2 2 2 1
Time 130 160 25 30 80 130 50
Cara membaca table
Rank
: Ranking peserta
A 2/20 3/10 1/10 1/12 1/40 1/70 3/-
B 1/30 1/30 10/1/18 2/20 3/2/-
C 2/40 4/20 1/15 3/20 1/50
Att / Solved 5/3 8/3 2/2 2/2 3/2 6/2 6/1
Team : Nama tim peserta Solved : Jumlah jawaban peserta yang benar Time : Waktu penalti peserta A–B–C : Status peserta untuk setiap soal (Soal A, B dan C) yaitu jumlah jawaban yang dikirimkan peserta untuk soal tersebut dan waktu yang diperlukan oleh peserta untuk menjawab soal tersebut (jika ACCEPTED baru dicatat) dalam hitungan menit. Att / Solved : Jumlah jawaban yang dikirim peserta berbanding jumlah jawaban benar
Beberapa hal yang perlu diperhatikan dari contoh ranklist diatas
Cara penilaian poin karena poin ini yang akan digunakan sebagai perhitungan tim yang akan lolos ke semifinal. Cara penilaian poin telah dijelaskan diatas. Pada contoh diatas, tim Ular berhasil menjawab 2 soal yaitu soal A dan B dan peringkat tim Ular berdasarkan tim lain yang menjawab 2 soal juga adalah peringkat 3. Jumlah peserta yang berhasil menjawab 2 soal adalah 4, Sehingga poin yang didapatkan tim Ular Poin = (JB * 20) – ((PJB – 1) / JJB) * 20 = (2 * 20) – ((3 – 1) / 4) * 20 = 40 – 10 = 30 Waktu penalti. Pada contoh diatas, tim Singa mendapatkan ACCEPTED pada soal A, B dan C. o Untuk soal A, tim Singa membutuhkan 3 kali menjawab baru bisa mendapatkan ACCEPTED. Berarti 2 jawaban pertama mereka salah dan jawaban ketiga ACCEPTED pada menit 10. Sehingga waktu penaltinya untuk soal A menjadi 10 + (2 * 20) = 50. o Untuk soal B, tim Singa mendapatkan ACCEPTED pada jawaban mereka yang pertama yaitu pada menit 30, sehingga waktu penaltinya menjadi 30. o Untuk soal C, tim Singa membutuhkan 4 kali menjawab baru bisa mendapatkan ACCEPTED. Berarti 3 jawaban pertama mereka salah dan jawaban keempat ACCEPTED pada menit 20. Sehingga waktu penaltinya menjadi 20 + (3 * 20) = 80. o Sehingga waktu penalti keseluruhan untuk tim Singa adalah 50 + 30 + 80 = 160. o Perlu diingat bahwa waktu penalti hanya akan dicatat dari soal yang telah mendapatkan ACCEPTED. Sebagai contoh, perhatikan tim Kuda.
Kesalahan yang sering terjadi pada pemula Output yang tidak seharusnya ada Apapun yang dicetak oleh program kita ke standard output (stdout) adalah bagian dari output program kita yang nantinya akan diperiksa. Misalnya kita diminta untuk membuat program yang membaca sebuah integer dan mencetak integer yang nilainya lima kali lebih besar dari integer input. Contoh input 10
Contoh output 50
Program C/C++ yang dibuat: int main() { int x; printf( "Input Angka: " ); scanf( "%d", &x ); printf( "%d\n", x * 5 ); return 0; }
Jika program di atas diinput dengan 10
Maka output program tersebut adalah Input Angka: 50
Teks “Input Angka: ” akan dianggap sebagai bagian dari output. Jika teks tersebut tidak diharapkan ada sesuai penjelasan format input/output, maka program peserta akan dikategorikan sebagai WRONG ANSWER meskipun angka yang diminta benar (50). Oleh karena itu, JANGAN mencetak output yang tidak perlu meskipun hal itu bertujuan untuk menjelaskan proses program. Yang perlu dicetak sebagai output telah diatur pada bagian output pada soal. Program yang benar adalah sebagai berikut: int main() { int x; scanf( "%d", &x ); printf( "%d\n", x * 5 ); return 0; }
Sebagai catatan, untuk pencetakan output, boleh dilakukan per test case. Jadi, misalkan pada program terdapat 5 test case, maka setelah test case pertama diinputkan, output boleh langsung ditampilkan. Demikian seterusnya hingga test case ke lima.
(Java) Penggunaan GUI (JPanel, dsb) Program harus membaca input dari standard input (stdin) dan mengoutput ke standard output (stdout) yang keduanya ada di console (bukan GUI). Penggunaan GUI bisa menyebabkan program tersebut TIME LIMIT EXCEED (juri tidak memberikan input ke GUI yang ditampilkan sehingga program terus menunggu).
Hal-Hal Yang Harus Diperhatikan
Saat submit jawaban jangan lupa untuk menyamakan bahasa yang dipakai dengan file yang dikirim Agar lebih aman, gunakanlah template yang telah disediakan(terdapat di web penyisihan ilpc), anda tinggal mengubahnya sesuai kebutuhan.
Bahasa Pascal: o Jangan menggunakan “uses crt”, gunakanlah "uses wincrt" o Jangan menggunakan "clrscr" o Jangan menggunakan readln / readkey (atau sejenisnya) Jika maksud dari penggunaan perintah ini adalah menghentikan program pada akhir eksekusi, maka saat submit perintah ini harus dihapus terlebih dahulu. Karena akan menghasilkan Time Limit Exceed (program akan menunggu user memberi input melalui keyboard, yang tidak akan dilakukan juri).
Bahasa C/C++: o Jangan menggunakan void main() Compiler yang juri gunakan mengharuskan fungsi main() memiliki return value berupa int, sehingga harus ditulis dengan int main(). o Jangan menggunakan getch() atau system( “pause” ) Jika maksud dari penggunaan perintah ini adalah menghentikan program pada akhir eksekusi, maka saat submit perintah ini harus dihapus terlebih dahulu. Karena getch() dapat menyebabkan Time Limit Exceed (program akan menunggu user memberi input melalui keyboard, yang tidak akan dilakukan juri) dan system( “pause” ) akan menyebabkan Wrong Answer (ada output tambahan “Press any key to continue . . .” yang tidak diharapkan). o Jangan memanggil fungsi tanpa meng-include header yang diperlukan Jika anda menggunakan IDE DevC++, maka anda harus berhati-hati karena DevC++ bisa meng-include secara default beberapa header yang diperlukan oleh program anda, tapi tidak demikian jika anda mengcompile dari command line (yang dilakukan juri). Sehingga submission yang seperti ini akan mendapatkan NO – Compile Error. o Jangan menggunakan strrev, fflush(stdin) Karena juri mengcompile dari command line, maka jika menggunakan perintah ini akan mendapatkan NO-Compile Error.
Bahasa Java: o Jangan menggunakan Package Karena jika menggunakan package program bisa dicompile tapi tidak bisa dirun, sehingga akan mendapatkan NO – Runtime Error. o Pastikan nama class utama adalah "class Main", bukan "Public class Main".