โจทย์: ให้ Sorted Array ขนาด \(N\) และค่า \(X\) จงหาตำแหน่ง (Index) ของ \(X\) ถ้าไม่พบให้ตอบ -1 .
low = 0, high = N-1 .
mid = low + (high-low)/2 เพื่อป้องกัน Overflow .
arr[mid] == X ตอบ mid, ถ้า < X เลื่อน low, ถ้า > X เลื่อน high .
โจทย์: ใน Sorted Array มีเลข \(X\) ปรากฏอยู่กี่ครั้ง? .
std::lower_bound หาตำแหน่งแรกที่ค่า \(\ge X\) .
std::upper_bound หาตำแหน่งแรกที่ค่า \(> X\) .
โจทย์: กำหนด Sorted Array และเป้าหมาย \(T\) จงหาว่ามีคู่ตัวเลขสองตัวที่บวกกันได้ \(T\) หรือไม่ , .
for เพื่อเลือกตัวเลขตัวแรก arr[i] .
target = T - arr[i] .
target ในส่วนที่เหลือของอาเรย์ .
Complexity: \(O(N \log N)\)
มีไส้กรอกยาวต่างกัน \(N\) แท่ง ตัดให้ได้ \(M\) ชิ้นยาวเท่ากัน จงหา ความยาวชิ้นที่มากที่สุด .
Hint: ถ้าตัดยาว \(L\) ได้ชิ้นครบ ความยาวที่น้อยกว่า \(L\) ก็ต้องได้ครบ (Monotonic) .
ok(L) ตรวจสอบค่ากลาง , .
มีเมือง \(N\) เมือง แต่ละเมืองมีประชากร \(P_i\) และมีหีบบัตรเลือกตั้ง \(B\) หีบ (\(B \ge N\)) ต้องกระจายหีบให้ทุกเมือง (อย่างน้อยเมืองละ 1) โดยต้องการให้ จำนวนประชากรสูงสุดต่อหนึ่งหีบ มีค่าน้อยที่สุด .
"Minimize the Maximum" - โจทย์แนวมาตรฐานของ Binary Search on Answer.
ok(K): ถ้าให้แต่ละหีบรับได้สูงสุด \(K\) คน จะใช้หีบรวมกันไม่เกิน \(B\) หรือไม่?
needed = sum(ceil(P_i / K))
needed <= B แปลว่าค่า \(K\) นี้ใช้ได้ ให้ลองหาค่าที่น้อยกว่านี้ .
โจทย์: จงหาค่า \(\sqrt{N}\) โดยไม่ใช้ฟังก์ชันสำเร็จรูป ให้ตอบเป็นทศนิยมแม่นยำ \(10^{-7}\) .
"หากข้อไหนทำไม่ได้ภายใน 20 นาที ให้หยุดอ่านเฉลย ทำความเข้าใจ แล้วกลับมา เขียนโค้ดใหม่ด้วยตัวเอง (Up-solve)" .
เทคนิคนี้ช่วยพัฒนาImplementation skills ได้เร็วที่สุดเมื่อเริ่มต้น .
เจอกันพรุ่งนี้กับเรื่อง: STL Containers & Data Structures!