You are on page 1of 24

PELATIHAN ONLINE 2018

KOMPUTER – PAKET 7
PELATIHAN ONLINE 2018
KOMPUTER – PAKET 7

DASAR PEMROGRAMAN 1
Sekarang kita sudah memasuki materi pemrograman. Bahasa yang kita gunakan adalah
Pascal, dan bahasa yang digunakan dalam OSK dan OSP adalah Pseudo-Pascal (arti : mirip
Pascal). Pada paket ini, kita akan mempelajari sintaks dasar dan struktur yang ada dalam bahasa
pemrograman Pascal.

Sekedar informasi bagi Anda, mulai tahun 2019 IOI (Intenasional, kelanjutan dari OSN
Komputer) akan menghapus “Pascal” dari daftar bahasa pemrograman yang boleh digunakan.
Meskipun demikian, belum ada kabar apakah bahasa yang digunakan pada OSK-OSN akan
diganti, sebagai contoh menggunakan Pseudo-C++ atau semacamnya. Sehingga Saya belum
berani untuk mengganti materi yang Anda menjadi C++.

Tetapi ada 1 hal yang perlu Anda pahami. Sesuai dengan materi yang diujikan dalam OSK
dan OSP, Algoritmika. Sehingga titik inti dari materi yang akan dilombakan adalah Algoritma nya,
bukan Bahasa Pemrograman nya. Sehingga pada dasarnya tidak akan ada masalah yang cukup
besar, selama kalian bisa memahami dasar-dasar yang ada dan mengerjakan soal-soal dengan
baik. Tetapi tidak ada salahnya apabila Anda mulai belajar koding dalam C++ dari sekarang.
Referensi sintaks nya ada di www.cplusplus.com. Selamat belajar! :)

Pengenalan

Berikut adalah istilah-istilah yang perlu dipahami :


Sintaks Gramatikal/Tata cara penulisan

Variabel Pengganti, tempat kita menyimpan data

Tipe Tipe-tipe data yang kita simpan, bisa saja berupa angka (integer), karakter (char),
Data true/false (boolean), dll.

Operator Simbol yang digunakan untuk melakukan operasi pada data

Input Informasi yang kita berikan kepada komputer

Output Informasi yang komputer berikan kepada kita

Operasi

Terdapat beberapa jenis operator yang ada dalam pascal


 Operator Aritmetika : terdiri atas + (penjumlahan) , - (pengurangan), * (perkalian), div
(pembagian integer), mod (modullo), dan / (pembagian real).

 Operator Relasional : terdiri atas = (sama dengan), <> (tidak sama dengan), < (kurang
dari), > (lebih dari), <= (kurang dari sama dengan), >= (lebih dari sama dengan).
PELATIHAN ONLINE 2018
KOMPUTER – PAKET 7

 Operator Logika : terdiri atas and (dan/konjungsi), or (atau/disjungsi), xor (atau/disjungsi


eksklusif), dan not (bukan/negasi).

 Operator Bitwise : terdiri atas & (and), | (or), ~ (komplemen), << (shift left), dan >> (shift
right)

 Operator Assignment : terdiri atas := (memberi nilai pada suatu variabel).

Percabangan

Terkadang dalam program kita, kita ingin agar program kita menjalankan hal yang berbeda
tergantung pada data yang ada. Hal tersebut mungkin dilakukan dengan struktur percabangan
dengan sintaks if … then … . Contoh :

if (x mod 2 = 1) then
write('A')
else
write('B');
Program tersebut dapat kita terjemahkan sebagai berikut : apabila x dibagi 2 bersisa 1,
maka outputkan „A‟, jika tidak maka outputkan „B‟. Dari sini kita bisa analisa bahwa output yang
dihasilkan akan bergantung pada nilai x, yaitu apakah x ganjil atau genap.

Perulangan

Terkadang dalam program kita, kita ingin agar program kita menjalankan suatu hal yang
sama berulang-ulang kali. Hal tersebut mungkin dilakukan dengan struktur perulangan (looping)
dengan beberapa cara, yaitu :

 Menggunakan sintaks for … to … do … . Contoh :


for i:=1 to 5 do
write(i);
Output dari program tersebut adalah 12345

 Menggunakan sintaks for … downto … do … . Contoh :


for i:=5 downto 1 do
write(i);
Output dari program tersebut adalah 54321

 Menggunakan sintaks while … do … . Contoh :


PELATIHAN ONLINE 2018
KOMPUTER – PAKET 7

x:=0;
while (x<5) do
x:=x+2;
write(x);
Output dari program tersebut adalah 6. Kita dapat mengartikan program tersebut bahwa selama
nilai x masih kurang dari 5, tambahkan 2 ke x. Pada saat nilai x mencapai 6, ia akan keluar dari
perulangan tersebut dan lanjut ke baris selanjutnya, yaitu output.

 Menggunakan sintaks repeat … until … . Contoh :


