alpsahin/tubitak-olimpiyat-dataset-v2 huggingface dataset:
Bilgisayar Olimpiyatı 2013, 1. Aşama, Soru 24

## [23-26] Sorular için Açıklama
Elemanları tamsayılardan oluşan \(n\) elemanlı bir \(A[1..n]\) dizisi eğer \(\forall i \in \{1, 2, \dots, \lfloor n/2 \rfloor\}\) indisleri için \(A[i] \le A[2i]\) ve \((2i + 1 \le n\) iken) \(A[i] \le A[2i + 1]\) şartlarını sağlıyorsa **yığın** olarak adlandırılır.
Bu şartları sağlamayan diziler yığın değildir.

---

Yığın olduğu bilinen 250 elemanlı bir dizide en büyük elemanı bulmak için en az kaç karşılaştırma ge- rekildir?

Şıklar:
A) 8 | B) 61 | C) 124 | D) 249 | E) Hiçbiri

Cevap: C 124

Çözüm:
En büyük eleman yapraklardan birinde olmalıdır.
O zaman en büyük elemanın indisik kesinlikle [126 ... 250] aralığındadır. Bu aralıkta 125 eleman vardır. N elemanlı bir dizide en büyük eleman N-1 hamlede bulunabilir. O zaman cevap 124 olur.
Bilgisayar Olimpiyatı 2013, 1. Aşama, Soru 25

## [23-26] Sorular için Açıklama
Elemanları tamsayılardan oluşan \(n\) elemanlı bir \(A[1..n]\) dizisi eğer \(\forall i \in \{1, 2, \dots, \lfloor n/2 \rfloor\}\) indisleri için \(A[i] \le A[2i]\) ve \((2i + 1 \le n\) iken) \(A[i] \le A[2i + 1]\) şartlarını sağlıyorsa **yığın** olarak adlandırılır.
Bu şartları sağlamayan diziler yığın değildir.

---

Aşağıdaki mantıksal önermelerden hangileri doğrudur?
(I) Yığın olmayan herhangi bir dizi elemanlarının yerleri değiştirilerek yığın haline getirilebilir.
(II) 50 farklı tamsayı içeren 50 elemanlı bir diziden en fazla 50 adet farklı yığın oluşturulabilir.
(III) A[1..n] dizisi bir yığın ise bunun bir altdizisi olan A[2..n -1] dizisi de bir yığındır.

Şıklar:
A) Yalnız I | B) Yalnız II | C) I ve III | D) II ve III | E) Hiçbiri

Cevap: A Yalnız I

Çözüm:
Önermeleri tek tek inceleyelim.
• Her dizi yığın haline çevrilebilir. O zaman ilk önerme doğrudur.
• Dizi elemanlarının 1 den 50'ye kadar numaralandırıldığını ve ve her iş25 için A[1] = i olsun. O zaman kalan 25 eleman 25! farklı şekilde yerleştirilebilir. O zaman ikinci önerme yanlıştır.
• Yanlıştır, yığınımız (1, 3, 2, 4, 5) olsun, bunun altdizisi (3, 2, 4) yığın özelliği göstermez.
Yalnız ifade I doğrudur.
Bilgisayar Olimpiyatı 2013, 1. Aşama, Soru 26

## [23-26] Sorular için Açıklama
Elemanları tamsayılardan oluşan \(n\) elemanlı bir \(A[1..n]\) dizisi eğer \(\forall i \in \{1, 2, \dots, \lfloor n/2 \rfloor\}\) indisleri için \(A[i] \le A[2i]\) ve \((2i + 1 \le n\) iken) \(A[i] \le A[2i + 1]\) şartlarını sağlıyorsa **yığın** olarak adlandırılır.
Bu şartları sağlamayan diziler yığın değildir.

---

n elemanlı bir A yığını ve bir p tamsayısı verilmiştir. Sizden istenen bu yığının k. (1 ≤ k ≤ n) en küçük elemanının p den daha küçük olup olmadığını belirlemeniz. Bu problem için zaman karmaşıklığı en az hangisidir? [Açıklama: Zaman karmaşıklığı, problemi çözen bir algoritmanın en kötü durum için çalışma zamanının n ve k ile ifade edilen formülünden düşük dereceli terimlerin ve tüm sabit katsayıların silin-mesi ile elde edilir; örneğin 5n² + 5k log n - 2k formülü için n².]

