Pembahasan Soal Olimpiade Sains Nasional 2004 Bidang Informatika Pekanbaru, Agustus 2004

dokumen-dokumen yang mirip
OLIMPIADE SAINS NASIONAL VIII

OLIMPIADE SAINS NASIONAL IX

OLIMPIADE SAINS NASIONAL VII

Hari 1 / Soal 1: Bukit dan Lembah

Faktorial. Kode Soal: OSN601 Batas Run-time: 1 detik / test-case Batas Memori: 32 MB Masukan: Standard input Keluaran: Standard output

KEMENTERIAN PENDIDIKAN DAN KEBUDAYAAN

Olimpiade Sains Nasional XI Bidang Komputer/Informatika

OLIMPIADE SAINS NASIONAL VII

a. TRUE b. FALSE c. Jawaban A dan B keduanya dimungkinkan benar d. Tidak dapat ditentukan e. Tidak ada jawaban di antara A, B, C, D yang benar

TINGGI KANDANG SUSUN

KEMENTERIAN PENDIDIKAN DAN KEBUDAYAAN

KEMENTERIAN PENDIDIKAN DAN KEBUDAYAAN

INFORMATIKA/KOMPUTER. Hari 0 (Sesi Latihan) 1. Empek-empek 2. Gunting Kertas 3. Matriks Biner

OLIMPIADE SAINS NASIONAL IX

KEMENTERIAN PENDIDIKAN DAN KEBUDAYAAN

INFORMATIKA/KOMPUTER

OLIMPIADE SAINS NASIONAL VII

OLIMPIADE SAINS NASIONAL VIII

Pertahanan Pekanbaru. Deskripsi. Format Masukan. Time limit: 1 s. Memory limit: 64 MB

OLIMPIADE SAINS NASIONAL VII

Algoritma + Pemrograman Pascal

INFORMATIKA/KOMPUTER. Hari Pasar 16 Ilir 2. Menjinakkan Bom 3. Pos Wisata Sungai

SOAL PASCAL A. 1. Lengkapi Source Code Dibawah ini : {* Program Menghitung dengan Operator Matematika*}

Bundel Soal Sesi 2 Bidang Informatika Olimpiade Sains Nasional X

Hari 2 1. Robot Pempek 2. Belanja Suvenir 3. Wisata Palembang

KEMENTERIAN PENDIDIKAN DAN KEBUDAYAAN

OLIMPIADE SAINS NASIONAL VIII

Algoritma Pemrograman

LAPORAN PRAKTIKUM ALGORITMA DAN PEMROGRAMAN ( Implementasi Rekursi Pada Java)

Bundel Soal Sesi 3 Bidang Informatika Olimpiade Sains Nasional X

Problem A Divisible compfest1.c / compfest1.cpp / compfest1.pas Runtime-limit: 0.5 detik Memory-limit: 64 MB

OLIMPIADE SAINS NASIONAL VIII

Olimpiade Sains Nasional XI Bidang Komputer/Informatika

Algoritma Pemrograman

Sang Pelompat. Batas Waktu 1 detik. Batas Memori 64 MB

Teori Algoritma TIPE DATA

OLIMPIADE SAINS 2012 TINGKAT KABUPATEN/KOTA BIDANG INFORMATIKA/KOMPUTER. Lembar Peraturan dan Peringatan Selama Ujian

OLIMPIADE NASIONAL INFORMATIKA

Tipe Data dan Variabel. Dosen Pengampu Muhammad Zidny Naf an, M.Kom

(Struktur Kondisi dan Perulangan) KOMPETENSI DASAR

Programmer dan Meeting

Struktur Data. Belajar Struktur Data Menggunakan Pascal Pertemuan-1

OLIMPIADE SAINS 2012 TINGKAT KABUPATEN/KOTA BIDANG INFORMATIKA/KOMPUTER. Lembar Peraturan dan Peringatan Selama Ujian

OLIMPIADE SAINS NASIONAL 2015 DESKRIPSI SOAL

PSEUDOCODE TIPE DATA, VARIABEL, DAN OPERATOR

SOAL C++ Created by Yuli Astuti,S.Kom Copyright 2009

Sebuah algoritma tidak saja harus benar, tetapi juga harus mangkus (efisien). Algoritma yang bagus adalah algoritma yang mangkus.

MODUL 1. Struktur Bahasa PASCAL secara umum

1. Kompetensi Mengenal dan memahami notasi-notasi algoritma yang ada.

Algoritma Pendukung Kriptografi

& PEMROGRAMAN. Alex De Kweldju, S.Kom D3 Teknik Komputer Fakultas Teknik Universitas Negeri Papua

