Asosiy qismga o‘tish

8. Ochko‘z algoritmlar

Nazariya

Fikr

Ochko‘z (greedy) algoritm har qadamda shu paytdagi eng yaxshi
tanlovni qiladi va orqaga qaytmaydi.

Klassik misol: tadbirlarni tanlash

Boshlanish va tugash vaqti berilgan tadbirlardan eng ko‘pini tanlash
kerak (ular kesishmasin).

To‘g‘ri strategiya — eng erta tugaydiganini olish:

tadbirlar.sort(key=lambda t: t[1])     # tugash vaqti bo‘yicha
oxiri = -10**18
soni = 0
for boshi, tugashi in tadbirlar:
    if boshi >= oxiri:
        soni += 1
        oxiri = tugashi
print(soni)

«Eng qisqasini» yoki «eng erta boshlanadiganini» olish esa noto‘g‘ri
javob beradi.

Qachon ishlaydi

Ochko‘z usul faqat masala ochko‘z tanlov xossasiga ega bo‘lganda
to‘g‘ri: mahalliy eng yaxshi tanlov global eng yaxshi javobga olib
borishi kerak.

Buni his qilishning amaliy yo‘li — qarshi misol izlash. Topa
olmasangiz va isbot topsangiz, ochko‘z ishlaydi.

Tipik qarshi misol: tanga

Tangalar 1, 3, 4 va 6 so‘m yig‘ish kerak. Ochko‘z: 4 + 1 + 1 = uchta
tanga. To‘g‘ri javob: 3 + 3 = ikkita. Demak bu masalada ochko‘z
xato — u yerda dinamik dasturlash kerak.

Lekin odatdagi pul tizimida (1, 5, 10, 25) ochko‘z to‘g‘ri ishlaydi.

Ko‘p uchraydigan ochko‘z naqshlar

  • saralab, ketma-ket olish;
  • eng katta / eng kichikni olish (heapq bilan);
  • juftlashtirish: eng kattani eng kichigi bilan;
  • oraliqlarni tugash vaqti bo‘yicha saralash.

Deyarli barchasi saralashdan boshlanadi.

Misol

tadbirlar = sorted(tadbirlar, key=lambda t: t[1])
oxiri = float('-inf')
soni = 0
for boshi, tugashi in tadbirlar:
    if boshi >= oxiri:
        soni += 1
        oxiri = tugashi
print(soni)

Mashq masalalari

✓KodMasalaQiyinlik
AL08-1 Tangalar Boshlang‘ich
AL08-2 Tadbirlar Oson
AL08-3 Qayiqlar O‘rta
AL08-4 Eng katta son Qiyin
AL08-5 Navbatda kutish Oson

Nazorat savollari

1 Ochko‘z algoritm nima qiladi? Bitta to‘g‘ri javob
2 Tadbirlarni tanlash masalasida nima bo‘yicha saralanadi? Bitta to‘g‘ri javob
3 Ochko‘z algoritm har qanday masalada to‘g‘ri javob beradi. To‘g‘ri yoki noto‘g‘ri
4 Tangalar 1, 3, 4 va 6 so‘m yig‘ish kerak. Ochko‘z nechta tanga beradi? Bitta to‘g‘ri javob
5 O‘sha masalada to‘g‘ri javob nechta tanga? Qisqa javob — yoziladi
6 Ochko‘z yechim to‘g‘riligini qanday tekshirish mumkin? Bir nechta to‘g‘ri javob

Bir nechta javob to‘g‘ri bo‘lishi mumkin.

7 Tadbirlarni tugash vaqti bo‘yicha saralash uchun key nima bo‘ladi? Bo‘sh joyni to‘ldirish
tadbirlar.sort(key=lambda t: t[____])
8 Ko‘pchilik ochko‘z yechimlar saralashdan boshlanadi. To‘g‘ri yoki noto‘g‘ri
9 Har qadamda eng kichik elementni tez olish uchun qaysi tuzilma qulay? Bitta to‘g‘ri javob
10 Ochko‘z va dinamik dasturlash orasidagi asosiy farq nima? Bitta to‘g‘ri javob

Javoblar serverda tekshiriladi. Katta-kichik harf, apostrof shakli va ortiqcha bo‘shliq ahamiyatsiz.