Şıklar:
A) n log n | B) k log n | C) n | D) k | E) log n

Cevap: D k

Çözüm:
Eğer yığın yapısında p'den küçük eleman sayısını bulursak bu bizi istediğimiz cevaba da kolayca ulaştırabilir. Ağaç yapısını düşündüğümüzde p'den küçük sayılar 1 numaralı kökü içeren bir birleşik altağaç oluşturacaktır. Biz bu alt ağaçtaki eleman sayısının k'dan küçük olup olmamasına bakıyoruz. Bu işlemi basit bir derinlik öncelikli arama ile gerçekleştirebiliriz. Toplamda baktığımız düğüm sayısı da kı yı geçtiğinde işlemleri bitirirsek O(k) işlemde sorguyu cevaplamış oluruz.
Bilgisayar Olimpiyatı 2013, 1. Aşama, Soru 27

## [27-28] Sorular için açıklama
Asimtotik üst sınırı ifade etmede kullanılan büyük-O notasyonu şöyle tanımlanır. \(f(n)\) ve \(g(n)\) negatif olmayan tamsayılardan pozitif reel sayılara tanımlı birer fonksiyon ve \(O(g(n))\) bir fonksiyon kümesi olsun. \(f(n) \in O(g(n))\) dir ancak ve ancak öyle bir pozitif reel c sabiti ve bir \(n_0 \ge 0\) tamsayı sabiti için
\(f(n) \le cg(n)\), \(\forall n \ge n_0\) eşitsizliği sağlanır.
Tanımı örnekle açıklayalım. \(f(n) = 2n^2 + 5n - 10\), \(h(n) = n^2 \log n - 10O(n) + 1\), \(g(n) = n^2 \text{çin } f(n) \in O(g(n))\) (mesela \(n_0 = 1\) ve \(c = 7\) seçilerek \(f(n) = 2n^2 + 5n - 10 \le 7n^2\), \(\forall n \ge n_0 = 1\) sağlanır), fakat \(h(n) \notin g(n)\) dir (çünkü c sabiti ne kadar büyük seçilirse seçilsin log n değeri sonsuzda c den daha büyüktür, yani eşitsizliği sağlayan \(n_0\) ve c değerleri bulunamaz).

---

Hangisi yanlıştır?

Şıklar:
A) \(5O(n^2 + 10O(n^3)\) | B) \(\sum_{i=1}^n = i! \in O(n^2)\) | C) \(\sqrt{n} \in O(\log n)\) | D) \(5n + 10 \in O(3n)\) | E) \(3^{n+2} \in O(3^n)\)

Cevap: C \(\sqrt{n} \in O(\log n)\)

Çözüm:
Dikkat ederseniz C seçeneğinde \(\lim_{n \to \infty} \frac{\sqrt{n}}{\log n} = \infty\) olduğundan n sonsuza giderken \(\sqrt{n}\). hiçbir c tam sayısı için \(c \times \log n\) den küçük olamaz.
Bilgisayar Olimpiyatı 2013, 1. Aşama, Soru 28

## [27-28] Sorular için açıklama
Asimtotik üst sınırı ifade etmede kullanılan büyük-O notasyonu şöyle tanımlanır. \(f(n)\) ve \(g(n)\) negatif olmayan tamsayılardan pozitif reel sayılara tanımlı birer fonksiyon ve \(O(g(n))\) bir fonksiyon kümesi olsun. \(f(n) \in O(g(n))\) dir ancak ve ancak öyle bir pozitif reel c sabiti ve bir \(n_0 \ge 0\) tamsayı sabiti için
\(f(n) \le cg(n)\), \(\forall n \ge n_0\) eşitsizliği sağlanır.
Tanımı örnekle açıklayalım. \(f(n) = 2n^2 + 5n - 10\), \(h(n) = n^2 \log n - 10O(n) + 1\), \(g(n) = n^2 \text{çin } f(n) \in O(g(n))\) (mesela \(n_0 = 1\) ve \(c = 7\) seçilerek \(f(n) = 2n^2 + 5n - 10 \le 7n^2\), \(\forall n \ge n_0 = 1\) sağlanır), fakat \(h(n) \notin g(n)\) dir (çünkü c sabiti ne kadar büyük seçilirse seçilsin log n değeri sonsuzda c den daha büyüktür, yani eşitsizliği sağlayan \(n_0\) ve c değerleri bulunamaz).