x:=0;
repeat
x:=x+2;
until (x>5);
write(x);
Output dari program diatas adalah 6. Kita dapat mengartikan program tersebut bahwa x akan
ditambah 2 hingga nilainya lebih dari 5. Setelah nilai x lebih dari 5, ia akan keluar dari perulangan
tersebut dan lanjut ke baris selanjutnya, yaitu output.

Array

Array adalah sekumpulan data yang memiliki tipe data yang sama. Hal ini memudahkan
kita apabila kita ingin memiliki data dengan tipe data yang sama dalam jumlah yang banyak.
Misalkan kita ingin memiliki data nilai siswa (dengan tipe data integer) dan jumlah siswa yang ada
adalah 3. Kita dapat membuat variabel integer nilai1, nilai2, dan nilai3. Tetapi apabila jumlah siswa
yang ada adalah 100, kita tidak mungkin mengetik satu per satu hingga nilai100. Dengan
menggunakan array, kita cukup membuat nilai : array[1..100] of integer, maka akan terbentuk 100
data nilai. Untuk mendapatkan nilai dari siswa ke-X, maka kita cukup memanggil nilai dari nilai[X].

Kemudahan lain yang diberikan array adalah adanya indeks dari array tersebut yang
berupa sebuah integer. Perhatikan contoh berikut ini :
sum:=0;
for i:=1 to 100 do
sum:=sum+nilai[i];
Pada akhir dari program tersebut, nilai dari variabel sum adalah nilai[1] + nilai[2] + nilai[3] +
… + nilai[100]. Dengan melakukan iterasi pada indeks array tersebut, kita dapat melakukan
penjumlahan dari 100 data tersebut tanpa harus menulis satu per satu. Tentunya hal ini berlaku
untuk proses-proses lainnya.

Perlu diingat bahwa array adalah sekumpulan data, sehingga jumlah memori yang
digunakan juga dikalikan dengan banyaknya data yang dipesan. Contoh : apabila kita memiliki
variabel nilai yang merupakan array[1..1000] of integer, maka memori yang dipesan adalah 1000
byte (karena 1 integer = 4 byte/32 bit).
PELATIHAN ONLINE 2018
KOMPUTER – PAKET 7

Fungsi dan Prosedur

Pada dasarnya Fungsi dan Prosedur tergolong dalam Subprogram, dengan kata lain
terdapat bagian program lain di luar program utama kita (main) yang dapat kita gunakan dalam
program kita. Perbedaan dari fungsi dan prosedur adalah fungsi mengembalikan suatu nilai
sedangkan prosedur tidak mengembalikan suatu nilai. Perhatikan contoh berikut ini :
function f(a:integer):integer;
begin
f:=a*a;
end;
procedure g(a:integer);
begin
writeln(a);
end;
Perhatikan sintaks dari fungsi dan prosedur. Seperti yang kita ketahui, bahwa fungsi
mengembalikan suatu nilai sedangkan prosedur tidak. Pada program di atas, fungsi f
mengembalikan suatu integer, yaitu a*a. Dengan kata lain fungsi f(x) mengembalikan nilai kuadrat
dari x. Sedangkan pada prosedur, tidak ada tipe data nilai kembalian, karena prosedur memang
tidak mengembalikan suatu nilai. Prosedur g(a) melakukan output bilangan a.

Perlu diketahui bahwa terdapat beberapa istilah yang digunakan pada suatu fungsi. Kita
gunakan contoh program diatas. Pada program diatas, f dan g merupakan nama fungsi,
sedangkan a merupakan parameter. Pada fungsi f, tipe data a adalah integer (merupakan tipe data
parameter) sedangkan integer disebelahnya merupakan tipe data dari f (merupakan tipe data nilai
kembalian/return value).

Passing Parameter

Terdapat 2 jenis Passing Parameter (pemberian data ke fungsi melalui parameter), yaitu
Passing by Value dan Passing by Reference.

 Passing by Value
Passing Parameter dilakukan dengan memberikan suatu nilai kepada parameter.
Perhatikan contoh berikut :
procedure f(x:integer);
begin
writeln(x);
inc(x);
end;
begin
n:=5;
f(n);
PELATIHAN ONLINE 2018
KOMPUTER – PAKET 7

write(n);
end.
Apabila program tersebut dijalankan, maka outputnya adalah 55 (bukan 56). Hal ini
dikarenakan kita memberikan n hanya sebagai nilai/value, sehingga pada dasarnya yang kita kirim
hanyalah bilangan 5 yang kemudian ditangkap oleh prosedur f untuk dioutputkan. Kemudian dalam
prosedur f, nilai dari x bertambah 1. Tetapi karena yang kita kirim hanyalah nilai 5, maka dalam
memori komputer untuk variabel n, nilainya tidak berubah karena yang kita rubah bukanlah nilai
dalam memori tersebut.

 Passing by Reference
