Tinggi Kandang Susun

Batas Waktu 1 detik
Batas Memori 32 MB
Sumber OSN 2007
Selain bebek, Pak Dengklek berkeinginan memelihara kucing dan karena itu ia bermaksud membangun kandang untuk kucing-kucingnya. Harga tanah kini sangat mahal, Pak Dengklek tidak memiliki lahan yang cukup luas untuk membangun kandang berlantai satu, maka kandang susunlah solusi untuk tempat tidur N kucingnya (1 ≤ N ≤ 1.000.000). Namun dalam kasus ini, justru yang kita pedulikan adalah total tinggi dari kandang susun tersebut, bukan luasnya. Sekedar informasi, kucing-kucing Pak Dengklek adalah hewan yang rewel, mereka tidak ingin tempat tinggalnya lebih rendah dari batas yang sudah mereka tentukan.
Untuk tiap lantai kandang, Pak Dengklek hanya dapat memasukkan K (1 ≤ K ≤ 1.000.000) kucing secara berurutan, sehingga kucing 1 sampai K pasti akan berada di lantai pertama, kucing ke K+1 sampai 2K pasti akan berada di lantai kedua, dan seterusnya. Agar semua kucing senang, tinggi setiap lantai haruslah nilai maksimal dari batas yang ditentukan oleh kucing-kucing yang ada dalam lantai tersebut.
Tugas Anda kini adalah mencari berapa total tinggi dari kandang susun yang akan dibangun Pak Dengklek. Perlu diingat untuk alas dan atap dibutuhkan papan setebal 1 sentimeter, di antara kedua lantai pun ada sekat setebal 1 sentimeter dan tebal-tebal itu harus diperhitungkan juga dalam menentukan total tinggi kandang.

Format Masukan

Baris pertama berisi dua buah bilangan bulat N dan K. N baris berikutnya masing-masing berisi sebuah bilangan Ti (1 ≤ Ti ≤ 1.000.000) yang merupakan batas tinggi yang diinginkan oleh kucing ke-i, dalam sentimeter.

Format Keluaran

Sebuah baris berisi sebuah bilangan bulat yaitu total tinggi kandang susun yang akan Pak Dengklek bangun, dalam sentimeter.

Contoh Masukan 1

5 3
30
20
15
19
29

Contoh Keluaran 1

62

Contoh Masukan 2

2 2
2
2

Contoh Keluaran 2

4

Penjelasan

Pada contoh masukan 1, total tinggi = 62 = 30 + 29 + 1 (alas) + 1 (atap) + 1 (sekat lantai 1 dan lantai 2).

Nah, ini jawaban saya (dalam bahasa Pascal) :

var
    i,n,a : integer;
    m : array[1..10]of integer = (1,2,5,10,20,50,100,200,500,1000);
begin
    readln(n);
    for i := 10 downto 1 do
    begin
        if n >= m[i] then
        begin
            a := n div m[i];
            n := n - a*m[i];
            writeln(m[i],' ',a);
        end;
    end;
end.


Bukit dan Lembah

Batas Waktu 1 detik
Batas Memori 32 MB
Sumber OSN 2005
Pak Dengklek memberikan Anda data ketinggian yang di catat dalam perjalanannya dari suatu posisi awal ke posisi akhir. Data ketinggian adalah bilangan-bilangan positif. Jalan kadang menaik, kadang menurun, kadang datar saja. Posisi di mana terjadi perubahan menaik kemudian menurun (boleh diselingi jalan datar) didefinisikan sebagai puncak dari suatu bukit. Sebaliknya, posisi terjadi perubahan dari menurun terus menaik (boleh diselingi bagian jalan yang datar) didefinisikan sebagai titik terbawah suatu lembah. Walaupun perubahan tersebut kecil saja, definisi itu tetap berlaku.
Carilah beda ketinggian terbesar antara puncak bukit dengan titik terbawah lembah berikutnya atau sebaliknya antara titik terbawah lembah dengan puncak bukit berikutnya pada data perjalanan tersebut.

Format Masukan

Banyak baris, antara 2 sampai 600.000 baris, yang masing-masing berisi sebuah bilangan bulat antara 0 sampai 1.000.000.000

Format Keluaran

Sebuah baris berisi sebuah bilangan bulat yaitu beda ketinggian terbesar yang diperoleh.

Contoh Masukan

10
26
26
35
35
27
30
30
45
10
8
9

Contoh Keluaran

37

Penjelasan
 
Ada 12 data. Beda ketinggian pertama (10 ke 35) adalah 25, beda kedua (35 ke 27) adalah 8, beda ketiga (27 ke 45) adalah 18, beda ketinggian keempat (45 ke 8) adalah 37, dan beda ketinggian kelima (8-9) adalah 1. Jadi beda ketinggian tertinggi adalah 37.

Ini jawaban saya (Pascal) :
 
var
    a,max,min,b : longint;
    n : array[1..1000000] of longint;
begin
    a := 0;
    while not eof(input) do
    begin
        inc(a);
        readln(n[a]);
    end;
    max := n[1];
    min := n[1];
    for b := 2 to a do
    begin
        if n[b] > max then
            max := n[b];
        if n[b] < min then
            min := n[b];
    end;
    writeln(max-min);
end. 
 


Pola 1

Batas Waktu 1 detik
Batas Memori 32 MB
Pak Dengklek meminta Anda untuk memperhatikan contoh masukan dan keluaran yang diberikan, menemukan polanya, lalu membuat program yang menghasilkan pola tersebut. Bisakah Anda?

Format Masukan

Baris pertama berisi sebuah bilangan bulat N (0 ≤ N ≤ 10).

Format Keluaran

Pola berukuran N.

Contoh Masukan

5

Contoh Keluaran

    *
   **
  ***
 ****
*****
 
Ini jawaban saya (Pascal) :

var
    n,i,j,k : integer;
begin
    readln(n);
    for i := 1 to n do
    begin
        for j := 1 to n-i do
            write(' ');
        for k := 1 to i do
            write('*');
        writeln;
    end;
end.