---

Pozitif tüm t(n) fonksiyonlar için hangisi kesinlikle doğrudur?

Şıklar:
A) \(nt(n) \in O(t(n))\) | B) \(t(n) + \sin(t(n)) \in O(t(n))\) | C) \(\frac{t(n)}{n} \in O(n)\) | D) \(t^2(n) \in O(2^n)\) | E) \(\frac{1}{t(n)} \in O(t(n))\)

Cevap: B \(t(n) + \sin(t(n)) \in O(t(n))\)

Çözüm:
Tek tek ifadeleri inceleyelim:
- A seçeneğinde \(t(n) = n\) olursa \(n^2 \notin O(n)\) olduğundan A yanlıştır.
- \(t(n) \in O(t(n))\) olduğundan ve \(\sin(t(n)) \le 1\) olduğu için B seçeneği kesinlikle doğrudur.
- Eğer \(t(n) = \frac{1}{n}\) olursa C seçeneği yanlış olur.
- Eğer \(t(n) = n\) olursa D seçeneği yanlış olur çünkü \(n^2 \notin O(2^n)\).
- Eğer \(t(n) = \frac{1}{n}\) oluursa E seçeneği yanlış olur çünkü \(n \notin O(\frac{1}{n})\).
Bilgisayar Olimpiyatı 2013, 1. Aşama, Soru 29

r noktasından bir görüntü elde etmek istediğimize, nesneler hangi sıra ile çizilirler?

Şıklar:
A) abcedghf | B) bacdeghf | C) abc dg hef | D) cab egh df | E) Hiçbiri

Cevap: B bacdeghf

Çözüm:
Sıra algoritmasını dikkatli incelediğinizde herhangi bir düzlem düğümünde iken nokta düzlemin sol ağacının olduğu taraftaysa önce sağa, diğer türlü önce sola dallandığını görürsünüz. Bir noktanın düzlemin ne tarafında kaldığına bakmak için ise düzlemin sol ve sağ altağacındaki nesnelerin hangilerinin nokta tarafında kaldığına bakmak yeterli olacaktır. O zaman r noktası d1, d3, d4 ve d5'in sağında, kalanların solunda olur. Ağaçta algoritmaya göre dallandığımızda cevabı B seçeneği olarak buluruz.
Bilgisayar Olimpiyatı 2013, 1. Aşama, Soru 30

s noktasından bir görüntü elde etmek istediğimizde, nesneler hangi sıra ile çizilirler?

Şıklar:
A) b a c h f g d e | B) a b c d g f h e | C) b c a d f g h e | D) a c b f g h d e | E) Hiçbiri

Cevap: A b a c h f g d e

Çözüm:
s noktası d1, d3, d5, d6 numaralı düzlemlerin sağında kalanların ise solunda kalmaktadır. Dolayısıyla önceki soruda anlatılan yöntemle "b a c h f g d e" elde edilir.
Bilgisayar Olimpiyatı 2013, 1. Aşama, Soru 31

Aşağıdaki nesne sıralamalarından hangisi uzaydaki kamera pozisyonumuz ne olursa olsun mümkün değildir?

Şıklar:
A) b a c g h f d e | B) g h f e d a b c | C) d e g h f c b a | D) b c a f h g d e | E) Hepsi

Cevap: D b c a f h g d e

Çözüm:
Dikkat ederseniz D seçeneği hiçbir dallanma sırasıyla elde edilemez, çünkü d4'ün altağacının tamamı yazılmadan çayazılmış. İlk önce bile beraber a da yazılmalıydı. Diğer şıklardaki ifadeler ise imkanlı ifadelerdir. O zaman
Bilgisayar Olimpiyatı 2013, 1. Aşama, Soru 32

