Escolar Documentos
Profissional Documentos
Cultura Documentos
NRP : 5116100052
PENJABARAN TENTANG BEBERAPA PENYELESAIAN SAYA PADA SOAL SPOJ
1. MINST
-Ada array dari N integer, kita harus membuat semua bilangan yang ada = 0, dengan cara:
-Pilihlah beberapa bilangan, berapapun, misal K.
-Dari K bilangan yang terpilih, kita bisa membagi K menjadi dua kelompok, kelompok A yaitu
kelompok yang ditambahkan 1 pada setiap langkahnya, kelompok B yaitu kelompok yang dikurangkan 1
pada setiap langkahnya.
Penyelesaian
Karena kita bisa memilih berapapun nilai K (A, B juga), maka yang kita lakukan pada setiap langkah
adalah:
-Jika bilangan(bilangan-bilangan) yang ada sama dengan 0, jangan kita pilih (jangan diutak atik), selain
itu,
-Jika bilangan itu positif maka kita masukkan pada kelompok B, agar pada setiap langkahnya kita
kurangkan sampai dia sama dengan 0
-Jika bilangan itu negatif maka kita masukkan pada kelompok A, agar pada setiap langkahnya kita
tambahkan sampai dia sama dengan 0
-Tentu saja pada kelompok A dan B jika dia sudah sama dengan 0 maka jangan pilih dia lagi (jangan
diutak atik lagi)
Maka dari itu untuk mendapatkan jawaban dari soal ini, kita hanya perlu mendapatkan nilai terbesar
Itu didapatkan karena kita mendapatkan angka 0 setiap kita mengalikan 5 dengan 2, tapi jangan lupa
pada saat kelipatan 25, 5 dihitung 2 kali, dan setiap kelipatan 125, 5 dihitung 3 kali dst..
Sebenarnya kita juga perlu menghitung banyaknya faktor 2, namun pada kondisi ini dapat diabaikan
karena banyaknya sudah pasti > dari 5.
2
Lalu ide dari soal ini saya gunakan pada FACTB12. 12 memiliki faktorisasi prima yaitu 2 x 3 . Nah
jadi kita perlu menghitung banyaknya faktor 2 yang muncul dan faktor 3 yang muncul dalam n!
Banyaknya faktor 2 yang muncul = f2 =
n
n
n
+ 2 + 3 +
2
2
2
n
n
n
+ 2 + 3 +
3
3
3
2
Akan tetapi karena angka 2 dihitungnya setiap ia 2 kali muncul (karena 2 x 3 )
Maka kita bandingkan nilai minimum dari (f2/2, f3) untuk mendapatkan jawaban dari soal ini.
3. LEXI2 Lexicographic Order 2
-Diberikan n-buah bilangan asli pertama (dalam urutan yang acak), carilah k-th next permutation dari
bilangan yang diberi tadi.
Penyelesaian
Pertama, kita harus mengetahui bilangan yang diberikan pada urutan lexicographic dia menempati urutan
ke berapa.
Untuk mendapatkan bilangan itu terletak pada urutan ke berapa yang kita lakukan adalah menggunakan
permutasi dalam matematika
Jadi pada awalnya kita sorting dulu (karena ini sudah pasti n-buah bilangan asli pertama, maka kita tidak
perlu menggunakan algoritma sort, buat dalam array saja, misal x)
Kalau kita mengambil bilangan terkecil untuk diletakkan didepan, maka range jawabannya pasti pada
1 (n1)!
Kalau kita mengambil bilangan terkecil kedua untuk diletakkan didepan, maka range jawabanya pasti
pada ( n1 ) !+1 2.(n1)!
Dst...
Kita set nilai sum = 1 dulu.
Jadi kita ambil angka pertama, dia terletak pada urutan ke-berapa pada array x, misal d, lalu kita
tambahkan sum dengan (d-1)*(n-i)!, dengan i merupakan banyak kotak kosong yang bisa diisi
kemungkinan.
Kita buat dengan contoh angka saja agar lebih mudah
42__
z=z2=42=2
Array x 1 2 3 4
4 2?_
Jika m = 1 0*1! = 0, masih < dari 2
Jika m = 2 1*1! = 1, masih < dari 2
Jika m = 3 2*1! = 2, tidak < dari 2
Maka yang diambil adalah urutan 2 terkecil dari array x, saat ini yaitu 3
423_
Array x 1 2 3 4
Angka terakhir pastilah urutan ke 1, pada saat ini yaitu 1.
4231
4. BTCK
Diberikan 10 bilangan positif integers n1, n2, ..., n10 dan sebuah bilangan k,
Cari permutasi dari a1, a2, ..., a10 dari {0, 1, 2 , ... 9} dimana
a 1n1+ a2n 2++ a10n 10 k
Jika ada lebih dari 1 kemungkinan, print yang lexicografisnya paling kecil.
Jika tidak ada, print -1
Penyelesaian
Yang saya lakukan adalah menggunakan fungsi next-permutation yang saya dapatkan dari blog
https://www.nayuki.io/page/next-lexicographical-permutation-algorithm
Akan tetapi menurut saya kompleksitasnya sama dengan kompleksitas fungsi next_permutation() yang
disediakan oleh c++
Saya mencoba menggunakan inequality, yaitu Rearrangement Inequality
Jadi
saya
sort
array