PARROTS Burung Kakatua

advertisement
International Olympiad in Informatics 2011
22–29 July 2011, Pattaya City, Thailand
Competition Tasks – Day 2
PARROTS
Indonesia 1.3
Burung Kakatua
Yanee adalah seseorang yang tertarik pada burung. Sejak membaca tentang IP over Avian carriers
(IPoAC), ia telah meluangkan banyak waktunya untuk melatih sekumpulan burung kakatua yang
cerdas untuk membawa pesan jarak jauh.
Impian Yanee adalah untuk memanfaatkan burung-burungnya untuk mengirim pesan M ke tempat
yang sangat sangat jauh. Pesan M adalah sederetan N (tidak harus unik) bilangan bulat, setiap
bilangan bulat bernilai antara 0 dan 255, inklusif. Yanee merawat K burung kakatua yang terlatih
secara khusus. Semua burung kakatua terlihat sama. Yanee tidak dapat membedakan satu burung
dengan burung lainnya. Setiap burung kakatua dapat mengingat satu bilangan bulat antara 0 dan R,
inklusif.
Pada tahap awal, ia mencoba sebuah skema sederhana: untuk mengirim pesan, Yanee melepas
burung kakatua dari sarangnya satu per satu. Sebelum burung kakatua meluncur ke udara, ia
mengajarkannya suatu angka dari deretan pesan secara terurut. Sayangnya, cara ini tidak berjalan
dengan baik. Ternyata, semua burung kakatua sampai ke tujuan, namun urutan sampainya burung
mungkin berbeda dengan urutan keberangkatannya. Dengan skema ini, Yanee dapat memperoleh
kembali semua angka yang dikirimkannya, tetapi tidak bisa mendapatkannya sesuai urutan yang
benar.
Untuk merealisasikan mimpinya, Yanee membutuhkan cara yang lebih baik, dan untuk itu ia
membutuhkan bantuan Anda. Diberikan sebuah pesan M, ia berencana melepaskan burungnya satu
per satu seperti sebelumnya. Yanee membutuhkan Anda untuk menulis sebuah program yang
mampu melakukan dua operasi sebagai berikut:
 Pertama, program Anda harus dapat membaca pesan M dan mengubahnya menjadi deretan
sebanyak-banyaknya K bilangan bulat antara 0 dan R yang akan ia ajarkan kepada
burungnya.
 Kedua, program Anda harus dapat membaca deretan bilangan bulat antara 0 dan R yang
diterima sesuai dengan urutan sampainya burung, dan mengubahnya kembali ke pesan M.
Anda dapat mengasumsikan bahwa semua burung kakatua pasti sampai ke tempat tujuan, dan
masing-masing dapat mengingat angka yang disampaikan padanya. Yanee mengingatkan Anda
sekali lagi bahwa burung dapat sampai dengan urutan sembarang. Perhatikan bahwa Yanee hanya
mempunyai K burung kakatua, maka deret bilangan bulat antara 0 dan R yang Anda hasilkan harus
berisi paling banyak K bilangan bulat.
Halaman 1 dari 6
International Olympiad in Informatics 2011
22–29 July 2011, Pattaya City, Thailand
Competition Tasks – Day 2
PARROTS
Indonesia 1.3
Tugas Anda
Tuliskan dua prosedur terpisah. Salah satunya akan digunakan oleh pengirim (encoder) dan yang
lainnya akan digunakan oleh penerima (decoder).
Keseluruhan proses dapat diilustrasikan pada gambar berikut.
Kedua prosedur yang Anda tulis adalah:
 Prosedur encode(N,M) yang mempunyai parameter sebagai berikut:
 N – panjangnya pesan.
 M – suatu array satu dimensi berisi N bilangan bulat menyatakan pesan. Anda dapat
mengasumsikan bahwa 0 ≤ M[i] ≤ 255 untuk 0 ≤ i < N.
Prosedur ini harus mengubah pesan M menjadi sederetan bilangan bulat antara 0 dan R,
inklusif, yang akan dikirim menggunakan burung kakatua. Untuk melaporkan deret ini,
prosedur encode Anda harus memanggil prosedur send(a) untuk setiap bilangan bulat a yang
Anda inginkan untuk diberikan kepada burung.
 Prosedur decode(N,L,X) yang mempunyai parameter sebagai berikut:
 N – panjang pesan semula.
 L – panjang pesan yang diterima (banyaknya burung yang dikirim).
 X – sebuah array satu dimensi yang berisi L bilangan bulat menyatakan pesan