## [32-35] Sorular için açıklama
Özel Dedektif Hamdi'nin eline alfabedeki 29 harf kullanılarak küçük harflerle yazılmış bir mesaj geçer. Arkadaşına bu mesajı güvenle iletebilmek için mesajı şifrelemeye karar verir. Bu amaçla mesajdaki boşlukları aynen bırakıp, kelimelerdeki her bir harf O ve 1'lerden oluşan bir koda dönüştürmeye karar verir. Güvenliği arttırmak için de her bir harfe değişken uzunlukta kod vermeyi düşünür. Fakat kodda her harfe karşılık gelen kodlar arasında bir araya kullanmak kodun güvenliğini tehlikeye sokacağı için öyle bir kodlama sistemi oluşturur ki hiçbir hafin kodu başka bir hafin kodunun öneki (prefix) olmaz. Böylece sadece O ve 1'lerden oluşan bir kod kolayca tekrar harflere dönüştürülebilir. Üstelik kullandığı O ve 1'lerden de tasarruf etmek için mesajda çok kullanılan harfler için kısa kodlar ve az kullanılanlar için de uzun kodlar kullanmaya karar verir. Neyse ki Bilgisayar Mühendisliği mezunu olan Hamdi'nin elinde tam da bu iş için bir yöntem vardır. Bu yöntemde düğümlerden oluşan bir ikili ağaç oluşturulmaktadır. Ağacın bir tane kök düğümü ve harf sayısı kadar da yaprak düğümü bulunmaktadır. Yöntemin adımları aşağıda belirtilmiştir.
1. Her bir harf için bir yaprak düğümü oluştur ve düğümlere ağırlık olarak harflerin kullanım sayılarını ata. Bunları bir düğüm kümesine at.
2. En düşük kullanım sayısına sahip iki düğümü kümeden çıkartıp (eşitlik durumunda rasgele seçim yap), bu çıkartılan düğümlerin sol ve sağ çocuk olduğu yeni bir düğüm oluştur. Yeni düğümün ağırlığını çıkartılan iki düğümün ağırlıkları toplamı olarak belirle ve bu yeni düğümü kümeye at.
3. Kümede tek bir düğüm kalana kadar adım 2'yi tekrar et.
4. Bir harfin kodunu belirlemek için kök düğümünden o harfe karşılık gelen yaprak düğümüne giden yolu takip et. Yol üstünde ilerlerken her bir sol çocuk için koda O ve her bir sağ çocuk için koda 1 ekle.

---

“baba bana top at” mesajının kodlanmış hali aşağıdakilerden hangisi olabilir?

Şıklar:
A) 100100100111100111100110 | B) 0101011111001111110 | C) 101010000010111101110110 | D) 0011001100111011011011101101 | E) Hiçbiri

Cevap: A 100100100111100111100110

Çözüm:
Verilen mesajın olası kod çözümlerinden biri a→O, b→IO, t→110, p→111O, n→1111O, o→1111O şeklinde olur. Bu kodlama ile A seçeneğindeki kod elde edilebilir. Dolayısıyla
Bilgisayar Olimpiyatı 2013, 1. Aşama, Soru 34

## [32-35] Sorular için açıklama
Özel Dedektif Hamdi'nin eline alfabedeki 29 harf kullanılarak küçük harflerle yazılmış bir mesaj geçer. Arkadaşına bu mesajı güvenle iletebilmek için mesajı şifrelemeye karar verir. Bu amaçla mesajdaki boşlukları aynen bırakıp, kelimelerdeki her bir harf O ve 1'lerden oluşan bir koda dönüştürmeye karar verir. Güvenliği arttırmak için de her bir harfe değişken uzunlukta kod vermeyi düşünür. Fakat kodda her harfe karşılık gelen kodlar arasında bir araya kullanmak kodun güvenliğini tehlikeye sokacağı için öyle bir kodlama sistemi oluşturur ki hiçbir hafin kodu başka bir hafin kodunun öneki (prefix) olmaz. Böylece sadece O ve 1'lerden oluşan bir kod kolayca tekrar harflere dönüştürülebilir. Üstelik kullandığı O ve 1'lerden de tasarruf etmek için mesajda çok kullanılan harfler için kısa kodlar ve az kullanılanlar için de uzun kodlar kullanmaya karar verir. Neyse ki Bilgisayar Mühendisliği mezunu olan Hamdi'nin elinde tam da bu iş için bir yöntem vardır. Bu yöntemde düğümlerden oluşan bir ikili ağaç oluşturulmaktadır. Ağacın bir tane kök düğümü ve harf sayısı kadar da yaprak düğümü bulunmaktadır. Yöntemin adımları aşağıda belirtilmiştir.
1. Her bir harf için bir yaprak düğümü oluştur ve düğümlere ağırlık olarak harflerin kullanım sayılarını ata. Bunları bir düğüm kümesine at.
2. En düşük kullanım sayısına sahip iki düğümü kümeden çıkartıp (eşitlik durumunda rasgele seçim yap), bu çıkartılan düğümlerin sol ve sağ çocuk olduğu yeni bir düğüm oluştur. Yeni düğümün ağırlığını çıkartılan iki düğümün ağırlıkları toplamı olarak belirle ve bu yeni düğümü kümeye at.
3. Kümede tek bir düğüm kalana kadar adım 2'yi tekrar et.
4. Bir harfin kodunu belirlemek için kök düğümünden o harfe karşılık gelen yaprak düğümüne giden yolu takip et. Yol üstünde ilerlerken her bir sol çocuk için koda O ve her bir sağ çocuk için koda 1 ekle.

