01418232 Algorithm Design and Analysis 2553: robot

(เอามาจาก Kleinberg & Tardos บทที่ 6 แบบฝึกหัดข้อ 8)

ในเมืองแห่งอนาคตเมืองหนึ่งที่หุ่นยนต์ถูกพัฒนาจนกระทั่งสามารถคิดกลับมาทำร้ายคนได้ คุณเป็นหนึ่งในศิษย์ที่อยู่ในสำนักซีออนในเมืองแห่งนี้ และศิษย์ทุกคนได้รวมตัวกันเพื่อจะต่อต้านหุ่นยนต์เหล่านี้โดยใช้กังฟู อาวุธต่างๆ และอัลกอรึธึมที่มีประสิทธิภาพ ศิษย์เหล่านี้ได้ร่วมกันหาวิธีที่จะต่อสู้กับหุ่นยนต์ที่เข้าโจมตีคราวละหลายๆดัวโดยอัตโนมัติ ซึ่งโดยทั่วไปแล้วลักษณะการโจมตีของหุ่นยนต์จะเป็นดังนี้


 * กลุ่มของหุ่นยนต์จะเข้าโจมตีทีละวินาที แต่ละวินาทีจะมีกลุ่มหุ่นยนต์เข้าโจมตีด้วยจำนวนที่ไม่เท่ากัน กล่าวคือ ในวินาทีที่ i จะมีหุ่นยนต์เข้าโจมตีจำนวน xi ตัว โดยจะมีการจู่โจมเป็นเวลา n วินาที และด้วยเทคโนโลยีขั้นสูงของสำนักซีออน จะมีกล้องคอยสอดส่องดูการจู่โจมของหุ่นยนต์ ดังนั้นคุณจะรู้ลำดับของจำนวนหุ่นยนต์ที่จะเข้าโจมตีล่วงหน้า กล่าวคือ คุณรู้ x1, x2, ..., xn ล่วงหน้า


 * คุณมีปืน EMP (Electromagnetic pulse) ที่จะทำลายหุ่นยนต์เหล่านี้ได้คราวละหลายๆตัวในเวลาหนึ่งๆ แต่จะไปทำลายหุ่นยนต์ในเวลาก่อนๆไม่ได้ และพลังการทำลายล้างก็จะขึ้นอยู่กับว่า คุณได้ชาร์จปืนไว้ได้นานกี่วินาที ถ้ากล่าวเป็นภาษาเลข เราจะบอกว่า การชาร์จนี้เป็นฟังก์ชั่น f(j) โดยที่ j เป็นจำนวนวินาทีที่ได้ชาร์จ และ f(j) เป็นจำนวนหุ่นยนต์ที่ปืน EMP นี้จะทำลายได้ โดยที่เมื่อใช้ปืนแล้วแต่ละครั้ง พลังก็จะหายไปหมด ถึงแม้ว่าจำนวนหุ่นยนต์ในเวลานั้นอาจจะมีน้อยกว่าพลังการทำลายหุ่นยนต์


 * ตัวอย่างเช่น ถ้าคุณยิงปืนได้แล้วในวินาทีที่ 1 และถ้าขณะนี้เป็นวินาทีที่ 3 จะถือว่าคุณได้ชาร์จมาแล้ว 2 วินาที เมื่อคุณยิงปืน คุณก็จะทำลายหุ่นยนต์ได้ min(x3, f(2)) ตัว ถ้ากล่าวเป็นภาษาเลข เราจะบอกว่า ถ้าเราในปืนในวินาทีที่ k และเราไม่ได้ใช้ปืนมา j วินาที เราจะทำลายได้ min(xk, f(j) หุ่นยนต์

จงโปรแกรมเพื่อหาจำนวนหุ่นยนต์ที่มากที่สุดที่ศิษย์ในสำนักซีออนจะทำลายได้ (โดยต้องเลือกวินาทีการยิงปืนที่เหมาะสม)

ตัวอย่าง ถ้า n = 4 และค่า [x1, x2, x3, x4] = [1, 10, 10, 1] และการชาร์จปืนคือ [f(1), f(2), f(3), f(4)] = [1, 2, 4, 8] จำนวนหุ่นยนต์ที่มากที่สุดที่คุณจะทำลายได้จะเป็น 5 ตัว โดยที่คุณจะต้องยิงปืนที่ วินาทีที่ 3 และ 4 คุณอาจจะคิดว่า ถ้าพิจารณากรณีที่คุณชาร์จถึง 4 วินาทีเพื่อให้ได้พลังยิงถึง 8 ตัวก็น่าจะเป็นคำตอบที่ดีที่สุด แต่จะเห็นว่าในวินาที 4 มีหุ่นยนต์แค่ 1 ตัวเท่านั้น ดังนั้นแม้ว่าจะมีพลังมาก แต่ถ้าวินาทีนั้นมีจำนวนหุ่นยนต์น้อย ก็ทำลายได้น้อย
 * ในวินาทีที่ 3 คุณจะยิงทำลายหุ่นยนต์ได้ min(10, 4) = 4 ตัว
 * ในวินาทีที่ 4 คุณได้ชาร์จมาแค่ 1 วินาทีเท่านั้น เพราะคุณคุณเพิ่งยิงไปในวินาทีที่ 3 ดังนั้นคุณจะทำลายได้แค่ 1 หุ่นยนต์เท่านั้น โชคดีที่ในวินาทีที่ 4 มีหุ่นยนต์เข้ามาแค่ 1 ก็เลยทำลายได้ 1 ดังนั้นรวมกับวินาทีที่ 3 คุณทำลายได้ 5 ตัว

ข้อมูลเข้า
บรรทัดแรกมีจำนวนเต็ม n (1 <= n <= 10,000) หมายถึงจำนวนวินาที

อีก n บรรทัดต่อไปมีจำนวนเต็มบรรทัดละสองตัว โดยบรรทัดที่ i+1 มีจำนวนเต็ม xi และ f(i) (1 <= xi, f(i) <= 150,000) หมายถึงจำนวนหุ่นยนต์ที่เข้าโจมตีในวินาทีที่ i และจำนวนหุ่นยนต์ที่ปืนจะทำลายได้หลังชาร์จมา i วินาที ตามลำดับ

ข้อมูลออก
พิมพ์จำนวนเต็มซึ่งมีค่าเท่ากับ จำนวนหุ่นยนต์ที่มากที่สุดที่คุณจะทำลายได้ ออกมาในบรรทัดแรก

ตัวอย่าง 1
เพิ่มเติม - (input1 | output1), (input2 | output2), (input3 | output3)

ข้อกำหนด
โปรแกรมของคุณต้องหยุดการทำงานภายในเวลา 1 วินาที และใช้หน่วยความจำไม่เกิน 16 MB