Passing Parameter dilakukan dengan memberikan suatu nilai berserta memori nya kepada
parameter. Perhatikan contoh berikut :
procedure f(var x:integer); //Perhatikan ada tambahan var
begin
writeln(x);
inc(x);
end;
begin
n:=5;
f(n);
write(n);
end.
Apabila program tersebut dijalankan, maka outputnya adalah 56 (bukan 55). Hal ini
disebabkan kita bukan hanya mengirimkan nilai 5, tetapi juga alamat memori dari n. Dengan kata
lain pada saat kita menjalankan proses inc(x), alamat dari x juga merupakan alamat dari n,
sehingga apabila kita mengubah nilai dari x, maka nilai dari n juga ikut berubah. Dengan kata lain
setelah keluar dari fungsi, maka nilai n juga berubah menjadi 6.

Sorting/Pengurutan

Apabila diberikan sebuah array yang berisi banyak data dan kita ingin mengurutkan data
tersebut (baik secara menaik ataupun menurun), terdapat beberapa algoritma pengurutan yang
dapat menyelesaikan permasalahan tersebut. Untuk materi ini, diberikan 3 algoritma sorting :

 Bubble Sort : algoritma sorting dengan melakukan penukaran data dengan data tepat di
sebelahnya secara terus menerus hingga tidak dapat dilakukan penukaran lagi, yaitu data
yang ada sudah terurut.
 Selection Sort : algoritma sorting dengan mencari data yang seharusnya berada pada
posisi tersebut, kemudian memindahkannya ke posisi yang bersesuaian.
 Counting Sort : algoritma sorting dengan meletakkan data pada posisi yang benar, dimana
perhitungan posisi tersebut dilakukan dengan menghitung frekuensi data yang ada.

Rekursi
PELATIHAN ONLINE 2018
KOMPUTER – PAKET 7

Rekursi terjadi apabila suatu fungsi memanggil fungsi itu sendiri dalam prosesnya.
Terdapat beberapa unsur yang wajib ada pada suatu fungsi rekursi, yaitu sebagai berikut :

 Base Case : merupakan kasus dasar, dimana tidak terjadi rekursi pada kasus tersebut. Hal
ini mengakibatkan berhentinya suatu rekursi, sehingga tidak terjadi infinite loop.
 Rekurens : inti dari rekursi tersebut, yaitu bagian dari fungsi yang mengandung unsur
rekursif/memanggil fungsi itu sendiri.

Perhatikan contoh berikut ini sebagai contoh dari rekursi :


function f(x:integer):integer;
begin
if (x==0) then f:=0 //base case
else f:=f(x-1)+1; //rekurens
end;

Terdapat 2 cara untuk mengerjakan soal yang mengandung rekursi dengan tracing, yaitu
Top Down dan Bottom Up.
 Top Down : merupakan cara mengerjakan permasalahan rekursi dimana kita berangkat
mulai dari yang kita cari hingga menemukan base case nya. Apabila kita gunakan fungsi di
atas dan kita ingin mencari f(3), maka f(3)=f(2)+1=f(1)+1+1=f(0)+1+1+1=0+1+1+1=3.
 Bottom Up : merupakan cara mengerjakan permasalahan rekursi dimana kita berangkat
mulai dari base case hingga menemukan apa yang kita cari. Apabila kita gunakan fungsi di
atas, kita ketahui bahwa f(0)=0. Dari situ kita ketahui bahwa f(1)=f(0)+1=1, kemudian kita
ketahui bahwa f(2)=f(1)+1=2, dan f(3)=f(2)+1=3.

Apabila bilangan yang ditanyakan sudah cukup besar sehingga tidak mungkin / sulit untuk
dilakukan tracing, maka kita perlu mencari cara lain. Cara itu adalah dengan mencari arti dari
fungsi tersebut. Perhatikan contoh diatas. Apabila kita perhatikan, maka fungsi f(x) akan
mengembalikan nilai x. Dengan kata lain meskipun ditanyakan nilai dari f(1234567), kita akan
dapat langsung menjawab nilainya adalah 1234567 tanpa melakukan tracing pada rekursinya.
PELATIHAN ONLINE 2018
KOMPUTER – PAKET 7

SOAL

Berikut ini adalah potongan program untuk soal nomor 1.


var a,b : integer;
begin
a:=5;
b:=3;
a:=b;
b:=a
write(a,b)
end.

1. Apakah output dari program di atas?


A. 33
B. 35
C. 3 3
D. 3 5
E. 5 3

Berikut ini adalah potongan program untuk soal nomor 2.


var a,b : integer;
begin
readln(a,b)
if (a mod 3 = 2) then write(a)
else write(b);
end.

2. Apabila diberikan input 4 dan 5, maka output dari program di atas adalah
A. 1
B. 2
C. 3
D. 4
E. 5

Berikut ini adalah potongan program untuk soal nomor 3.


var a,b,c : integer;
begin
readln(a,b,c);
if (a+b=b+c OR a*b=b*c) then inc(c);
write(a+b+c);
end.
PELATIHAN ONLINE 2018
KOMPUTER – PAKET 7

3. Apabila diberikan input 1 2 3, maka output dari program di atas adalah


A. 3
B. 6
C. 7
D. 123
E. 124

Berikut ini adalah potongan program untuk soal nomor 4.


begin
readln(a);
if (a <= 12) then write('P');
if (a mod 7 = 5) then write('O')
else write('I');
end.