Perulangan. Bentuk Proses. 1. Perulangan For positif contoh 1 : perulangan positif untuk satu statement :

VARIABEL, TIPE DATA, KONSTANTA, OPERATOR DAN EKSPRESI. Pemrograman Dasar Kelas X Semester 2

TEKNIK OPTIMASI. Dependensi Optimasi. Optimasi Lokal. Menghasilkan kode program dengan ukuran yang lebih kecil, sehingga lebih cepat eksekusinya.

Algoritma dan Struktur Data

Perbandingan Algoritma Brute Force dan Backtracking dalam Permainan Word Search Puzzle

BAB VII ALGORITMA DIVIDE AND CONQUER

Soal hari Jumat (16/10) Latihan 10 MS

Algoritma dan Pemrograman Lanjut. Pertemuan Ke-5 Rekursif

OLIMPIADE SAINS 2012 TINGKAT KABUPATEN/KOTA BIDANG INFORMATIKA/KOMPUTER. Lembar Peraturan dan Peringatan Selama Ujian

Contoh Soal Olimpiade Sains BIDANG INFORMATIKA/KOMPUTER dan Pembahasan

Algoritma Pemrograman

Konstruksi Dasar Algoritma

P11 Array. A. Sidiq Purnomo Program Studi Teknik Informatika Universitas Mercu Buana Yogyakarta

Problem A. Turnamen Panco

ALGORITMA PERULANGAN

INFORMATIKA/KOMPUTER. Hari 0 (Sesi Latihan) 1. Empek-empek 2. Gunting Kertas 3. Matriks Biner

STRATEGI DIVIDE AND CONQUER

Variabel dan Tipe Data Kusrini 1, Heri Sismoro 2

TUGAS MATA KULIAH TEKNIK KOMPILASI

Rekursif. Rekursif adalah salah satu metode dalam dunia matematika dimana definisi sebuah fungsi mengandung fungsi itu sendiri.

ALGORITMA TUGAS 2 RESUME ALGORITMA PERCABANGAN DAN ALGORITMA PERULANGAN. Disusun Oleh : Sakina Mawardah Teknik Informatika. Dosen : Asep M. Yusuf, S.

BAB V Tujuan 5.1 Rekursi Dasar

Percabangan & Perulangan

menunjukkan tipe hasil dari fungsi. sqr, succ dan sebagainya. buat sendiri.

ALGORITMA PEMOGRAMAN SEMESTER GENAP 2017/2018

PENCARIAN BERUNTUN (SEQUENTIAL SEARCHING)

Kisi-Kisi dan Materi Uji Olimpiade Sains BIDANG INFORMATIKA/KOMPUTER

PUTERA BATAM LOGIKA INFORMATIKA DAN ALGORITMA DAFTAR ISI. BAB IV : PEMILIHAN A. Pengertian

BAB I PENGENALAN STRUKTUR DATA DAN ALGORITMA

SOAL LATIHAN OLIMPIADE KOMPUTER

Bab 1 Algoritma dan Pemrograman Tersruktur

Teori Algoritma. Struktur Algoritma

ANALISIS ALGORITMA. Disusun Oleh: Analisis Masalah dan Running Time. Adam Mukharil Bachtiar Teknik Informatika UNIKOM

Pengantar dalam Bahasa Pemrograman Turbo Pascal Tonny Hidayat, S.Kom

OLIMPIADE SAINS NASIONAL IX

BAB III ANALISIS DAN PERANCANGAN

PERSEGI ANGKA-HURUF VERTIKAL

Soal hari Selasa (13/10) Latihan 7 AN

MODUL PRAKTIKUM. MODUL I - VIII Modul penuntun dan bahan praktikum matakuliah algoritma dan pemograman

Algoritma Puzzle Pencarian Kata

Pembahasan OSN Informatika 2017

PENGGUNAAN ALGORITMA DIVIDE AND CONQUER UNTUK OPTIMASI KONVERSI BILANGAN DESIMAL KE BINER

OLIMPIADE SAINS TINGKAT PROVINSI (OSP) 2010 BIDANG INFORMATIKA. Untuk dikerjakan Selama 150 menit (2½ jam) Bagian Informasi

UNIVERSITAS GUNADARMA

SEKOLAH TINGGI MANAJEMEN INFORMATIKA DAN KOMPUTER STMIK AMIKOM YOGYAKARTA

BAGIAN A : TES KEMAMPUAN ARITMATIK,ANALITIK DAN LOGIKA

BAB III ANALISIS DAN PERANCANGAN

[Type the company name] [Type the document title] [Type the document subtitle] Gilang Abdul Aziz [Pick the date]

Struktur dan Kondisi Perulangan. Struktur Kondisi

Transkripsi:

