Analisa Solusi dari Problem Jelix dan Semut Imut di Final BNPCHS 2018
This slide is in Indonesian. To put it simply, we are trying to analyze a possible solution for the "Felix dan Semut Imut" problem that appeared in the BNPCHS 2018 competition.
banyak semut imut. • Salah satu dari semut tersebut dapat berubah jadi semut mutan. • Semut mutan bakal makan semut-semut imut yang ada di depannya dan yang ada di belakangnya. • Semut mutan berhenti makan ketika semut di depannya memiliki ukuran tubuh yang sama atau lebih besar darinya.
mutan, maka ia akan memakan sebanyak tiga semut imut. Nah, yang jadi pertanyaan, masing-masing semut kalo jadi semut mutan bakal makan berapa? Semut pertama bakal makan berapa? Semut kedua bakal makan berapa? Dan seterusnya sampai semut terakhir.
mutan cuma makan semut imut yang ukurannya lebih kecil darinya. • Semut mutan bisa makan semut imut yang ada di depannya juga yang ada di belakangnya. • Ada 10 kasus uji.
mutan cuma makan semut imut yang ukurannya lebih kecil darinya. • Semut mutan bisa makan semut imut yang ada di depannya juga yang ada di belakangnya. • Ada 10 kasus uji. • Masing-masing kasus uji bisa ada 1 semut, 2 semut, atau bahkan 100 ribu semut di dalamnya.
mutan cuma makan semut imut yang ukurannya lebih kecil darinya. • Semut mutan bisa makan semut imut yang ada di depannya juga yang ada di belakangnya. • Ada 10 kasus uji. • Masing-masing kasus uji bisa ada 1 semut, 2 semut, atau bahkan 100 ribu semut di dalamnya. • Cuma ada 1 semut mutan dalam satu waktu.
mutan cuma makan semut imut yang ukurannya lebih kecil darinya. • Semut mutan bisa makan semut imut yang ada di depannya juga yang ada di belakangnya. • Ada 10 kasus uji. • Masing-masing kasus uji bisa ada 1 semut, 2 semut, atau bahkan 100 ribu semut di dalamnya. • Cuma ada 1 semut mutan dalam satu waktu. • Batas waktu 1 detik dan batas memory 64 MB.
berikut. 3 4 1 1 5 3 Patterns: • Semut pertama cuma bisa maju. • Semut terakhir cuma bisa mundur. • Selain itu, misal semut keempat, bisa maju dan bisa mundur. Pattern Recognition
brute-force sebagai solusi, maka waktu yang dibutuhkan adalah: O(T * N^2) = O(10 * (10^5)^2) = O(10^11) Berhubung rule of thumb-nya 1 detik = 10^8 maka solusi yang kita ajukan ini butuh waktu lebih dari 1 detik karena 10^11 jelas-jelas lebih dari 10^8. Hitung Kompleksitas Waktunya
3 Apakah semut di depannya lebih kecil ukurannya? Berhubung lebih besar, maka semut pertama tidak dapat memakan semut kedua lalu berhenti sampai di sini. Hitung Kompleksitas Waktunya
3 Lantas, apa yang terjadi kalau semut kelima memakan semut kedua saat berjalan mundur? 3 < 4 dan 4 < 5, artinya semut kelima juga secara otomatis dapat memakan semua semut yang dimakan oleh semut kedua apabila ia menjadi semut mutan. Menggunakan Dynamic Programming
berikut. 3 4 1 1 5 3 Patterns: • Semut pertama cuma bisa maju. • Semut terakhir cuma bisa mundur. • Selain itu, misal semut keempat, bisa maju dan bisa mundur. Pattern Recognition
berikut. 3 4 1 1 5 3 Patterns: • Semut pertama cuma bisa maju. • Semut terakhir cuma bisa mundur. • Selain itu, misal semut keempat, bisa maju dan bisa mundur. • Apabila semut mutan X dapat memakan suatu semut imut Y, maka semua semut imut yang dapat dimakan oleh Y ketika menjadi semut mutan juga dapat dimakan oleh X. Pattern Recognition
mundur, kita dapat membuat tiga fungsi yaitu solve, forward, dan backward. solve(x) = forward(x) + backward(x) dimana x adalah posisi semut yang menjadi mutan. Pattern Generalization
jika ukuran semut x > semut x+1 forward(x) = 0, selainnya Apabila kita menggunakan memoization tadi, kita dapat membuat fungsi berikut: forward(x, w) = 1 + memo[x+1] + forward(x+1+memo[x+1], w) jika semut x+1 beratnya < w, dimana w adalah ukuran semut x forward(x, w) = 0, selainnya Pattern Generalization
= 1 + backward(x-1), jika ukuran semut x > semut x-1 backward(x) = 0, selainnya Apabila kita menggunakan memoization tadi, kita dapat membuat fungsi berikut: backward(x, w) = 1 + memo[x-1] + backward(x-1-memo[x-1], w) jika semut x-1 beratnya < w, dimana w adalah ukuran semut x backward(x, w) = 0, selainnya Pattern Generalization
yang mana berisi jumlah kasus uji. T = int(input()) Kemudian, untuk setiap kasus uji, ambil nilai N yang mana berisi jumlah semut-semut imut milik Jelix. for t in range(T): N = int(input()) Algorithm Design
Buat dua buah variabel untuk memoization, misal left dan right. left = array of int, size N, default 0 right = array of int, size N, default 0 Sekarang, ambil semua semutnya. ants = [int(x) for x in input().split(‘ ‘)] Algorithm Design
left = array of int, size N, default 0 right = array of int, size N, default 0 ants = [int(x) for x in input().split(‘ ‘)] Selanjutnya, cari tau dan inget-inget jawaban untuk forward dan backward. for x in range(N): w = ants[x] left = backward(x, w) right = forward(x, w) Algorithm Design
left = array of int, size N, default 0 right = array of int, size N, default 0 ants = [int(x) for x in input().split(‘ ‘)] for x in range(N): w = ants[x] left = backward(x, w) right = forward(x, w) Algorithm Design
left = array of int, size N, default 0 right = array of int, size N, default 0 ants = [int(x) for x in input().split(‘ ‘)] for x in range(N): w = ants[x] left = backward(x, w) right = forward(x, w) Terakhir, print solusinya. for x in range(N): answer = backward(x, ants[x]) + forward(x, ants[x]) print(answer, end=’ ‘) Algorithm Design
left = array of int, size N, default 0 right = array of int, size N, default 0 ants = [int(x) for x in input().split(‘ ‘)] for x in range(N): w = ants[x] left = backward(x, w) right = forward(x, w) for x in range(N): answer = backward(x, ants[x]) + forward(x, ants[x]) print(answer, end=’ ‘) Algorithm Design