การเขียนโปรแกรมเชิงแข่งขัน
หลักการ
การเขียนโปรแกรมเชิงแข่งขันแบ่งออกเป็นสองหัวข้อหลักๆ คือ
การออกแบบวิธีการคิด
ส่วนนี้จะเน้นเรื่องทักษะการแก้ปัญหาและพื้นฐานการคิด บางทีต้องมีความคิดสร้างสรรค์ ประกอบกับทฤษฎีต่างๆ โดยทั่วไปแล้ววิธีการแก้ปัญหาจะประกอบด้วยเทคนิคที่รู้กันทั่วไปร่วมกับความเป็นเอกลักษณ์ของปัญหานั้นๆ
การเขียนโปรแกรมตามวิธี
ส่วนนี้จะเน้นว่าเราสามารถถ่ายทอดวิธีการคิดของเราสู่โปรแกรมคอมพิวเตอร์ได้อย่างถูกต้อง ปกติแล้วแค่วิธีคิดถูกต้องนั้นไม่เพียงพอในการแข่งขันเขียนโปรแกรมให้ได้ดี ข้อแตกต่างสำคัญกับการเขียนโปรแกรมทั่วไปคือโปรแกรมในการแข่งขันจะสั้น (มากที่สุดหลักไม่กี่ร้อยบรรทัด) และไม่จำเป็นต้องดูแลโปรแกรมหลังจากแข่งเสร็จ
การบริหารเวลา
เป็นสิ่งสำคัญที่สุดในการแข่งขัน
ให้คำนึงให้ได้ว่าเราจะใช้เวลาเท่าไรในการทำโจทย์ลักษณะนี้ แล้วจะได้คะแนนเท่าไร แล้วลำดับความสำคัญในการเลือกโจทย์ให้ได้
พยายามสร้างกฏที่เหมาะสมกับตัวเอง เช่น ถ้าบัคเกินสามสิบนาทีแบบไม่มีความคืบหน้า ให้เปลี่ยนไปอ่านข้ออื่นอย่างน้อยห้านาที
Time Complexity
ก่อนจะเริ่มลงมือเขียนโปรแกรม เราควรจะรู้ให้ได้ว่าสิ่งที่เราเขียนจะได้กี่คะแนนสำหรับปัญหานั้น
Big O Notation เป็นสิ่งสำคัญที่ควรจะคาดคะเนให้ได้ว่าเราจะได้คะแนนเท่าไร
จุดอ้างอิงคร่าวๆ ให้คาดว่า C++ สามารถรันได้ 1, 000, 000, 000 (พันล้าน) คำสั่งต่อหนึ่งวินาที ซึ่งหมายความว่า
N = 1, 000 สามารถคิดวิธี O(N3) ได้แบบฉิวเฉียด O(N2log N) ได้อย่างปลอดภัย
N = 1, 000, 000 ควรจะ O(Nlog N)
N = 20 อาจจะเป็น O(2N)
จำว่า 220 มีค่าประมาณ 1, 000, 000 (หนึ่งล้าน)
ขนาด N |
เวลาที่ควรใช้ |
|---|---|
N ≤ 10 |
O(N!) |
N ≤ 20 |
O(2N) |
N ≤ 500 |
O(N3) |
N ≤ 5000 |
O(N2) |
N ≤ 106 |
O(Nlog N) or O(N) |
N is large |
O(1) or O(log N) |
สัญลักษณ์ |
ความหมาย |
|---|---|
P |
ถูกต้อง |
- |
Incorrect Output |
X |
Error |
T |
Timeout |