Untuk menjawab soal pemrograman, perhatikan beberapa hal berikut:
Diberikan suatu persoalan, dan Anda diminta menuliskan program komputer dengan menggunakan pseudopascal atau bahasa pemrograman Pascal, C, atau C++.
Program komputer atau pseudopascal yang ditulis harus dapat menghasilkan output yang diminta dengan batasan yang sudah ditentukan.
Setiap persoalan terdiri atas deskripsi soal, batasan (waktu eksekusi, input, dan output), contoh input, dan contoh output.
MEMOTONG PIPA
Deskripsi:
Pak Dengklek memiliki pipa sepanjang N meter, dan dia ingin memotongnya menjadi beberapa bagian sebanyak-banyaknya. Setiap potongan pipa harus memiliki panjang p meter, dimana 1<p<N, dan p adalah bilangan bulat. Hal ini menunjukkan bahwa panjang minimal potongan pipa adalah 1 meter. Disyaratkan bahwa tidak ada 3 potongan pipa manapun yang dapat membentuk segitiga. Pak Dengklek meminta bantuan Anda untuk membuat program menghitung maksimum banyaknya potongan pipa sesuai dengan syarat-syarat tersebut.
Batasan:
Waktu eksekusi: 1 detik
Input: Input berupa sebuah bilangan bulat N yang menunjukkan panjang pipa dalam satuan meter, dengan batasan 1<N<105.
Contoh Input:
7
Contoh Output:
4
TOKI 2011
Strategi terbaik adalah dengan selalu membuat potongan sekecil mungkin agar kita mendapatkan potongan sebanyak mungkin pada akhirnya. Setiap ingin membuat potongan baru, kita harus memastikan bahwa potongan terbaru tersebut tidak akan membuat segitiga dengan semua potongan lain yang sudah kita buat. Cara mengecek nya adalah dengan melihat dua potongan terbesar, apakah jumlah dari kedua potongan tersebut lebih besar daripada panjang potongan yang ingin kita buat (apabila panjangnya sama maka belum membentuk segitiga).
Mari kita coba simulasikan.
Pertama, buat potongan dengan panjang 1 karena panjang minimal adalah 1.
Kedua, buat potongan dengan panjang 1 lagi karena pasti tidak membentuk segitiga (baru ada dua potongan termasuk yang baru ini).
Ketiga, buat potongan dengan panjang 2, karena apabila kita membuat potongan dengan panjang 1 maka akan membentuk segitiga.
Keempat, buat potongan dengan panjang 3, karena dua potongan terbesar menghasilkan jumlah 3.
Kelima, buat potongan dengan panjang 5, karena dua potongan terbesar menghasilkan jumlah 5.
Keenam, buat potongan dengan panjang 8, karena dua potongan terbesar menghasilkan jumlah 8.
Jika kita perhatikan, potongan ke x yang kita buat akan memiliki panjang f(x) dimana f(x) = f(x-1) + f(x-2), karena potongan ke x panjangnya adalah jumlah dari panjang potongan ke x-1 dan panjang potongan ke x-2.
Untuk setiap N, banyaknya potongan maksimal yang dapat kita buat adalah K potongan, dimana K adalah bilangan terbesar yang memenuhi syarat f(1) + f(2) + .. + f(K) <= N. Contoh, untuk N = 7 akan menghasilkan K = 4 karena f(1) + f(2) + f(3) + f(4) = 1 + 1 + 2 + 3 = 5.
Note: Karena jumlah dari panjang semua potongan harus tepat N, maka potongan terbesar kita buat sebesar mungkin sampai jumlah semua potongan tepat N.
Source code:
var
n,i,sum,ans: longint;
f: array[1..100] of longint;
begin
readln(n);
if n<=2 then writeln(n) else
begin
f[1] := 1;
f[2] := 1;
sum := 2; // f[1] + f[2]
for i:=3 to 100 do
begin
f[i] := f[i-1] + f[i-2];
sum := sum + f[i];
if sum <= n then ans := i else break;
end;
writeln(ans);
end;
end;
TOKI 2011
Ya kerjain terakhir aja kalau soal lain udah selesai semua. Anggap aja soal bonus.
Masuk untuk menulis jawaban
Syarat membentuk segitiga : jumlah dari 2 sisi terkecil > sisi terbesar
caranya : menggunakan deret fibonacci
alasan : ambil 3 bilangan manapun dari fibonacci, tidak ada yang akan memenuhi syarat diatas, paling hebat adalah jumlah 2 sisi sama dengan sisi terbesar
credit to kerenza doxolodeo untuk hintnya
Ini pakai Fibbonaci.
harus habis pipanya? contoh 8 bisa cuma pake 7: 1 1 2 3 atau ambil semua : 1 2 5
*setahun kemudian
kan bisa diambil 1 1 2 4?
jadi sisa pipanya ditambah ke pipa terbesar... karena kalau pipa terbesar dibesarkan lagi, tidak mungkin akan terbentuk segitiga :3
syarat terberntuk segitiga
jika sisnya A,B,C
maka :
A + B > C
A + C > B
dan B+C > A
var
a,b,c,n,total,count:longint;
begin
count:=0;
a:=0;
b:=0;
c:=1;
total:=c;
readln(n);
while total<=n do
begin
b:=a;
a:=c;
c:=a+b;
total:=total+c;
inc(count);
end;
writeln(count);
end.
pakai fibbonaci
Ini pas OSP harus ditulis di kertas? Cape deh~