ในข้อนี้เราต้องการหาเวลาที่น้อยที่สุดกุลีที่สามารถขนถ่ายสินค้าได้ครบ
หากเราพิจารณาค่า ใด ๆ โดยนิยามให้ หมายถึงฟังก์ชันแทนจำนวนสินค้าที่มากที่สุดที่กุลีทั้งหมดสามารถขนถ่ายได้โดยใช้เวลาไม่เกิน จะสังเกตว่า เสมอ เพราะถ้ากุลีคนที่ ใด ๆ ขนสินค้าได้ ชิ้นในเวลาไม่เกิน หน่วยก็แปลว่าย่อมสามารถขนได้ด้วยเวลา หน่วยเช่นกันเพราะ จากเหตุผลดังกล่าวจะได้ว่าฟังก์ชัน เป็นฟังก์ชัน Monotone ดังนั้นการหาค่า ที่น้อยที่สุดที่ สามารถหาได้ด้วยการ Binary Search ค่า โดยตรง
การทำ Binary Search บนช่วงคำตอบนั้นเริ่มได้จากการกำหนดตัวแปร และ แทนจุดเริ่มต้นและจุดสิ้นสุดของช่วงโดยในตอนเริ่มต้นกำหนดให้ และ ระหว่างการทำ Binary Search หากกำลังพิจารณาคำตอบในช่วง อยู่โดย mid = (l+r)/2
จะมีกรณีที่ต้องพิจารณาเพื่อเปลี่ยนช่วงคำตอบ 2 กรณีดังนี้
- นั่นหมายความว่าคำตอบที่ต้องการนั้นมีค่าน้อยกว่าหรือเท่ากับ
mid
แน่นอน จึงเปลี่ยนช่วงไปพิจารณาช่วง ต่อไป - นั่นหมายความว่าคำตอบที่ต้องการนั้นมากกว่า
mid
แน่นอน จึงเปลี่ยนช่วงไปพิจารณาช่วง ต่อไป
วิธีในการคำนวณค่า สำหรับค่า ใด ๆ นั้นสามารถทำได้โดยการไล่คิดผลรวมจำนวนสินค้าที่มากที่สุดที่กุลีสามารถขนถ่ายได้โดยใช้เวลาไม่เกิน ตั้งแต่กุลีคนที่ กล่าวคือ
วิธีการดังกล่าวจะใช้ Time Complexity ต่อการคิด 1 ครั้ง เพราะได้ไล่คิดในทุกๆ index ตั้งแต่ ซึ่งถ้าคิดในกรณี Worst Case Time Complexity จะคิด ครั้งเมื่อ ค่า มากสุดที่เป็นไปได้ใน input = ดังนั้นจะมี Worst Case Time Complexity รวม เมื่อ ค่า มากสุดที่เป็นไปได้ใน input =
โค้ดตัวอย่างดังนี้
#include <bits/stdc++.h> using namespace std; long long n, m; long long pw[1000100]; int main() { scanf("%lld %lld", &m, &n); for (int i = 1; i <= m; i++) { scanf("%lld", &pw[i]); } long long l = 1, r = 1000000LL * n; while (l < r) { long long mid = (l + r) / 2; long long all = 0; for (int i = 1; i <= m; i++) { all += mid / pw[i]; } if (all >= n) r = mid; else l = mid + 1; } printf("%lld", l); return 0;