หากโจทย์ต้องการให้หาค่ามากสุดหรือน้อยสุดที่ทำให้เงื่อนไขเกี่ยวกับค่ามากสุด/น้อยสุดบางอย่างเป็นจริง เทคนิคหนึ่งที่ควรนึกถึงคือการแปลงปัญหาเป็น Decision Problem แล้วทำการ Binary Search
สมมุติให้ "ค่าของความน่าเบื่อของคาบที่เข้าเรียนที่น่าเบื่อมากที่สุด" ที่ยอมรับได้เป็น นั่นคือ โจทย์ต้องการให้เราหาค่า ที่สามารถหาวิธีโดดเรียนได้จริง (เรียกว่า )
สังเกตว่า
- หากทดลองให้ แล้วเราสามารถหาวิธีโดดเรียนได้ จะได้
- หากทดลองให้ แล้วหาวิธีโดดเรียนไม่ได้ จะได้
ดังนั้น เราสามารถหา ได้ด้วย Binary Search โดยขอบเขตเริ่มต้นคือ เมื่อ ค่าที่น้อยสุดในข้อมูลนำเข้า และ ค่าที่มากที่สุดในข้อมูลนำเข้า
สมมุติว่าโจทย์ไม่มีเงื่อนไขบังคับว่า "ต้องเข้าเรียนอย่างน้อย 1 คาบในแต่ละวัน" การตรวจสอบว่าสามารถหาวิธีโดดเรียนให้ค่าความน่าเบื่อมากสุดไม่เกิน ได้จริงหรือไม่ ทำได้ด้วย Greedy Algorithm ดังนี้
- ดูว่าคาบแรกน่าเบื่อเกิน หรือไม่ ถ้าเกิน เราจะโดดคาบที่ ถึง แล้วไปพิจารณาคาบที่ ต่อเลย แต่จะเหลือสิทธิ์โดดเรียนเพียง ครั้ง
- ถ้าคาบแรกไม่เกิน ให้ยอมเรียนไปก่อน แล้วพิจารณาคาบถัดไปแทน หากเจอคาบที่น่าเบื่อเกิน จึงโดดทีเดียวทั้งหมด คาบ (หรือจนหมดวันเรียน)
- ทำไปเรื่อย ๆ จนกว่าจะพิจารณาครบทุกคาบ (นั่นคือทำได้) หรือใช้สิทธิ์โดดเรียนเกินที่มีอยู่ (นั่นคือทำไม่ได้)
ถึงอย่างไรก็ตาม หากใส่เงื่อนไข "ต้องเข้าเรียนอย่างน้อย 1 คาบในแต่ละวัน" เข้ามา จะพบว่ามีบางกรณีที่มีปัญหา เช่น หาก , และลำดับที่กำหนดให้คือ คำตอบย่อมเป็น เสมอ
สามารถแก้ปัญหานี้ได้โดยทดลองเลือกคาบเรียนที่บังคับว่าต้องเรียน 1 คาบ (สมมุติว่าเลือกคาบ โดยต้องน่าเบื่อไม่เกิน ) แล้วหาว่าจำเป็นต้องโดดเรียนในคาบที่ ถึง กี่ครั้ง (เรียกว่า ) และในคาบที่ ถึง กี่ครั้ง (เรียกว่า ) เพื่อไม่ให้มีคาบใดน่าเบื่อเกิน
หากมีค่า อย่างน้อยหนึ่งค่าที่ทำให้ แปลว่าเราสามารถหาวิธีโดดเรียนให้ได้ค่าความน่าเบื่อมากสุดไม่เกิน
อนึ่ง และ สามารถหาได้โดยการ precompute ตาม Greedy Algorithm ที่อธิบายข้างต้นจากซ้ายไปขวาและจากขวาไปซ้าย ตามลำดับ
เรา binary search ทั้งหมด ครั้ง แต่ละครั้งต้อง
- precompute และ ใน
- ทดลองเลือกค่า ที่ทำให้เงื่อนไขเป็นจริงใน
ดังนั้น Time Complexity จึงเป็น