alexa-tracking
Selamat Guest, Agan dapat mencoba tampilan baru KASKUS Masih Kangen Tampilan Sebelumnya
Kategori
Kategori
1024
1024
KASKUS
51
244
https://www.kaskus.co.id/thread/53f2bd9098e31b6e218b458f/tanya-pseudocode

Tanya Pseudocode

Assalamu'alaykum,, selamat pagi

Agan2 yang jago algoritma, boleh minta sarannya gak?


Diketahui 2 buah array (sebut aja A dan B). Elemen pada array A berisi bilangan bulat acak, sedangkan elemen pada array B berisi 1 bilangan bulat yang nilainya lebih besar dari elemen terbesar pada array A. (Note: nilai SUM pada array A == nilai SUM pada array B)

Misal :
A = {A1,A2,A3,..... Am};
B = {B1,B1,B1,... B1};

Pertanyaannya :
Bagaimana algoritma membagi array A menjadi beberapa blok, dimana jumlah bloknya sebanyak jumlah elemen pada array B DAN jika elemen pada masing2 blok dijumlahkan maka akan mendapatkan nilai B1

Contoh soal 1 :
A = {4, 3, 2, 1};
B = {5,5};

maka
Blok A1 = {4,1};
Blok A2 = {3,2};
Nilai SUM pada masing2 blok = nilai B1 = 5


Contoh soal 2:
A = {10, 9, 7, 6, 6, 5, 4, 4, 3, 2};
B = {14, 14, 14, 14};

maka akan terbentuk 4 blok dengan nilai elemen masing2
Blok A1 = {10,4};
Blok A2 = {9,5};
Blok A3 = {7,4,3};
Blok A4 = {6,6,2};

Nilai SUM pada masing2 blok A1 dst == nilai B1 == 14
-----------------------------------
Kalau pseudocode yg sejauh ini ane buat :

n = jumlah elemen array B
for i = 1 sampai n
sisa = nilai B1
Blok_Ai = {};
while sisa ~= 0
idx = cari index nilai A terbesar yang nilainya <= sisa
sisa = sisa - A[idx];
Blok_Ai = {Blok_Ai A[idx]};
Hilangkan nilai A[idx]
end while
end for


Nah permasalahannya itu, masih ada salah (bakal error) di pseudocode ane...
Kalau menggunakan nilai A dan B pada contoh nomor 2 di atas, maka pada saat i=3
Blok A3 akan terisi {7,6, ..??} (nilai idx yg selanjutnya ga akan ada DAN nilai SUM pada A3 tidak akan mungkin sama dengan B1 atau 14)


---------

Makasih gan emoticon-Kiss
Diubah oleh: njiko
Urutan Terlama
Quote:


gimana kalo gini

n = jumlah elemen B
for i=1 sampai n
sisa = B1
while(A blm habis)
pindahin elemen pertama A ke Ci
sisa= sisa-nilai yg dipindahin
while(sisa>0)
if(end of A) //udah ga ada next element di A
balikin elemen terakhir Ci ke A
sisa = sisa + nilai yg dibalikin
set index pencarian ke element pertama A
end if

if(nilai A berikutnya > sisa)
pindah ke nilai A berikutnya
else
pindahin elemen A ke Ci
sisa= sisa-nilai yg dipindahin
end if

if(sisa =0)
continue for // SUM blok udah = B1, lanjut ke i berikutnya
end if

asumsi
- A itu menggunakan konsep First In First Out, jadi pas elemen dibalikin akan masuk ke index terakhir
- ketika mindahin elemen A ke C, otomatis index pencarian point ke next elementnya

untuk C1 sama C2 nggak ada masalah, C1={10,4} C2={9,5}
setelah itu A={7,6,6,4,3,2}
selama while bakal masuk C3={7,6} dan karena sampai abis (end of A) masih nyisa 1, maka nilai 6 dibalikin lagi ke A dan nilai sisa kembali jadi 7, A kini jadi {6,4,3,2,6} karena 7 udah masuk C1 dan 6 dibalikin ke A.
kembali iterasi dari awal dan terjadi hal yg sama karena kebetulan next element nilainya 6 lagi, jadi sekarang A={4,3,2,6,6} dan ulang iterasi lagi hingga akhirnya didapat C3={7,4,4} dan C4={2,6,6}

implementasinya di C bisa pake linked list, lebih enak mindah2in element tanpa perlu ngurusin index (tapi main pointernya yg bener aja sih), kalo di C# malah ada object Stack,List, sama Queue jadi lebih simpel mindah2in element A sama C emoticon-Big Grin
terimakasih buat agan onionkid dan agan justhrun emoticon-Kiss

ntar ane coba sarannya...

maap banget ni ga bisa kasi reputasi emoticon-Frown

makasih sekali lg emoticon-Smilie


×
GDP Network
Copyright © 2018, Kaskus Networks, PT Darta Media Indonesia.
Ikuti KASKUS di