Anda di halaman 1dari 6

PEMBAHASAN SOAL FINAL BNPCHS 2014

A. DUEL MAUT
* Solusinya adalah dengan Brute Force, yaitu mencoba semua kemungkinan pasangan dari anggota
kelompok pertama dan kedua, lalu mencari yang selisihnya paling minimal. Kita memaintain sebuah
variabel jawab yang menyimpan jawaban sementara. Setiap mencoba-coba memasangkan, kita
update variabel jawab jika pasangan kita yang sekarang selisihnya lebih kecil dari jawaban
sementara. Pada akhir tiap kasus uji, keluarkan isi variabel jawab ini sebagai jawabannya.
* Jumlah anggota masing-masing kelompok maksimal adalah 100, sehingga kompleksitas program
adalah O(T * N * M), yaitu O(100 * 100 * 100) alias O(10^6) dan masih masuk dalam batasan waktu
yang ditentukan.
* Tingkat kesulitan soal ini adalah easy.

B. BELANJA BAJU BAMBU BARU


* Beberapa observasi penting soal ini:
1. Jika sebuah node W termasuk dalam set jawaban, maka seluruh node dari W ke root pasti
termasuk dalam set jawaban.
2. Selama sebuah node Y masih menguntungkan (memperbesar jarak node minimum dalam set
jawaban dengan rata-rata set jawaban) ketika dimasukkan ke dalam set jawaban, maka
masukkan node Y diambil.
* Berdasarkan kedua observasi itu, jawaban kita adalah sebuah subtree yang mengandung root di
dalamnya. Cara naifnya adalah dengan mencoba semua node menjadi node minimum, sebut saja
node ini adalah node W. Kemudian, semua node dari node W ke root dimasukkan dalam jawaban.
Hitung rata-rata sementaranya. Ambil node yang terhubung dengan salah satu node dalam set
jawaban sementara, tentu saja untuk lebih optimumnya node ini memiliki value terbesar dibanding
kandidat node terhubung lainnya. Jika dengan memasukkan node ini ke dalam set jawaban masih
meningkatkan rata-ratanya, masukkan node baru ini ke dalam set jawaban. Hitung ulang rataratanya dan lakukan terus prosedur ini hingga tidak ada lagi node baru yang bisa dimasukkan ke
dalam set jawaban.

By Jessica Handojo (lechjeda) 2014.

* Pada ilustrasi di atas tidak mungkin ada node tambahan lagi yang diambil karena node manapun
yang diambil akan menyebabkan rata-rata sementara (7.6) turun. Jika proses dilakukan dengan
priority queue, maka kompleksitas program menjadi O(N * N log N). Untuk menghilangkan faktor N,
ada observasi tambahan yang diperlukan: Semua node, kecuali node yang termasuk dalam path
node W ke root, adalah node-node yang saling berdampingan pada array terurut. Array terurut
adalah sebuah array yang berisi semua node yang terurut nonascending berdasarkan value masingmasing.
* Mengapa demikian? Prinsipnya adalah jika sebuah node Y (yang tidak berada di jalur node W ke
root) dengan value V masuk ke dalam set jawaban, pasti node dengan value lebih besar dari V akan
masuk pula ke dalam set jawaban. Ingat bahwa pengambilan node Y selalu dari node terhubung
yang nilainya paling besar.
* Oleh karena itu, kita bisa menggunakan array terurut ini, sebut saja array U, untuk proses kita.
Setiap kita mencoba sebuah node W sebagai node minimum, iterasi array U dari depan. Jika node
tersebut tidak termasuk dalam path node W ke root dan node tersebut menguntungkan, ambilah
node itu ke dalam set jawaban. Dapat dipastikan node yang akan kita ambil ini terhubung dengan set
jawaban kita (coba lakukan pembuktiannya). Sehingga kompleksitas kita menjadi O(N) per node dan
kompleksitas akhir adalah O(N ^ 2).
* Namun, sampai di sini program kita masih TLE. Untuk mempercepat program kita, ada observasi
terakhir yang perlu ditambah. Cobalah gambar sebuah tree (yang mengikuti aturan soal, disebut juga
Max-Heap Tree), buatlah array U, lalu ambil sebuah node W. Sekarang, mulai dari indeks terdepan
pada array U, ambillah node itu dan hitung rata-ratanya. Lakukan dari indeks pertama hingga indeks
terakhir. Gambarkan nilai rata-rata sebagai grafik dengan sumbu X-nya adalah indeks dan sumbu Ynya adalah rata-rata. Perhatikan grafiknya. Anda akan mendapati grafik yang menyerupai ini:

Anda akan menemui grafik U terbalik, entah sebagian atau penuh. Dari grafik inilah, Anda bisa
melakukan binary search / ternary search untuk mendapatkan titik puncak grafik Anda. Ada
beberapa kasus khusus yang harus ditangani pada binary search sehingga kompleksitasnya
mendekati log^2 N.
Kompleksitas akhir adalah O(N log N) untuk ternary search dan O(N log^N) untuk binary search.
Tingkat kesulitan soal ini adalah Hard.

By Jessica Handojo (lechjeda) 2014.

C. BENSIN CINTA
* Pertama-tama cek terlebih dahulu apakah isi tangki Anda mula-mula lebih kecil atau lebih besar
sama dengan permintaan sang kekasih. Jika sudah lebih dari sama dengan, maka permasalahan
selesai. Selanjutnya, periksa apakah Anda mampu mencapai pom bensin. Jika mungkin, artinya Anda
hanya perlu membagi permintaan kekasih dengan (isi tangki maksimal - konsumsi bensin dua kali
jalan). Dua kali karena Anda perlu memastikan Anda bisa bolak-balik ke pom bensin. Jangan lupa cek
pula untuk pulang pergi yang terakhir, apakah Anda bisa memenuhi permintaan kekasih dengan
langsung mengosongkan tangki, atau perlu PP sekali lagi. Dengan demikian, soal ini dapat
diselesaikan dalam O(1). Tentunya iterasi akan terkena TLE sehingga Anda memerlukan rumusan ini.
* Tingkat kesulitan soal adalah Easy.

D. PASANGAN ANAGRAM
* Untuk mengetahui apakah string A adalah anagram dari string B, kita dapat mengurutkan hurufhuruf dalam masing-masing string A dan B, kemudian membandingkan apakah hasil pengurutannya
sama. Jika sama, maka kedua string adalah anagram; jika tidak, maka mereka bukan anagram.
Contoh: BACA dan ABCA. Setelah diurutkan, keduanya menjadi AABC, sehingga BACA adalah
anagram dari ABCA.
* Dengan teknik tersebut, artinya langkah pertama yang harus dilakukan adalah mengurutkan hurufhuruf dalam setiap N string input, lalu mengurutkan string-string yang telah diubah tersebut agar
mereka terkelompok dengan string-string anagramnya.
Contoh: string input terdiri dari {BACA, ACAB, KOL, LOK, PAM, OLK}. Diurutkan per string menjadi
{AABC, AABC, KLO, KLO, AMP, KLO}. Lalu, kumpulan string modifikasi ini diurutkan lagi menjadi
{AABC, AABC, AMP, KLO, KLO KLO} <= anagram-anagram sudah berkumpul menjadi satu.
* Setelah pengurutan selesai, maka permasalahan kita sudah menjadi lebih mudah. Bayangkan Anda
hanya perlu mencari tahu jawaban dari masalah berikut Diberikan X buah anggota, ada berapakah
pasangan berbeda yang dapat dibentuk? Definisi pasangan adalah subset yang terdiri dari 2
anggota. Misalnya, X adalah 5 dengan anggotanya ABCDE. Untuk A, akan ada 4 pasangan yang
mungkin dibentuk, yaitu {AB, AC, AD, AE}. Selanjutnya, untuk B, akan ada 3 pasangan yang mungkin
dibentuk, yaitu {BC, BD, BE}. Perhatikan bahwa BA bukan pasangan yang dapat dihitung lagi karena
sudah dicatat sebagai AB sebelumnya. Lanjutkan perhitungan maka Anda menemukan jawabannya
adalah 4 + 3 + 2 + 1 + 0 = 10. Asumsikan banyaknya pasangan untuk sebuah nilai X didefinisikan
sebagai f(X). Sehingga f(5) = 10.
* Gunakanlah penyelesaian subproblem itu ke soal semula kita dengan X adalah banyaknya anagram
untuk sebuah string. Pada contoh di poin ke-2, X kita berturut-turut menjadi {2, 1, 3}. Sehingga
jawaban untuk kasus ini menjadi f(2) + f(1) + f(3). Tentunya pencarian nilai f(X) tidak dapat diiterasi,
karena kompleksitas program menjadi O(N^2). Carilah sebuah rumusan Matematika untuk f(X)
sehingga kompleksitas penghitungan program adalah O(N * 1), yaitu O(N).
* Kompleksitas akhir yang diekspektasi juri adalah O(N log N) untuk sorting dan O(N) untuk
penghitungan jawaban. Tingkat kesulitan soal ini adalah easy-medium.

By Jessica Handojo (lechjeda) 2014.