yang diterima. Bilangan X[i] untuk 0 ≤ i < L adalah angka yang persis sama dengan
yang dihasilkan prosedur encode Anda, tetapi urutannya mungkin berbeda.
Prosedur ini harus dapat menemukan kembali pesan semula. Untuk melaporkannya,
prosedur decode Anda harus memanggil prosedur output(b) untuk setiap bilangan bulat b
pada pesan yang diubah kembali, dalam urutan yang benar.
Perhatikan bahwa R dan K tidak diberikan sebagai parameter input – mohon lihat deskripsi subtask
di bawah.
Halaman 2 dari 6
International Olympiad in Informatics 2011
22–29 July 2011, Pattaya City, Thailand
Competition Tasks – Day 2
PARROTS
Indonesia 1.3
Untuk menyelesaikan dengan benar suatu subtask yang diberikan, prosedur Anda harus memenuhi
kondisi sebagai berikut:
 Semua bilangan bulat yang dikirimkan oleh prosedur encode harus berada dalam rentang
yang diberikan spesifikasinya pada subtask.
 Banyaknya pemanggilan prosedur encode terhadap prosedur send tidak boleh melebihi
batasan K yang diberikan pada subtask. Perhatikan bahwa K bergantung pada panjang
pesan.
 Prosedur decode harus menemukan kembali pesan semula M dan memanggil prosedur
output(b) tepat sebanyak N kali, dengan b sama dengan M[0], M[1], ..., M[N-1], secara
berturutan.
Pada subtask terakhir, skor Anda bervariasi sesuai dengan rasio antara panjang dari pesan yang terencode dan pesan semula.
Contoh
Perhatikan kasus dimana N=3, dan
10
M= 30
20
Prosedur encode(N,M), menggunakan suatu metode yang aneh, mungkin mengubah pesan menjadi
deretan bilangan (7, 3, 2, 70, 15, 20, 3). Untuk melaporkan deretan ini, prosedur encode harus
memanggil prosedur send sebagai berikut:
send(7)
send(3)
send(2)
send(70)
send(15)
send(20)
send(3)
Saat semua burung kakatua mencapai tujuannya, asumsikan bahwa kita memperoleh deretan
bilangan bulat sebagai berikut: (3, 20, 70, 15, 2, 3, 7). Prosedur decode kemudian akan dipanggil
dengan N=3, L=7, dan
3
20
70
X= 15
2
3
7
Halaman 3 dari 6
International Olympiad in Informatics 2011
22–29 July 2011, Pattaya City, Thailand
Competition Tasks – Day 2
PARROTS
Indonesia 1.3
Prosedur decode harus menghasilkan pesan semula (10, 30, 20). Prosedur decode melaporkan hasil
dengan memanggil prosedur output sebagai berikut.
output(10)
output(30)
output(20)
Subtask
Subtask 1 (17 poin)
 N = 8, dan setiap bilangan bulat dalam array M adalah 0 atau 1.
 Setiap bilangan bulat yang di-encode harus dalam rentang nilai dari 0 sampai dengan
R=65535, inklusif.
 Banyaknya pemanggilan maksimal yang boleh Anda lakukan untuk prosedur send adalah
K=10×N.
Subtask 2 (17 poin)
 1 ≤ N ≤ 16.
 Setiap bilangan bulat yang di-encode harus dalam rentang nilai 0 sampai dengan R=65535,
inklusif.
 Banyaknya pemanggilan maksimal yang boleh Anda lakukan untuk prosedur send adalah
K=10×N.
Subtask 3 (18 poin)
 1 ≤ N ≤ 16.
 Setiap bilangan bulat yang di-encode harus dalam rentang nilai dari 0 sampai dengan
R=255, inklusif.
 Banyaknya pemanggilan maksimal yang boleh Anda lakukan untuk prosedur send adalah
K=10×N.
Subtask 4 (29 poin)
 1 ≤ N ≤ 32.
 Setiap bilangan bulat yang di-encode harus dalam rentang nilai dari 0 sampai dengan
R=255, inklusif.
 Banyaknya pemanggilan maksimal yang boleh Anda lakukan untuk prosedur send adalah
K=10×N.
Subtask 5 (hingga 19 poin)
 16 ≤ N ≤ 64.
 Setiap bilangan bulat yang di-encode harus dalam rentang nilai dari 0 sampai dengan
R=255, inklusif.
Halaman 4 dari 6
International Olympiad in Informatics 2011
22–29 July 2011, Pattaya City, Thailand
Competition Tasks – Day 2
PARROTS
Indonesia 1.3
 Banyaknya pemanggilan maksimal yang boleh Anda lakukan untuk prosedur send adalah
K=15×N.
 Penting: Nilai untuk subtask ini tergantung kepada rasio antara panjangnya pesan yang dienkode dan pesan semula.