4. Apabila diberikan input 13, maka output dari program di atas adalah
A. PO
B. PI
C. OI
D. O
E. I

Berikut ini adalah potongan program untuk soal nomor 5 - 7.


var i,n,x : longint;
begin
readln(n);
x:=0;
for i:=1 to n do
x:=x+i;
writeln(x);
end.

5. Apabila diberikan input 10, maka output dari program tersebut adalah
A. 10
B. 45
C. 50
D. 55
E. 100

6. Apabila diberikan input 2018, maka output dari program tersebut adalah
A. 2035153
B. 2037171
C. 4072324
D. 6052755
E. 8099317
PELATIHAN ONLINE 2018
KOMPUTER – PAKET 7

7. Berapakah nilai minimum yang dapat diinputkan ke program tersebut sehingga outputnya
lebih besar dari 2018?
A. 16
B. 32
C. 64
D. 128
E. 256

Berikut ini adalah potongan program untuk soal nomor 8.


var i,n,x : integer;
begin
readln(n);
x:=0;
for i:=1 to n do
if (i mod 3 = 0 or i mod 5 = 0) then
inc(x);
writeln(x);
end.

8. Apabila diberikan input 2018, maka output dari program tersebut adalah
A. 134
B. 403
C. 941
D. 1075
E. 2018

Berikut ini adalah potongan program untuk soal nomor 9.


var i,n,x : integer;
begin
readln(n);
x:=0;
for i:=1 to n do
for j:=1 to i do
if (i div j = 2) then inc(x)
writeln(x);
end.

9. Apabila diberikan input 10, maka output dari program tersebut adalah
A. 5
B. 7
C. 9
D. 10
E. 11

Berikut ini adalah potongan program untuk nomor 10 - 12.


PELATIHAN ONLINE 2018
KOMPUTER – PAKET 7

function dengklek(n:integer):integer;
var i,cnt : integer;
begin
dengklek:=1;
for i:=2 to n do
if(n mod i = 0) then begin
cnt:=0;
while (n mod i = 0) do
begin
n:=n div i;
cnt:=cnt+1;
end;
dengklek:=dengklek*(cnt+1);
end;
end;
10. Berapakah nilai dari dengklek(15)?
A. 12
B. 6
C. 4
D. 3
E. 1

11. Berapakah nilai dari dengklek(2018)?


A. 4
B. 8
C. 2016
D. 2017
E. 2018

12. Berapakah n mininum sehingga dengklek(n) bernilai 10?


A. 72
B. 48
C. 36
D. 25
E. 24

Berikut ini adalah potongan program untuk nomor 13.


function f(x : integer):boolean;
var
cek:boolean;
idx:integer;
begin
cek := true;
idx := 2;
while(idx*idx <= x) do
begin
if (x mod idx) = 0 then begin
PELATIHAN ONLINE 2018
KOMPUTER – PAKET 7

cek := false;
break;
end;
inc(idx);
end;
f:=cek;
end;

13. Manakah pemanggilan fungsi f(x) dibawah ini yang mengembalikan nilai false?
A. 101
B. 97
C. 91
D. 89
E. 83

Berikut ini adalah potongan program untuk nomor 14.


var x,y:integer;
begin
x:=10;
y:=10;
x:=x*x;
y:=x;
if (x<y) then x:=y-1
else if (x>y) then x:=y+1;
x:=y div x;
writeln(x+y);
end.

14. Output dari program di atas adalah


A. 101
B. 97
C. 91
D. 89
E. 83

Berikut ini adalah potongan program untuk nomor 15 dan 16.


var i,n,a,b,c : integer;
begin
readln(n);
a:=0; b:=1;
for i:=1 to n do begin
c:=a+b;
a:=b;
b:=c;
end;
PELATIHAN ONLINE 2018
KOMPUTER – PAKET 7

writeln(a);
end.

15. Apabila diberikan input 5, maka output dari program di atas adalah
A. 5
B. 10
C. 25
D. 60
E. 100

16. Apabila diberikan input 12, maka output dari program di atas adalah
A. 12
B. 24
C. 60
D. 120
E. 144

Berikut ini adalah potongan program untuk nomor 17 dan 18.


var a,b:integer;
begin
a := 13;
b := 1;
while(a <= n) do begin
a := a + b;
b := b + 1;
end;
writeln(a, ' ', b);
end.

17. Dari pilihan berikut ini, berapakah nilai n yang TIDAK membuat nilai a di akhir adalah 79?
A. 67
B. 68
C. 69
D. 70
E. 71

18. Berapakah nilai n maksimum yang membuat nilai b di akhir bernilai 15?
A. 117
B. 118
C. 119
D. 133
E. 134

Berikut ini adalah potongan program untuk nomor 19 dan 20.


PELATIHAN ONLINE 2018
KOMPUTER – PAKET 7

var A:array[0..9] of integer = (6,1,3,7,0,8,-2,-4,1,3);


i,l,r,n,m:integer;
begin
readln(l,r);
n:=0;
m:=0;
for i:=l to r do begin
inc(n);
m:=m+A[i];
end;
writeln(m div n);
end.