Pembahasan Soal Olimpiade Sains Nasional 2004 Bidang Informatika Pekanbaru, 23-27 Agustus 2004 Soal 1. Membuka String Terlipat Penulis: Ilham Kurnia Nama Program: LIPAT2.PAS / C / CPP Batas Run-time: 0.1 detik / test-case Batas Memori: 16 MB Nama Berkas Masukan: Standard Input Nama Berkas Keluaran: Standard Output Akhir-akhir ini Pak Dengklek suka bermain-main dengan string terlipat. Apa yang dimaksud dengan string terlipat? String terlipat adalah salah satu cara ringkas untuk menampilkan sebuah string. Mari kita lihat contohnya terlebih dahulu. String AAAAAAAAAABABABCCD dapat kita lipat sehingga 9(A)3(AB)CCD. Ini artinya bahwa string sesungguhnya berisi A diulang 9 kali, dilanjutkan dengan AB yang diulang 3 kali dan diakhiri dengan CCD. Berikut ini adalah definisi formal dari string terlipat.? Sebuah string yang terdiri dari sebuah karakter 'A'..'Z' dianggap sebagai string yang terlipat (jadi "A" adalah sebuah string yang terlipat). Bila lipatan dari string ini dibuka maka akan dihasilkan string yang sama yaitu sebuah karakter tadi.? Jika S dan Q adalah string yang terlipat (S dan Q di sini adalah variabel), maka SQ juga adalah string yang terlipat. Jika lipatan S dibuka menjadi S' dan Q dibuka menjadi Q', maka SQ dibuka menjadi S'Q'.? Jika S adalah string terlipat, maka X(S) juga adalah string terlipat, di mana X adalah bilangan bulat positif (dan X tidak akan diawali oleh angka 0). Jika S dibuka menjadi S', maka X(S) dibuka menjadi S' yang diulang sebanyak X kali. Pak Dengklek terkadang lupa dengan bentuk asli dari string terlipat. Oleh karena itu, ia meminta bantuan kalian untuk membuka lipatan dari string yang terlipat sehingga diperoleh string aslinya. FORMAT MASUKAN Masukan terdiri dari hanya satu baris saja. Baris tersebut berisi 1..100 karakter yang setiap karakternya termasuk dalam himpunan { 'A', 'B',..., 'Z', '0', '1',..., '9', '(', ')' }. String masukan adalah string terlipat yang benar (formatnya sesuai dengan definisi di atas). Pembahasan Soal OSN 2004 Halaman 1