---

Yalnızca a, b ve c harfleri içeren bir mesaj için, a hafinin kodunun 10, b hafinin kodunun 11 ve c harfinin kodunun 0 olması için bu üç harfin kullanım sayıları aşağıdakilerden hangisi olabilir?

Şıklar:
A) a: 5, b: 10, c: 15 | B) a: 15, b: 12, c: 16 | C) a: 5, b: 5, c: 11 | D) a: 5, b: 5, c: 6 | E) Hepsi

Cevap: E Hepsi

Çözüm:
C'nin geçme sayısı a ve b'den büyük eşit olmalıdır. A, B, C, D şıklarında bu sağlandığı için cevap E seçeneği yani hepsi olur.
##
Bilgisayar Olimpiyatı 2013, 1. Aşama, Soru 35

## [32-35] Sorular için açıklama
Özel Dedektif Hamdi'nin eline alfabedeki 29 harf kullanılarak küçük harflerle yazılmış bir mesaj geçer. Arkadaşına bu mesajı güvenle iletebilmek için mesajı şifrelemeye karar verir. Bu amaçla mesajdaki boşlukları aynen bırakıp, kelimelerdeki her bir harf O ve 1'lerden oluşan bir koda dönüştürmeye karar verir. Güvenliği arttırmak için de her bir harfe değişken uzunlukta kod vermeyi düşünür. Fakat kodda her harfe karşılık gelen kodlar arasında bir araya kullanmak kodun güvenliğini tehlikeye sokacağı için öyle bir kodlama sistemi oluşturur ki hiçbir hafin kodu başka bir hafin kodunun öneki (prefix) olmaz. Böylece sadece O ve 1'lerden oluşan bir kod kolayca tekrar harflere dönüştürülebilir. Üstelik kullandığı O ve 1'lerden de tasarruf etmek için mesajda çok kullanılan harfler için kısa kodlar ve az kullanılanlar için de uzun kodlar kullanmaya karar verir. Neyse ki Bilgisayar Mühendisliği mezunu olan Hamdi'nin elinde tam da bu iş için bir yöntem vardır. Bu yöntemde düğümlerden oluşan bir ikili ağaç oluşturulmaktadır. Ağacın bir tane kök düğümü ve harf sayısı kadar da yaprak düğümü bulunmaktadır. Yöntemin adımları aşağıda belirtilmiştir.
1. Her bir harf için bir yaprak düğümü oluştur ve düğümlere ağırlık olarak harflerin kullanım sayılarını ata. Bunları bir düğüm kümesine at.
2. En düşük kullanım sayısına sahip iki düğümü kümeden çıkartıp (eşitlik durumunda rasgele seçim yap), bu çıkartılan düğümlerin sol ve sağ çocuk olduğu yeni bir düğüm oluştur. Yeni düğümün ağırlığını çıkartılan iki düğümün ağırlıkları toplamı olarak belirle ve bu yeni düğümü kümeye at.
3. Kümede tek bir düğüm kalana kadar adım 2'yi tekrar et.
4. Bir harfin kodunu belirlemek için kök düğümünden o harfe karşılık gelen yaprak düğümüne giden yolu takip et. Yol üstünde ilerlerken her bir sol çocuk için koda O ve her bir sağ çocuk için koda 1 ekle.

