بسم الله الرحمن الرحيم
Baru beberapa hari yang lalu, aku merasakan udara panas khas kota pesisir. Udara panas yang bikin kangen Surabaya tapi gak kangen gerahnya.
Yoi, ACM-ICPC Jakarta. My first ICPC and first contest in college.
Agak alay, tapi memang gak kebayang bisa bertandang di kompetisi selevel ini. Waktu penyisihan INC pun rasanya almost impossible bisa lolos ke regional. But,... Allah punya cara lain buat bikin aku baca buku Competitive Programming 3 yang dikasih Wisnu, buku saktinya anak TOKI. Kayak gini nih bukunya
Buku level internasional yang ditulis alumni TOKI, sekarang lecturer di NUS;
waktu kontes sempet ketemu orangnya, satunya gede satunya kecil :v
Oh ya, perkenalkan dulu tim saya, Wisnu Wisnu si bos tim (orang luar ga menerima nama tunggal, makanya ID Cardnya gitu), Ibrohim Kholilul Islam aka Oz sang master koding, dan sampah terakhir yang harusnya dibuang dari kelompok, saya sendiri !!
Seminggu sebelum berangkat buat belajar itu mepet banget... dan cuma sempet baca bab awal sampai Backtracking, mentok diterusin di hotel pun cuma dapet sampai DP (Dynamic Programming). Ya sudahlah, yang penting aku bisa solve 1 soal (hampir 2 soal benernya, cuma 'kurang beruntung' di memo jadi gak AC), dan total tim Oz dapet 3 solved!! Yeah!!!
dan hasilnya pun masih 34 dari 58 tim :''
Ini dokumentasi tim ITB saat trial session Rabu kemarin,
Nah, saya mau sharing aja sekalian bagi-bagi ilmu buat soal kemaren, utamanya yang sudah solve. Cekidot
A. Number Assignment
Solved by : Afrizal
Bisa dibilang ini soal termudah di kontes. Kontestan diminta membagi beberapa integer dalam beberapa kelompok yang mana nilai total selisih maksimum dan minimum dalam satu grup menjadi paling kecil. Idenya dengan greedy approximation, yaitu mengelompokkan integer secara terurut lalu jika ketemu gap yang lumayan besar dipecah. Bisa dengan sort array lalu dicari beberapa beda terbesar sebagai batas antar grup. Total kompleksitas O(N log N).
C. The Busiest City
(Almost) solved by : Ibrohim, Wisnu
Soal graph yang hampir solved -dan memang seharusnya bisa solved karena banyak yang solved disini- ini bisa dibilang agak repot. Tujuannya yaitu menentukan kota tersibuk (yang paling banyak dilewati oleh permutasi path 2 vertex). Idenya -yang belum beruntung dapet AC- yaitu menentukan vertex yang bersebelahan dengan edge yang terbanyak dapat dibuat extensionnya. Entah kenapa terjadi bug yang aneh di kode kami dan akhirnya dapet WA 3 kali.
D. Power Plant
Solved by : Wisnu
Ini soal graph yang tergolong mudah, dan juga soal pertama yang kami solve -walaupun solusi yang A ketemu duluan. Inti soalnya yaitu menentukan biaya minimum dari pembangunan jalur transmisi listrik dari generator (vertex yang sudah ditandai) ke semua bangunan. Idenya yaitu mengelompokkan generator menjadi satu vertex, lalu dicari harga minimum spanning tree (MST). Pengelompokan generator dengan bitset (status 1/0) lalu dengan Prim MST dicari edges termurah terus membuat extensionnya. Total kompleksitas O(|E|+|V|).
F. Pasti Pas!
Solved by : Ibrohim
Satu-satunya soal string processing di kontes kali ini idenya mudah, tapi agak susah diimplementasikan. Soal ini bercerita tentang string yang bukan palindrom, tapi bisa dipecah menjadi beberapa substring, yang masing-masing substring jika dianggap satu komponen (atau dianggap satu simbol) string utamanya jadi palindrom. Contohnya, “PastiPas”. Jika “pas” kita misalkan “x” dan “ti” kita misalkan “y”, maka “pastipas” menjadi “xyx” yang merupakan palindrom. Kita diminta menentukan pengelompokan terbanyak yang mungkin agar string yang diberikan menjadi palindrom. Ide pertama yang terpikir yaitu secara naïf memecah substring yang dianggap sama, lalu diselesikan dengan rekursif. Solusi ini jelas mendapat verdict TLE. Lalu kami coba optimisasi dengan tidak memecah secara langsung, tapi mengecek per karakter, lalu diselesaikan secara rekursif. Dan akhirnya dapat AC setelah gagal 4 kali. Total kompleksitas O(|S|2 log|S|).
G. Horrible Quiz
(Almost) solved by : Afrizal
Soal ini pertama terlihat susah karena melibatkan teori peluang. Awalnya aku pikir ini bakal diselesaikan dengan kombinatorika. Setelah berpikir agak lama, aku menemukan stage dalam penyelesaiannya yang merupakan ciri soal DP! Jadi, soal ini meminta kita menentukan nilai terendah yang dapat dicapai dalam ujian, jika diberikan peluang kita menjawab benar dan salah dengan kemampuan sendiri untuk tiap soal (otomatis jika jumlahnya kurang dari 100% sisanya peluang kita minta bantuan dalam soal itu), jumlah maksimum soal salah yang mungkin diberikan oleh yang kita mintai bantuan (anggap saja kita pake joki pas ujian :v). Kita bisa selesaikan dengan DP 2D dengan jumlah soal salah maksimum sebagai constraint-nya, dan jumlah soal sebagai stagenya. Ambil nilai minimum dari nilai yang dicapai pada stage sebelumnya jika soal dari joki ternyata benar ((C-W+H)%*nilai sebelumnya) dan nilai yang dicapai pada stage sebelumnya jika soal dari joki ternyata salah ((C-W-H)%*nilai sebelumnya). Lalu dicari nilai maksimum pada stage terakhir untuk semua kemungkinan kesalahan yang diberikan joki pada kita. Waktu case testing sebenarnya sudah hampir benar, tapi entah kenapa masih ada bug dan waktu yang makin menipis memaksa kami untuk menyerah dalam 1 WA.
Untuk pembahasan lebih rinci silahkan merujuk ke blog pak Suhendry yang jauh lebih jago dari kami. Semoga bermanfaat. Terima kasih
Untuk pembahasan lebih rinci silahkan merujuk ke blog pak Suhendry yang jauh lebih jago dari kami. Semoga bermanfaat. Terima kasih