E. MENULIS ESAI
* Salah satu penjelasan soal yang paling penting adalah Setiap nilai Aij adalah sebuah bilangan 2 k
dan unik. Karena ketentuan ini, kita bisa selalu mengambil Aij dengan nilai terbesar sementara.
Tentu saja soal i dan j harus bisa diambil (tidak melebihi jumlah soal maks yang dikerjakan dan waktu
pengerjaan masih masuk dalam batas). Mengapa demikian? Alasannya karena meskipun semua 2 m
dengan m < k dijumlahkan semuanya, totalnya masih lebih kecil dari 2k itu sendiri. Sehingga akan
selalu menguntungkan untuk mengambil yang terbesar.
* Yang dilakukan adalah mengurutkan semua Aij dan mengambil satu per satu dari paling besar.
Perbaharui data pada tiap query update dan lakukan penghitungan pada tiap query pertanyaan.
Kompleksitas program adalah O(Q * N log N) dan tingkat kesulitan soal adalah medium-hard.

F. SATU NOL
* Data setiap mahasiswa dapat direpresentasikan sebagai titik pada koordinat kartesian. Sehingga
total dari absolut selisih tinggi dan berat badan adalah Manhattan Distance antara 2 titik. Setiap titik
akan punya 2 jenis hubungan dengan titik lainnya, yaitu:

Pada gambar 1, Manhattan Distancenya adalah |XB - XA| + |YB - YA| dengan XB >= XA dan YB >= YA.
Sehingga Manhattan Distance untuk gambar 1 dapat disederhanakan menjadi (XB + YB) - (XA + YA).
Setiap titik manapun pasti akan mencari titik terkiri bawah yang terjauh agar selisihnya sebesarbesarnya. Akibatnya, semua titik akan memilih sebuah titik terkiri bawah yang sama, yaitu sebuah
titik dengan (X + Y) terkecil. Begitu pula setiap titik manapun pasti akan mencari titik terkanan atas
yang terjauh agar selisihnya sebesar-besarnya. Akibatnya, semua titik akan memilih sebuah titik
terkanan atas yang sama, yaitu sebuah titik dengan (X + Y) terbesar. Kesimpulannya, untuk gambar 1
hanya akan ada sebuah pasangan optimal, yaitu titik dengan (X + Y) terbesar dan (X + Y) terkecil.
Pada gambar 2, Manhattan Distancenya adalah |XB - XA| + |YB - YA| dengan XB >= XA dan YB >= YA.
Sehingga Manhattan Distance untuk gambar 2 dapat disederhanakan menjadi (XA - YA) + (XB - YB).
Semakin negatif (X - Y)-nya, titik akan berada di kiri atas, sedangkan semakin positif titik dengan (X +
Y)-nya, titik akan berada di kanan bawah. Prinsipnya sama dengan proses gambar 1, yaitu mencari
titik terkanan bawah dan terkiri atas yang kemudian akan menjadi pasangan optimal, yaitu titik
dengan (X - Y) terkecil dan (X - Y) terbesar.
Bandingkanlah kandidat jawaban dari masing-masing gambar, keluarkan yang terbesar.
Kompleksitas program adalah O(N). Tingkat kesulitan soal ini medium-hard (easy pada implementasi,
cukup sulit pada observasi).

By Jessica Handojo (lechjeda) 2014.

G. GEDUNG BARU
* Asumsikan Anda ingin meletakkan gedung sedemikian sehingga titik terkiri gedung ada pada titik L
dan titik terkanan gedung ada pada titik R (baik ada penyangganya di titik L/R maupun tidak). Kondisi
yang harus dipenuhi adalah: tanah paling tinggi dari rentang L hingga bagian tengah gedung DAN
tanah paling tinggi dari rentang tengah gedung + 1 hingga R bernilai SAMA.
* Dengan brute force titik terkiri, kompleksitas Anda adalah O(N * M) dan mendapat TLE. Yang harus
Anda lakukan adalah mengoptimasi bagian pencarian tanah tertinggi dari rentang A..B dengan
struktur data tertentu. Anda bisa menggunakan segment tree untuk mendapatkan jawaban yang
Anda inginkan dalam O(log N).
* Kompleksitas akhir yang diekspektasi juri adalah O(N log M) dengan tingkat kesulitan soal adalah
medium.