19. Apabila diberikan input 3 dan 5, maka output dari program di atas adalah
A. 2
B. 3
C. 3.33333
D. 5
E. 5.55555

20. Apabila diberikan input 1 dan 7, maka output dari program di atas adalah
A. 0
B. 1
C. 2
D. 3
E. 4

Berikut ini adalah potongan program untuk nomor 21 dan 22.


var cnt:array[0..2018] of integer;
i,l,r:integer;
begin
for i:=0 to 2018 do
if ((i mod 7 = 0) or (i mod 2 = 0)) then cnt[i]:=0
else cnt[i]:=1;
for i:1 to 2018 do cnt[i]:=cnt[i]+cnt[i-1];
readln(l,r);
writeln(A[r]-A[l]);
end.

21. Apabila diberikan input 1 dan 10, maka output dari program di atas adalah
A. 3
B. 4
C. 6
D. 7
E. 8

22. Apabila diberikan input 1000 dan 2000, maka output dari program di atas adalah
PELATIHAN ONLINE 2018
KOMPUTER – PAKET 7

A. 427
B. 428
C. 429
D. 572
E. 573

Berikut ini adalah potongan program untuk nomor 23 - 25.


function kali(x,y:longint):longint;
var i,j:integer;
begin
j:=1;
for i:=1 to y do j:=j*x;
kali:=j;
end;

var jumlah,i:longint;
begin
jumlah:=0;
for i:=0 to 5 do jumlah:=jumlah+kali(4,i);
writeln(jumlah);
end.

23. Berapakah nilai dari kali(2,2)?


A. 1
B. 2
C. 3
D. 4
E. 5

24. Berikut ini manakah pernyataan yang salah?


A. kali(3,4)<kali(3,5)
B. kali(2,2)<kali(3,3)
C. kali(2,1)<=kali(1,2)
D. kali(1,5)<=kali(1,4)
E. kali(4,3)<=kali(3,4)

25. Apakah output dari program di atas?


A. 4
B. 15
C. 60
D. 1024
E. 1365

Berikut ini adalah potongan program untuk nomor 26 dan 27.


function kuadrat(x:integer):boolean;
var i,cnt:integer;
PELATIHAN ONLINE 2018
KOMPUTER – PAKET 7

begin
cnt:=0;
for i:=2 to x-1 do
if (x mod i=0) then inc(cnt);
if (cnt=0) then kuadrat:=true
else kuadrat:=false;
end;

var jumlah,i:integer;
begin
jumlah:=0;
for i:=1 to 20 do
if (kuadrat(i)) then
jumlah:=jumlah+1; {1}
writeln(jumlah);
end.

26. Berapakah output dari program di atas?


A. 5
B. 6
C. 7
D. 8
E. 9

27. Apabila baris yang ditandai dengan tanda {1} diganti menjadi jumlah:=jumlah+i, maka output
dari program di atas adalah
A. 20
B. 30
C. 77
D. 78
E. 210

Berikut ini adalah potongan program untuk nomor 28 dan 29.


var n,m : int64;
bit : array[0..10] of int64 = (1,1,1,1,1,1,0,0,0,1,0);
i : integer;

function kali(x,y : int64):int64;


var i : integer;
ret : int64;
begin
ret:=1;
for i:=1 to y do ret:=ret*x;
kali:=ret;
end;

begin
PELATIHAN ONLINE 2018
KOMPUTER – PAKET 7

readln(n);
m:=0;
for i:=0 to 10 do begin
m:=m+bit[10-i]*kali(n,i);
end;
writeln(m);
end.

28. Apabila diberikan input 2, maka output dari program di atas adalah
A. 2016
B. 2017
C. 2018
D. 11111100001
E. 11111100010

29. Apabila diberikan input 10, maka output dari program di atas adalah
A. 2016
B. 2017
C. 2018
D. 11111100001
E. 11111100010

Berikut ini adalah potongan program untuk nomor 30.


var A:array[0..9] of integer=(3,7,4,6,1,2,45,67,2,5);
x,i:integer;
begin
x:=0;
for i:=0 to 9 do
if (x<A[i]) then x:=A[i]
writeln(x);
end.

30. Apakah output dari program di atas?


A. 1
B. 9
C. 10
D. 67
E. 69

*Akhir dari soal*


PELATIHAN ONLINE 2018
KOMPUTER – PAKET 7

PEMBAHASAN PAKET 6

1. Problem tersebut adalah problem klasik “Coin Change” yang dapat diselesaikan dengan
Dynamic Programming. Tetapi perhatikan bahwa pecahan mata uang yang ada merupakan
kelipatan dari 2^n, sehingga dapat kita lakukan Greedy. Sehingga ambil terus pecahan mata
uang yang paling besar selama uang yang tersisa masih ada.

Jawabannya adalah “5” (C).

2. Untuk soal ini, kita harus menggunakan Dynamic Programming. Jawabannya adalah 1500
sebanyak 10 dan 800 sebanyak 3. Perhatikan apabila kita menggunakan Greedy, kita akan
menukarkan dengan 1500 sebanyak 11, kemudian tersisa 900 yang tidak dapat kita tukarkan.

