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