---

Bir harf için en uzun kodun uzunluğunun 8 olduğu bir mesajda en az kaç farklı harf geçmektedir (boşluklar göz ardı edilecektir)?

Şıklar:
A) 4 | B) 8 | C) 9 | D) 256 | E) 512

Cevap: C 9

Çözüm:
Kod uzunluğu 8 olan harften mesajda sonsuz sayıda olduğunu düşünelim, diğer harfterin geçme sayısı ise sonlu sayıda olsun. Bu da demek ki her bir farklı harf kodun uzunluğunu artırıyor. O zaman Kod uzunluğu 8 olan harf dışında 8 farklı harf daha mesajda geçmelidir. Dolayısıyla mesajda en az 9 farklı harf olmalıdır.
##
Bilgisayar Olimpiyatı 2013, 1. Aşama, Soru 36

# [36-50] Sorular için açıklama
• Soruları standart C (ANSI C) programlama dili çerçevesinde cevaplayınız.
• Gerekli tüm başlık (header) dosyalarının verilen programa dahil edildiğini varsayınız.

---

Yukarıda verilen program çıktı olarak ne üretir?

Şıklar:
A) 5 7 | B) 7 7 | C) 3 7 | D) 7 3 | E) 8 7

Cevap: A 5 7

Çözüm:
f fonksiyonuna verilen dizi ile fonksiyon indi'le bu dizideki en büyük elemanın indisini (birden fazla varsa en sağdaki), ind2'ye dizideki en küçük elamanın indisini (birden fazla varsa en soldaki) bulup buna göre bir değer döndürür. f(a, 8) için ind1 5, ind2 3 olur. f(b, 7) için ind1 1, ind2 3 olur. Sirasıyla 5 ve 7 yazdırır.
Bilgisayar Olimpiyatı 2013, 1. Aşama, Soru 37

# [36-50] Sorular için açıklama
• Soruları standart C (ANSI C) programlama dili çerçevesinde cevaplayınız.
• Gerekli tüm başlık (header) dosyalarının verilen programa dahil edildiğini varsayınız.

---

Yukarıda verilen program çıktı olarak ne üretir?

Şıklar:
A) 4 0 2 | B) 2 4 0 | C) 0 4 2 | D) 0 2 4 | E) 2 0 4

Cevap: 0 2 4 D

Çözüm:
Her döngü sonunda dizi şu şekillerde olur:
- {-1, 1, -1, 1, -1, 1, -1}
- {-1, 1, 0, 1, -1, 1, -1, 1}
- {-1, 1, 0, 3, 2, 1, -1, 1, -1}
- {-1, 1, 0, 3, 2,5, 4, 1, -1}
- {-1, 1, 0, 3, 2,4, 7, 6, 1}
Dolayısıyla en sonda 0 2 4 yazdırılır.
void main() {
int sayi, sonuc;
scanf("%d", &sayi);
sonuc=sayi-(sayi&-sayi);
printf("%d", sonuc);
}
Bilgisayar Olimpiyatı 2013, 1. Aşama, Soru 38

# [36-50] Sorular için açıklama
• Soruları standart C (ANSI C) programlama dili çerçevesinde cevaplayınız.
• Gerekli tüm başlık (header) dosyalarının verilen programa dahil edildiğini varsayınız.

---

void main() {
    int sayi, sonuc;
    scanf("%d", &sayi);
    sonuc=sayi-(sayi&-sayi);
    printf("%d", sonuc);
}

Programın çıktısı (sonuc) için hangisi kesinlikle doğrudur?

Şıklar:
A) Her zaman bir çift sayıdır | B) Negatif olamaz | C) **sayı** dan her zaman daha küçüktür | D) **sayı** negatifse her zaman pozitiftir | E) **sayı** pozitifse her zaman pozitiftir

Cevap: A Her zaman bir çift sayıdır