Jawabannya adalah “13” (B).

3. Kita dapat menyelesaikan problem ini dengan Dynamic Programming. Misalkan f(x) adalah
banyaknya cara berbeda apabila terdapat x buah kardus. Dalam sebuah perjalanan terdapat 2
buah cara, yaitu membawa 1 “atau” 2 (gunakan aturan penjumlahan). Apabila kita membawa 1,
problem kita berubah menjadi f(x-1). Apabila kita membawa 2, problem kita berubah menjadi
f(x-2). Sehingga solusinya f(x)=f(x-1)+f(x-2).

Jawabannya adalah “233” (E).

4. Kita dapat menyelesaikan problem ini dengan Dynamic Programming. Misalkan f(x,y) adalah
poin maksimum yang dapat Budi peroleh pada saat Ia berada di petak (x,y). Karena Ia hanya
bisa bergerak ke (r,c+1), (r+1,c+1), atau (r-1,c+1, maka nilai dari f(x,y) bergantung pada f(x,y-1),
f(x-1,y-1), dan f(x+1,y-1). Karena kita ingin memaksimalkan, maka f(x,y) = max( f(x,y-1), f(x-1,y-
1), f(x+1,y-1) ) + poin[x][y] (maksimum dari petak sebelumnya ditambah dengan poin petak
sekarang).

Jawabannya adalah “16” (D).

5. Sama dengan soal sebelumnya.

Jawabannya adalah “17” (E).

6. Penyelesaiannya mirip dengan soal sebelumnya. Misalkan g(x,y) adalah banyak cara berbeda
yang dapat Budi lakukan untuk memperoleh poin maksimum. Perhatikan bahwa kita harus
mengambil poin 2, 4, dan 3 agar menghasilkan poin maksimum. Sehingga, g(x,y)=g(x,y-1)+g(x-
1,y-1)+g(x+1,y-1) (banyaknya cara menuju petak sekarang adalah penjumlahan dari banyaknya
cara menuju petak sebelumnya). Tetapi agar kita tetap menjaga poin maksimum, apabila di
kolom ada yang lebih besar daripada 1 (misalkan kolom ke-3 terdapat poin 2), jika poin yang
PELATIHAN ONLINE 2018
KOMPUTER – PAKET 7

kita ambil tetap 1 maka nilai dari g adalah 0 (sehingga tidak kita ambil, karena kita ingin yang
semaksimum mungkin).

Jawabannya adalah “35” (A).

7. Kita dapat menggunakan Greedy. Untuk memperoleh keuntungan maksimum, belilah beras
dengan harga seminimum mungkin.

Jawabannya adalah “RP 31.400” (C).

8. Kita dapat menggunakan Greedy. Agar menghasilkan total selisih minimal, selisihkan bilangan
yang bersebelahan.

Jawabannya adalah “12” (D).

9. Kita dapat menggunakan Greedy. Agar menghasilkan total selisih maksimal, selisihkan bilangan
yang berjauhan.

Jawabannya adalah “46” (D).

10. Perhatikan apabila kita bagi bilangan tersebut menjadi 2 buah kelompok, kiri dan kanan.
Kelompok kiri adalah 3, 4, 5, dan 9. Sedangkan kelompok kanan adalah 12, 17, 18, dan 20.
Apabila kita memasangkan 1 bilangan di kiri dan 1 bilangan di kanan secara acak dan mencari
total selisihnya, kita akan tetap mendapatkan jawaban 46. Sehingga jawabannya adalah
4!*(2^n) (4! dari banyaknya cara permutasi 4 buah bilangan, 2^n karena (A,B) dan (B,A)
dianggap pasangan yang berbeda).

Jawabannya adalah “384” (E).

11. Problem ini adalah Coin Change, yang dapat diselesaikan dengan Dynamic Programming.
Jawabannya adalah dengan mengambil 4 koin sebanyak 3 dan 3 koin sebanyak 2. Perhatikan
apabila kita melakukan Greedy, kita tidak akan mendapatkan hasil yang optimal (4 koin
sebanyak 4 dan 1 koin sebanyak 2).

Jawabannya adalah “5” (B).

12. Karena bilangannya 2^n, kita bisa melakukan Greedy. Solusinya adalah dengan
mengambil koin 4 sebanyak 4 dan koin 2 sebanyak 1.

Jawabannya adalah “5” (B).


PELATIHAN ONLINE 2018
KOMPUTER – PAKET 7

13. Problem ini adalah Longest Increasing Subsequence, yang dapat diselesaikan dengan
Dynamic Programming. Tetapi perhatikan bahwa mencari jawaban dengan coba-coba akan
lebih cepat karena banyaknya calon jawaban tidak terlalu banyak. Jawabannya adalah 1, 2, 3,
5, 6, 7.

Jawabannya adalah “6” (D).

14. Sebenarnya kita bisa menyelesaikan dengan Dynamic Programming, tetapi terdapat cara
lain untuk menyelesaikan soal ini yaitu dengan observasi. Perhatikan bahwa apabila sisa batu
yang ada merupakan kelipatan 5, maka pemain yang bermain di putaran tersebut pasti kalah
(karena setiap Ia mengambil X buah batu, musuhnya akan selalu bisa mengambil 5-X, sehingga
pemain terakhir yang mengambil batu pasti musuhnya).

Jawabannya adalah “Pak Dengklek tidak mungkin menang.” (E).

15. Untuk membuat Pak Chanek kalah, Pak Dengklek harus mengambil 3 batu sehingga Pak
Chanek memperoleh jumlah batu kelipatan 5.

Jawabannya adalah “3” (C).

16. Kita dapat menggunakan Greedy. Agar luas yang diperoleh maksimum, pasangkan
bilangan yang besar dengan yang besar. Sehingga diperoleh 3*2 + 4*5 + 6*5 + 8*7 + 9*8.

Jawabannya adalah “184” (D).

17. Kebalikan dari soal sebelumnya, yaitu pasangkan bilangan yang besar dengan yang kecil.

Jawabannya adalah “140” (E).

18. Gunakan Dynamic Programming untuk menyelesaikan soal ini. Misalkan f(x,y) adalah
banyaknya bilangan indah dengan jumlah digit x dan digit terakhir y (kita membutuhkan digit
terakhir sehingga kita dapat memastikan yang kita hitung adalah yang selisih antar digit
bersebelahan tidak lebih dari 1). Sehingga f(x,y)=f(x-1,y-1)+f(x-1,y)+f(x-1,y+1) dimana apabila
y<0 atau y>9, maka nilai dari f(x,y) adalah 0 (karena tidak valid). Perhatikan juga bahwa khusus
untuk untuk x=1, f(1,0)=f(0,1) dan f(1,1)=f(0,1)+f(0,2) karena digit pertama tidak boleh angka
nol.
Cara lain tentunya adalah karena hanya 2 digit, Anda bisa menguli jawabannya :) tetapi akan
sulit apabila dilakukan untuk soal selanjutnya, yaitu 3 digit.