CONTOH MASUKAN 9(A)3(AB)CCD FORMAT KELUARAN Keluaran terdiri dari hanya satu baris saja yang berisi string yang sudah dibuka lipatannya. String yang sudah dibuka lipatannya tidak akan berisi lebih dari 100 karakter. CONTOH KELUARAN AAAAAAAAAABABABCCD CONTOH MASUKAN 2 2(TOKI3(YES)) CONTOH KELUARAN 2 TOKIYESYESYESTOKIYESYESYES Peringatan Jangan lupa untuk tidak menambahkan spasi di awal dan akhir. Pembahasan Cara termudah untuk menyelesaikan soal ini adalah dengan menggunakan rekursi. Algoritmanya adalah sebagai berikut: 1 posisi := 1 2 3 fungsi rekursi : string 4 tmp := ; 5 while (posisi = panjang(input) dan input[posisi]? ) ) 6 jika input[posisi] adalah 7 0..9: jika angka belum diinisialisasi 8 angka := input[posisi] 9 jika sudah, angka := angka * 10 + input[posisi] 10 ( : { tambahkan tmp sebanyak angka * hasil rekursi } 11 tmp := tmp + (rekursi) angka 12 angka := belum diinisialisasi 13 A..Z: tmp := tmp + input[posisi] 14 15 posisi := posisi + 1; 16 rekursi := tmp; Pembahasan Soal OSN 2004 Halaman 2

Kasus dasar dari fungsi rekursi adalah jika kita telah menemukan karakter ) atau ketika input telah habis diiterasi. Kasus rekursifnya adalah ketika kita menemukan karakter (. Perlu diingat, selalu ada bilangan bulat positif yang mendahului (. Berhubung keluaran bisa terdiri dari 100 karakter, maka bisa jadi bilangan bulat positif ini memiliki lebih dari satu digit. Dalam soal ini, disediakan 20 test case dengan rincian sebagai berikut: N o Deskripsi 1 Sebuah karakter A 2 Dua buah karakter B 3 Lima buah karakter C 4 Seratus buah karakter D 5 1(E) 6 9(F) 7 27(G) 8 100(H) 9 1(IJK) 10 5(IJK) 11 33(IJK) 12 1(2(3(4(L)M)N)O) 13 1(L2(M3(N4(O)))) 14 Acak 15 Acak 16 Acak 17 Acak 18 Acak 19 A1(1(1(1(1...1(A1(...1(A))...) 20 1(1(1(1(2(1(1(1(1(2...1(1(1(X)))...)) Berikut adalah source code dari solusi di atas: program MembukaStringTerlipat; const InFile = 'LIPAT2.IN'; OutFile = 'LIPAT2.OUT'; var s : string; i : integer; function caristring() : string; var tmp, h : string; num, j : integer; tmp := ''; num := -1; while (i <= length(s)) and (s[i] <> ')') do Pembahasan Soal OSN 2004 Halaman 3

case s[i] of '0'..'9': if (num = -1) then num := ord(s[i]) - ord('0') else num := num * 10 + (ord(s[i]) - ord('0')); '(' : inc(i); h := caristring(); for j := 1 to num do tmp := tmp + h; num := -1; else tmp := tmp + s[i]; inc(i); caristring := tmp; assign(input, InFile); assign(output, OutFile); reset(input); rewrite(output); i := 1; readln(s); writeln(caristring); close(input); close(output); end. Pembahasan Soal OSN 2004 Halaman 4

Soal 2. Permutasi Penulis: Ilham Kurnia Nama Program: PERM2.PAS / C / CPP Batas Run-time: 1 detik / test-case Batas Memori: 16 MB Nama Berkas Masukan: Standard Input Nama Berkas Keluaran: Standard Output Sejumlah N (1 = N = 1000000) bebek Pak Dengklek sedang bermain dengan antrian mereka. Setiap bebek dinomori 1..N. Pada awalnya, mereka antri dengan suatu urutan yang diberikan oleh sebuah array A. Jadi, untuk bebek ke-i, dia antri di urutan ke-a[i]. Urutan bebek bebek dinomori dari 1 sampai dengan N. Bosan dengan antrian lamanya, bebek-bebek tersebut ingin mendapatkan urutan baru. Supaya adil, mereka membuat aturan tertentu. Misalkan urutan yang baru disimpan dalam sebuah array B. Aturannya adalah sebagai berikut: array B adalah sedemikian sehingga untuk setiap bebek, B[A[i]] = i, (1 = i = N). Beberapa saat lamanya mereka berada pada antrian yang baru. Kemudian, Pak Dengklek datang dan terkejut melihat bebek-bebeknya berada pada antrian yang baru dan meminta mereka untuk kembali ke antriannya yang lama. Bebek-bebek tersebut lupa. Pak Dengklek meminta bantuan Anda untuk mengingatkan bebek-bebek tersebut akan antriannya yang lama. FORMAT MASUKAN Baris pertama dari masukan berisi sebuah bilangan bulat N. Setiap baris pada N baris berikut berisi tepat sebuah bilangan bulat B[1], B[2],..., B[N]. CONTOH MASUKAN 4 3 4 1 2 FORMAT KELUARAN Jika tidak ada array A yang dapat dibuat dari array B, keluarkan angka 0. Jika tidak, keluarkan N baris, di mana di setiap barisnya terdapat sebuah bilangan bulat yang bernilai A[i]. Pembahasan Soal OSN 2004 Halaman 5

CONTOH KELUARAN 3 4 1 2 Pembahasan Soal ini merupakan soal dengan solusi terpendek. Yang kita perlu lakukan adalah melakukan sedikit manipulasi terhadap B[A[i]] = i dan menerjemahkan manipulasi tersebut ke dalam program. Pertama-tama, perlu diingat bahwa i adalah sebuah variabel, sehingga nilainya bisa berubah-ubah. Misal x = B[j]. Satu-satunya kemungkinan yang dapat memenuhi syarat B[A[i]] = i adalah jika j = A[x]. Ini membuat permisalannya menjadi x = B[A[x]], yang tidak lain adalah syarat yang ditentukan. Dalam soal ini, disediakan 10 test case dengan rincian sebagai berikut: No N 1 1 2 10 3 100 4 1000 5 10000 6 50000 7 100000 8 200000 9 500000 10 1000000 Berikut adalah source code dari solusi di atas: program Permutasi; const MAXN = 1000000; InFile = 'PERM2.IN'; OutFile = 'PERM2.OUT'; var a : array[1..maxn] of longint; i, b, n : longint; assign(input, InFile); assign(output, OutFile); reset(input); rewrite(output); Pembahasan Soal OSN 2004 Halaman 6

read(n); for i := 1 to n do read(b); a[b] := i; for i := 1 to n do writeln(a[i]); close(input); close(output); end. Pembahasan Soal OSN 2004 Halaman 7