این مسئله رو به روشای مختلفی میشه حل کرد. ولی بذارین با روشایی که تا الان کار کردیم حلشون کنیم :


جواب با جستجوی دودویی

عضو  i ام آرایه ی b مساویه با جمع همه ی عضوای a  تو بازه ی بسته 1 تا i . و b0 = 0 هستش.

برای اینکه بدونیم مسئلن از کتاب سوم تا ششم چقد باید بخونیم میتونیم اینجوری بنویسیم : 

sum = b[6] - b[3-1] = b[6] - b[2]

حالا برای پیدا کردن جواب... هر دفعه یه کتاب رو بعنوان کتاب اول فرض میکنیم و با جستجوی دودیی تو کتابای بعد از خودش دنبال جواب مناسب میگردیم و جواب ماکسیمم رو انتخاب میکنیم . O_nlogn


اما میشه با O_n هم مسئله رو حل کرد. میتونید کدش رو ببینید :

جواب با TwoPointer

تو این روش میایم دو تا اشاره گر میگیریم که x به کتاب اول اشاره میکنه و اشاره گر دوم یعنی y اونقدر میره جلو که جمع زمانها از t بیشتر نشه و بهترین جواب رو برای موقعی که x اولین کتاب باشه پیدا میکنه .

بعد میایم x رو از مجموعه حذف میکنیم و تعدادش رو از sum کم میکنیم و میریم سراغ کتاب بعدی و همین کار رو ادامه میدیم ...

ولی y رو به اول برنمیگردونیم چون میدونیم وقتی x رو از مجموعه حذف میکنیم sum کمتر میشه و امکان نداره تا اون نقطه sum برای کتاب جدید بیشتر از t بشه پس حتما تا اونجارو میتونیم بخونیم .

پس ما از روی هر کتاب با اشاره گرای xوy فقط یبار رد میشیم که میشه 2n = O_n