Untuk sejumlah t kasus dalam subtask ini, misalkan Pt=Lt/Nt adalah rasio antara panjang Lt
dari pesan yang di-encode dan panjang Nt dari pesan semula. Misalkan P adalah maksimum
semua nilai Pt. Skor Anda untuk subtask akan ditentukan menggunakan aturan sebagai
berikut:
 Jika P ≤ 5, Anda mendapat nilai penuh sebesar 19 poin.
 Jika 5 < P ≤ 6, Anda mendapat 18 poin.
 Jika 6 < P ≤ 7, Anda mendapat 17 poin.
 Jika 7 < P ≤ 15, skor Anda adalah 1 + 2 × (15 - P), dibulatkan ke bawah ke bilangan
bulat terdekat.
 Jika P > 15 atau ada keluaran Anda yang tidak benar, skor Anda adalah 0.
Penting: Setiap solusi valid pada subtask 1 sampai dengan 4 juga akan dapat menyelesaikan
subtask pendahulunya. Namun, dengan alasan batasan K yang lebih besar, solusi valid untuk
subtask 5 belum tentu dapat menyelesaikan subtask 1 sampai dengan 4. Ada solusi yang
sama yang dapat menyelesaikan semua subtask.
Rincian Implementasi
Batasan
 Lingkungan pengujian: pada lingkungan pengujian yang sebenarnya, jawaban Anda akan
dikompilasi menjadi dua program e dan d yang dieksekusi terpisah. Modul encoder dan
decoder akan di-link ke setiap executable, tapi e hanya memanggil encode and d hanya
memanggil decode.
 Batasan waktu CPU: Program e akan memanggil procedure encode sebanyak 50 kali dan
harus dapat dijalankan dalam 2 detik. Program d akan memanggil 50 kali prosedur decode
dan program harus dapat dijalankan dalam 2 detik.
 Batasan Memori: 256 MB
Catatan: Tidak ada batasan spesifik mengenai ukuran memori stack. Memori stack
diperhitungkan terhadap penggunaan memori secara keseluruhan.
Antarmuka (API)
 Direktori implementasi: parrots/
 Harus diimplementasi oleh kontestan:
 encoder.c atau encoder.cpp atau encoder.pas
 decoder.c atau decoder.cpp atau decoder.pas
Catatan untuk programmer C/C++: baik pada contoh penguji dan penguji sebenarnya
encoder.c[pp] dan decoder.c[pp] di-link bersama dengan penguji. Oleh karena itu, Anda
harus mendeklarasikan semua variabel global di dalam setiap file sebagai static untuk
Halaman 5 dari 6
International Olympiad in Informatics 2011
22–29 July 2011, Pattaya City, Thailand
Competition Tasks – Day 2
PARROTS
Indonesia 1.3
mencegah variabel-variabel tersebut mengganggu variabel dari file yang lain.
 Antarmuka kontestan:
 encoder.h atau encoder.pas
 decoder.h atau decoder.pas
 Antarmuka penguji:
 encoderlib.h atau encoderlib.pas
 decoderlib.h atau decoderlib.pas
 Contoh penguji: grader.c atau grader.cpp atau grader.pas
Contoh penguji menjalankan dua putaran terpisah. Pada setiap putaran, contoh penguji
memanggil encode dengan data yang diberikan, dan kemudian memanggil decode dengan
keluaran prosedur encode. Pada putaran pertama, contoh penguji tidak mengubah urutan
bilangan bulat pada pesan yang sudah di-encode. Pada putaran kedua, contoh penguji
menukar bilangan bulat pada posisi ganjil dan genap. Penguji yang sebenarnya akan
mengaplikasikan berbagai jenis permutasi pada pesan yang sudah di-encode. Anda dapat
mengubah bagaimana contoh penguji mengocok data dengan memodifikasi prosedur shuffle
(pada C/C++) atau Shuffle (pada Pascal)
Contoh penguji juga memeriksa rentang dan panjang data yang di-encode. Pada umumnya,
contoh penguji memeriksa bahwa data yang di-encode berada di antara 0 dan 65535,
inklusif, dan bahwa panjangnya paling banyak adalah 10xN. Anda dapat mengubahnya
dengan menyesuaikan konstanta channel_range (misalnya dari 65535 ke 255) dan
max_expansion (misalnya dari 10 ke 15 atau 7).
 Masukan contoh penguji: grader.in.1, grader.in.2, ...
Catatan: Contoh penguji membaca data dengan format sebagai berikut:
 Baris 1: N
 Baris 2: sederetan N bilangan: M[0], M[1], ..., M[N-1]
 Keluaran yang diharap untuk masukan penguji: grader.expect.1, grader.expect.2, …
Untuk persoalan ini, masing-masing berkas seharusnya berisi tepat teks “Correct.”
Halaman 6 dari 6
Download