H. BENTENG TAKESHI
* Soal ini adalah soal Dynamic Programming. Misalnya Anda sudah meloncat berkali-kali dengan
berbagai cara, lalu suatu ketika Anda menemukan bahwa Anda berada pada sebuah tongkat dengan
energi tertentu. Terlepas dari bagaimana Anda mencapai tongkat itu dengan energi sekian,
permasalahan Anda mulai dari saat ini akan selalu memiliki solusi yang sama. Tentu saja, di sebuah
tongkat yang sama dengan energi yang serupa, tentu solusinya juga sama. Sehingga, state DP kita
adalah [row][column][energy_left].
* Dari setiap tongkat, Anda punya beberapa opsi dan Anda harus mengambil yang optimal:
1. Meloncat ke kiri/atas
2. Meloncat ke kanan/bawah
* Peloncatan terus dilakukan selama energi Anda masih lebih dari nol. Tentunya energi tepat nol
hanya diperbolehkan ketika Anda sudah ada di pinggir kolam.
* Kompleksitas program adalah O(N * M * E) dengan tingkat kesulitan soal adalah medium.

I. MELIPAT KERTAS
* Beberapa observasi yang dilakukan:
1. Kertas secara konsisten memendek ke sebelah kiri.
2. Perbatasan yang sudah pernah terlipat sekali, tidak boleh dihitung terlipat lagi meskipun
pada pelipatan-pelipatan selanjutnya berada di titik lipatan.
3. Setiap melipat, yang sesungguhnya dilakukan adalah memindahkan ketebalan di sebelah
kanan titik pelipatan ke sebelah kiri titik pelipatan.
* Dengan demikian, kita bisa memaintain sebuah array yang menyimpan informasi ketebalan kertas
pada setiap titik. Setiap pelipatan dilakukan di titik X, tambahkan jawaban sebanyak isi array indeks
ke-X, lalu mulai dari titik X+1 hingga tepat sebelum ujung kertas, pindahkan ketebalan kertas titik kem ke titik ke-n, dengan n adalah sebuah titik di sebelah kiri titik X yang absolut jaraknya ke titik X
By Jessica Handojo (lechjeda) 2014.

sama dengan absolut jarak titik m (suatu titik di kanan titik pelipatan) ke titik X. Perbaharui data di
program bahwa panjang kertas sekarang adalah X.
* Perhatikan ilustrasi berikut
Panjang kertas adalah 5 dan lipatan dilakukan
2 kali, yaitu di titik ke-3 dan 2. Isi array mulamula adalah {1, 1, 1, 1, 1, 1}. Setelah lipatan
pertama, array diperbaharui {1, 1, 2, 1, -, -}. Isi
array yang perlu diperbaharui hanya dari cm
ke-(1+1) hingga cm ke-(3-1). Mengapa? Lihat
kembali poin observasi yang ke-2.
Lipat kembali di titik ke-2 dan perbaharui
array menjadi {1, 1, 2, - , -, -}. Jawabannya
adalah 1 + 2 = 3 lipatan.

* Prosedur ini memakan operasi sebanyak O(N) karena setiap titik maksimal hanya akan dipindahkan
sebanyak 1 kali ke kiri. Setelah dipindahkan, titik dieliminasi dari proses (panjang kertas sudah
diperpendek). Tingkat kesulitan soal ini adalah hard (mudah untuk implementasi, sulit pada
observasi).

J. WAKKA DAN PERPUSTAKAAN RAKSASA


* Kunci pertama dari soal ini adalah menemukan fakta bahwa Wakka akan mengambil buku satu per
satu dari yang lantainya paling rendah ke paling tinggi secara berurutan. Ia tidak mungkin bolak-balik
naik turun karena hanya akan menyebabkan kerugian energi. Permasalahan yang tersisa adalah dari
titik di sumbu X yang manakah ia harus mulai naik mengambil bukunya.
* Solusinya adalah dengan mencoba semua titik X dan mencari nilai yang paling optimal. Dengan
coba-coba yang naf, kompleksitas program adalah O(X * N) dan mendapat verdict TLE. Mari kita
coba simplifikasi permasalahannya. Ketika Wakka berdiri di titik X, lalu mencoba mengambil semua
buku dan ternyata butuh energi sebesar E, maka berapakah energi yang dibutuhkan Wakka jika
mulai di titik X+1? Kita tidak perlu menghitung ulang semuanya, cukup memaintain dua buah data,
yaitu berapa jumlah buku yang berada di sebelah kiri titik X, sebut sebagai EKI, dan berapa buku
yang berada di sebelah kanan titik Y, sebut sebagai EKA. Dengan bergeser satu titik ke X+1, tentu kita
butuh tambahan energi sebanyak EKI dan menghemat energi sebanyak EKA. Penjelasannya karena
kita menjauh sebanyak 1 unit dari EKI buah buku dan mendekat sebanyak 1 unit ke EKA buah buku.
Dengan demikian, kita dapat menghitung energi yang dibutuhkan di titik X+1 dalam O(1).
* Kompleksitas program adalah O(X) dengan tingkat kesulitan adalah medium-hard.

By Jessica Handojo (lechjeda) 2014.

Anda mungkin juga menyukai