Jawabannya adalah “26” (A).

19. Sama dengan soal sebelumnya.


PELATIHAN ONLINE 2018
KOMPUTER – PAKET 7

Jawabannya adalah “75” (B).

20. Untuk menyelesaikan soal ini, kita dapat gunakan Greedy dan sedikit Observasi. Greedy
nya adalah, agar kota dengan jumlah penduduk kecil bisa bertahan hingga akhir, kota tersebut
harus bergabung dengan kota lainnya yang lebih kecil. Sehingga, pertama kita urutkan kota-
kota yang ada berdasarkan jumlah penduduk secara menaik. Kemudian kita perlu mencari kota
pertama yang apabila sudah digabungkan dengan semua kota yang lebih kecil akan bisa
bertahan hingga akhir. Perhatikan apabila kota tersebut bisa bertahan hingga akhir, maka
semua kota dengan penduduk yang lebih besar juga bisa bertahan hingga akhir.

Jawabannya adalah “5” (D)

21. Sama dengan soal sebelumnya.

Jawabannya adalah “97” (E).

22. Kita dapat menyelesaikan soal ini dengan Dynamic Programming. Pertama, kita harus
mencari persegi panjang dengan ukuran 1 x P yang tidak dapat dipecah lagi dengan persegi
panjang yang lebih kecil. Kemudian, kita bisa buat rekurens dari Dynamic Programming yang
ada. Apabila Anda sudah mencari persegi panjang dengan benar, maka seharusnya Anda akan
menemukan rekurensnya f(x)=2*(f(x-1)+f(x-2)+...+f(0)).

Jawabannya adalah “18” (B).

23. Sama dengan soal sebelumnya.

Jawabannya adalah “4374” (B).

24. Meskipun dapat diselesaikan dengan Dynamic Programming, perhatikan karena pilihan
yang ada jawabannya kecil-kecil, sepertinya akan lebih cepat apabila dikuli daripada
menggunakan Dynamic Programming. Dan hal tersebut memang benar.

Jawabannya adalah “3” (B).

25. Sama dengan soal sebelumnya.

Jawabannya adalah “9” (D).

26. Observasi pertama adalah kita tidak perlu mengambil bola yang dilemparkan ke keranjang
terakhir, sehingga kita ingin agar lemparan terakhir merupakan lemparan dari ujung ke ujung
(jarak terjauh). Kita bisa menyelesaikan dengan Greedy, yaitu akan lebih baik jika kita
PELATIHAN ONLINE 2018
KOMPUTER – PAKET 7

menyelesaikan semua di kiri atau kanan (kecuali yang paling ujung karena akan menjadi
lemparan terakhir) baru berbalik arah. Cara tersebut akan lebih optimal daripada bolak-balik kiri
dan kanan.

Jawabannya adalah “5” (B).

27. Sama dengan soal sebelumnya.

Jawabannya adalah “46” (D).

28. Kita bisa gunakan Greedy untuk menyelesaikan soal ini. Ambil selalu yang membuat
bilangan baru tersebut lebih besar (belum tentu yang paling besar di bilangan awal. Sebagai
contoh, 101 dan 99 jika digabung akan lebih maksimal 99101 daripada 10199).

