Yechim tahlili

Yuk tashish jadvali

Muallif: __thecrash__

Masalaning shartiga ko'ra, konteynerlarni ketma-ket tartibda aynan \(m\) ta mashinaga shunday taqsimlashimiz kerakki, eng ko'p yuklangan mashinaning og'irligi iloji boricha kichik bo'lsin. Bu klassik ikkilik qidirish (Binary Search on Answer) masalasidir.

Eng ko'p yuklangan mashinaning minimal og'irligi \(X\) bo'lishi mumkin bo'lgan diapazonni aniqlaymiz:

  • Minimal qiymat (\(low\)) — massivdagi eng katta element (\(\max(a_i)\)), chunki bitta konteynerning o'zi ham mashinaga sig'ishi kerak.
  • Maksimal qiymat (\(high\)) — barcha konteynerlar og'irliklari yig'indisi (\(\sum a_i\)), agar hamma yuk bitta mashinaga yuklansa.

Shu diapazonda ikkilik qidirish qo'llaymiz. Har bir o'rta qiymat (\(mid\)) uchun:

  • Ushbu limit (\(mid\)) bilan konteynerlarni \(m\) ta yoki undan kam mashinaga bo'lib chiqish mumkinligini tekshiramiz (check(mid) funksiyasi).
  • Agar yuklarni \(mid\) dan oshirmasdan \(m\) ta mashinaga sig'dirish imkoni bo'lsa, demak, javobni kichikroq qiymatlardan qidirib ko'ramiz (\(high = mid - 1\)) va joriy javobni saqlaymiz.
  • Aks holda, limit juda kichiklik qiladi, shuning uchun \(low = mid + 1\) qilamiz.

Vaqt murakkabligi: \(O(n \log(\sum a_i))\), bu berilgan chegaralar uchun juda tez ishlaydi.

Navbatdagi musobaqa