Çözüm:
Kodda verilen (sayi&-sayi) ifadesi x sayısının ikilik tabandaki yazılmış halindeki en sağdaki basamağın sayı değerini döndürür. Mesela ikilik tabanda 10100010100 şeklinde yazılan bir sayı için 4, 111110 şeklinde yazılan bir sayı için 2, 1000 şeklinde yazılan bir sayı için 8 döndürür. O zaman girilen sayı tekse sonuc = sayı - 1 olur. Çiftse sonuc kesinlikle çift bir sayı olur. O zaman A seçeneği kesinlikle doğru bir ifade olur.
Bilgisayar Olimpiyatı 2013, 1. Aşama, Soru 39

# [36-50] Sorular için açıklama
• Soruları standart C (ANSI C) programlama dili çerçevesinde cevaplayınız.
• Gerekli tüm başlık (header) dosyalarının verilen programa dahil edildiğini varsayınız.

---

void main() {
    int dizi[20]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}, i, s=0;
    for (i=1;i<19;i++) {
        s+=dizi[i]-dizi[i-1]-dizi[i+1];
    }
    printf("%d", s);
}

Yukarıda verilen program çıktı olarak ne üretir?

Şıklar:
A) -187 | B) -189 | C) -191 | D) -193 | E) -195

Cevap: B -189

Çözüm:
Döngünün içindeki toplama ekleme ifadesini 3'e ayırıp çözelim. İlk ifadede s'ye 2'den 19 a kadar olan sayıları ekliyor. İkinci ifadede s'den 1'den 18'e kadar olan sayıları çıkartıyor, son ifadede ise s'den 3'ten 20'ye kadar olan sayıları çıkartıyor. O zaman S = (19×20 - 1) - (18×19) - (20×21 - 3) = - 189 olur.
Bilgisayar Olimpiyatı 2013, 1. Aşama, Soru 41

# [36-50] Sorular için açıklama
• Soruları standart C (ANSI C) programlama dili çerçevesinde cevaplayınız.
• Gerekli tüm başlık (header) dosyalarının verilen programa dahil edildiğini varsayınız.

---

int r(int n) {
    if (n<4) return -1;
    return r(n-4)+(n%4);
}

void main() {
    printf("%d", r(2013));
}

Yukarıda verilen program çıktı olarak ne üretir?

Şıklar:
A) 501 | B) 502 | C) 503 | D) 504 | E) Hiçbiri

Cevap: B 502

Çözüm:
Dikkat ederseniz r fonksiyonunda (n%4) ifadesi her zaman aynı kalacak çünkü (n-4) mod 4 ≡ n mod 4 olur.
O zaman r(n) = (⌈n/4⌉) × (n mod 4) -1 olur. Dolayısıyla r(2013)= 502 olur.
Bilgisayar Olimpiyatı 2013, 1. Aşama, Soru 42

# [36-50] Sorular için açıklama
• Soruları standart C (ANSI C) programlama dili çerçevesinde cevaplayınız.
• Gerekli tüm başlık (header) dosyalarının verilen programa dahil edildiğini varsayınız.

---

int r(int n) {
    if (n<4) return n<=2?0:1;
    return r(n>>2) + ((n%4)<=2?0:1);
}

void main() {
    printf("%d", r(2013));
}

Yukarıda verilen program çıktı olarak ne üretir?

Şıklar:
A) 1                            B) 2                            C) 3                            D) 4                            E) 5

Cevap: C 3

Çözüm:
Fonksiyonu inceleyelim:
- \(r(2\text{O13}) = r(5\text{O3}) + O\)
- \(r(5\text{O3}) = r(125) + 1\)
- \(r(125) = r(31) + O\)
- \(r(31) = r(7) + 1\)
- \(r(7) = r(1) + 1\)
- \(r(1) = O\)
O zaman \(r(2\text{O13}) = 3\) olur.
Bilgisayar Olimpiyatı 2013, 1. Aşama, Soru 43

# [36-50] Sorular için açıklama
• Soruları standart C (ANSI C) programlama dili çerçevesinde cevaplayınız.
• Gerekli tüm başlık (header) dosyalarının verilen programa dahil edildiğini varsayınız.

---

int r(int *d, int b, int e) {
    int m, r1, r2;
    if (b==e) return d[b];
    m=(b+e)/2;
    r1=r(d, b, m);
    r2=r(d, m+1, e);
    return r1>r2?r1:r2;
}