Jawabannya adalah “8763534138321726” (D).

29. Sama dengan soal sebelumnya.

Jawabannya adalah “7354133825221135” (C).

30. Soal ini memang mirip dengan soal Ambil Batu sebelumnya, tetapi untuk yang kali ini tidak
ada cara lain selain Dynamic Programming (ada cara lain, yaitu menggunakan Game Theory,
tetapi belum waktunya untuk Anda pelajari :) Apabila tertarik, silahkan mencari Game Theory
tentang Nim Game). Misalkan f(x) mengembalikan nilai true/false apakah pemain pada putaran
tersebut akan menang atau kalah. Apabila kita mengambil batu sebanyak k, maka musuh kita
akan mendapatkan f(x-k). Apabila ada setidaknya 1 nilai k dimana f(x-k) membuat musuh kalah,
maka kita pasti menang. Apabila semuanya membuat musuh menang, maka kita pasti kalah.

Jawabannya adalah “11” (C).


PELATIHAN ONLINE 2018
KOMPUTER – PAKET 7

KISAH PERJALANAN MEDALIS


Lie, Maximilianus Maria Kolbe (T.Informatika BINUS 2015) – Bidang Komputer

Pertama kali saya mengikuti OSN adalah saat saya duduk di bangku SD kelas 5 dengan bidang Matematika,
dan saya gugur di tingkat Provinsi. Kedua kali saya mengikuti OSN adalah SMP kelas 8 dengan bidang
Matematika, dan saya berhasil mencapai tingkat Nasional namun tidak mendapatkan medali. OSN Ketiga
saya adalah SMP kelas 9 mengikuti OSN SMA bidang Matematika dan saya gugur di tingkat Provinsi.

Setelah saya merasakan kejenuhan di bidang Matematika, saya mulai ingin mencoba bidang lain, dan
kebetulan oleh kakak saya disarankan untuk pindah ke bidang Komputer. Pada awalnya saya tidak tahu
apa-apa tentang OSN Komputer. Berbeda jauh dengan Matematika yang selalu saya siapkan dengan baik,
kali ini saya benar-benar tidak tahu harus berbuat apa, bahkan tak ada satupun guru yang melatih. Apa
boleh buat saya harus belajar “Programming” sendiri.

Namun karena saya sebelumnya dari OSN Matematika, akhirnya OSN 2013 Bidang Komputer saya lolos ke
tingkat Nasional karena 50% dari soalnya merupakan soal logika. Dan setelah saya mengikuti Pelatda Jawa
Tengah tahun 2013, saya baru menyadari ternyata Competitive Programming itu jauh lebih rumit dari yang
saya bayangkan. Pada saat itu saya benar-benar tidak tahu apa-apa, dan selama satu bulan saya harus
mengikuti pelatihan yang begitu berat, alhasil OSN 2013 saya tidak mendapatkan medali, tapi cukup bagi
saya untuk menguatkan basic saya tentang Programming.

Untuk mempersiapkan OSN 2014, saya sudah ada gambaran tentang materi, kisi-kisi, dan apa yang harus
saya pelajari. Saya pun mulai belajar sendiri, dan progress mulai terlihat saat saya mengerjakan soal-soal
dari Online Judge seperti tokilearning.org,
uva.onlinejudge.org, dan codeforces.com. Akhirnya
saya pun lolos ke tingkat nasional untuk sekali lagi,
dan mengikuti pelatda dari Jawa Tengah sekali lagi,
dan terus mendalami Competitive Programming.

Yang saya rasakan saat itu adalah, saya telah


mengikuti OSN selama kurang lebih 7 tahun, dan saya
tidak mendapatkan medali apapun. Saya ingin OSN
yang paling akhir ini saya mendapatkan medali, saya
akan berusaha sekeras mungkin untuk mendapatkan
medali pada tahun ini. Alhasil pada OSN 2014 total
score saya 394 dari nilai maksimal 800, dan saya
mendapatkan medali perunggu pertama. Memang
hanya terpaut sedikit antara score saya dengan peraih
perak terakhir, namun saya tetap bersyukur karena
pada akhirnya saya berhasil mendapatkan medali.
Dan saya selalu ingat saat pemanggilan medalist OSN,
saat nama saya dipanggil dan saya berlari ke
panggung depan untuk menerima medali OSN
pertama dan terakhir saya, perasaan itulah yang terus
mendorong saya untuk terus mendalami Competitive
Programming sehingga bisa mengikuti ajang
kompetisi di tingkat universitas, maupun menjadi pelatih bagi adik kelas saya yang merasa ingin mengikuti
PELATIHAN ONLINE 2018
KOMPUTER – PAKET 7

dan memenangkan OSN. Karena saya tahu benar saat saya tidak tahu apapun yang saya harus pelajari, saya
berharap tidak ada orang lagi yang kesulitan untuk belajar OSN seperti saya.

“Kita hanya butuh satu hal sederhana untuk menjadi pemenang, yaitu
Semangat “

You might also like