void main() {
    int a[16]={2,0,1,3,2,0,1,4,2,0,1,5,2,0,1,6};
    printf("%d", r(a, 0, 15));
}

Yukarıda verilen program çıktı olarak ne üretir?

Şıklar:
A) 8 | B) 6 | C) 4 | D) 2 | E) O

Cevap: B 6

Çözüm:
Kodu incelediğimizde kodun b ile e indisleri arasında kalan en büyük elemanın değerini yazdırdığını görürüz. Bu yüzden çıktı 6 olur.
Bilgisayar Olimpiyatı 2013, 1. Aşama, Soru 44

# [36-50] Sorular için açıklama
• Soruları standart C (ANSI C) programlama dili çerçevesinde cevaplayınız.
• Gerekli tüm başlık (header) dosyalarının verilen programa dahil edildiğini varsayınız.

---

void main() {
    int b[3][3]={{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}, i, j;
    for (i=1;i<3;i++)
        for (j=0;j<2;j++)
            b[i][j]+=b[i-1][j+1];
    printf("%d", b[1][0]+b[2][0]+b[2][1]);
}

Yukarıda verilen program çıktı olarak ne üretir?

Şıklar:
A) 15                            B) 20                            C) 25                            D) 30                            E) 35

Cevap: E 35

Çözüm:
Kod sırasıyla şu işlemleri yapar:
- \(b[1][O] += b[O][1]\)
- \(b[1][1] += b[O][2]\)
- \(b[2][O] += b[1][1]\)
- \(b[2][1] += b[1][2]\)
Bu işlemler sonucunda b dizisi \(\begin{bmatrix} 1 & 2 & 3 \\ 6 & 8 & 6 \\ 15 & 14 & 9 \end{bmatrix}\) şeklinde olur. Bu durumda çıktı da 35 olur.
Bilgisayar Olimpiyatı 2013, 1. Aşama, Soru 45

# [36-50] Sorular için açıklama
• Soruları standart C (ANSI C) programlama dili çerçevesinde cevaplayınız.
• Gerekli tüm başlık (header) dosyalarının verilen programa dahil edildiğini varsayınız.

---

int f(int n) {
    if (n==3) return 1;
    return n+f(f(n-1));
}

void main() {
    printf("%d", f(5));
}

Yukarıda verilen program çıktı olarak ne üretir?

Şıklar:
A) Derleme zamanı hatası verir | B) Calışma zamanı hatası verir | C) Sonsuz döngüye girer | D) 5 | E) 6

Cevap: B Calışma zamanı hatası verir

Çözüm:
Kodu inceleyelim. Dikkat ederseniz f(4) = f(1)+ 4 olur ve f(1)'i hesaplarken sürekli önceki n'ler için fonksiyonu tekrar çağırır. Fonksiyon özyinelemeli bir fonksiyon olduğu için pratikte kod çalışma zamanı hatası verir. f(5) de f(4)'ü çağırdığı için
Bilgisayar Olimpiyatı 2013, 1. Aşama, Soru 46

# [36-50] Sorular için açıklama
• Soruları standart C (ANSI C) programlama dili çerçevesinde cevaplayınız.
• Gerekli tüm başlık (header) dosyalarının verilen programa dahil edildiğini varsayınız.

---

void main() {
    int sayi, *p;
    p=&sayi;
    scanf("%d", p);
    switch (sayi+1) {
        case 1:  printf("Bir"); break;
        default :  printf("Beklenmeyen");
        case 2:  printf("Iki"); break;
        case 3:  printf("Uc");
        case 4:  printf("Dort");
    }
}

Program için hangisi doğrudur?

Şıklar:
A) Derleme zamanı hatası verir | B) Çalışma zamanı hatası verir | C) Çıktı "Uc" olabilir | D) Çıktı "Beklenmeyenlki" olabilir | E) Çıktı "IkiUc" olabilir

Cevap: D Çıktı "Beklenmeyenlki" olabilir

Çözüm:
Programda girilen girdiye göre olası çıktılar "Bir", "Beklenmeyenlki", "Iki", "UcDort" veya "Dort" olabilir. O zaman D seçeneği doğrudur.