Cowboy Coder

To code like a Cowboy!

[Lập trình thi đấu cơ bản] Phần 1: Học như thế nào để thi đấu?

Phần trước: [Lập trình thi đấu cơ bản] Phần 0: Giới thiệu về lập trình thi đấu

Cũng như nhiều lĩnh vực khác, để trở thành một pro trong cộng đồng lập trình thi đấu, thì có một từ khóa mà bạn phải luôn nhớ. Đó là “practice anh more practice” hay nói khác đi là phải siêng năng luyện tập và giải bài tập một cách hiệu quả. Vậy làm sao để hiệu quả? Không đơn giản là thấy bài nào cũng làm, bài nào cũng giải một cách vô tội vạ. Mà chúng ta phải có một cách trainning thật sự khoa học. Hôm nay, mình sẽ chia sẻ cho các bạn một số nguyên tắc mà mình đút kết được trong quá trình luyện tập của mình.

Lập trình phải học một cách chủ động

undefined

Vâng, đó là điều cực kì quan trọng. Đa số cộng đồng lập trình thi đấu hiện nay đang là sinh viên hay học sinh phổ thông. Vì vậy việc học trong một khuôn khổ, theo một giáo trình nhất định đôi khi khiến bạn chán nản. Bạn nên tự tìm cho mình một động lực để phấn đấu, để không bị tuột mood khi gặp phải một vấn đề nan giải. Chẳng hạn như bạn hãy tập lên kế hoạch, định hướng trước những gì mình sẽ học và học như hế nào. Như thế bạn sẽ chủ động hơn trong việc học tập của mình và giúp công việc học tập trở nên hiệu quả hơn.

Học từ đâu?

Học từ những người đi trước

undefined

Có một điều bạn luôn phải nhớ, cho dù bạn có là một người uyên bác đến đâu, kiến thức mênh mong như thế nào mà không biết kết hợp chúng để giải quyết vấn đề thì mọi thứ đó cũng điều vô nghĩa cả. Bời vì bạn thiếu một thứ, đó là kinh nghiệm. Kinh nghiệm là thứ không phải tự nhiên mà có, mà nó là thứ phải hun đút theo thời gian. Vì vậy những người đàn anh, những người đi trước là nơi tuyệt vời nhất để học hỏi và rèn luyện kinh nghiệm của mình. Nên đừng tự tin quá cao vào bản thân, hãy làm quen và học hỏi các bậc tiền bối, tham gia vào các hội nhóm liên quan đến lập trình thi đấu để được thưởng lãm những skill khủng mà không phải lúc nào ta cũng nhìn thấy.

Học từ internet

undefined

Cái này thì quá rõ ràng, không khó để hiểu tại sao đa số các CPer thường chọn internet để làm điểm định cư lí tưởng. Internet là một kho kiến thức khổng lồ. Hầu như tất cả các thuật toán, giải thuật mới hay cũ điều có ở đây. Đó là một nguồn tham khảo đầy hấp dẫn. Tuy nhiên, điều đó cũng cực kì nguy hiểm, bởi vì nhiều khi bạn sẽ gặp phải những trang web viết lung tung, không chính xác. Chính vì vậy, khi tham khảo các nguồn tài liệu trên internet, bạn cần phải chọn lọc một cách kĩ càng. Mình sẽ liệt kê một số trang web uy tín và được cộng đồng CPer đánh giá cao:

  • Codeforces: Đây là một trang chuyên tổ chức contest cực kì uy tín. Song song với đó là những blog chia sẻ thú vị đáng để bạn để tâm.

undefined

  • Topcoder: Lại là một trang tổ chức contest, những nó có phần hấp dẫn hơn codeforces. Vì những người đạt thành tích cao trong các contest sẽ có cơ hội được tham dự Topcoder Open được tổ chức hằng năm, và để săn những giải thưởng khủng tại đây.

undefined

  • Google Code Jam: Ngay cái tên cũng đã nói lên giá trị của nó. Đây là cuộc thi được tổ chức hằng năm bỏi Google. Những coder hàng đầu thường tham dự để tìm kiếm một chiếc vé đến Google Code Jam World Final. Đặt biệt, những coder có thành tích cao trong các cuộc thi của GCJ sẽ được ưu ái hơn những người khác nếu muốn ứng tuyển vào một vị trí mơ ước tại Google.

undefined

  • SpojVN Spoj: Chính xác hơn thì đây là nơi lưu trữ bài tập cực khủng, từ vấn bài tập kinh điển, đến hiện đại bạn đều hoàn toàn có thể tìm thấy ở đây. Do vậy, không khó hiểu khi đây là điểm hẹn hò lí tưởng cho những người đam mê lập tình thi đấu.

undefined

  • Ngoài ra, còn rất nhiều trang khác như Hackerrank, Hackerearth, … Các bạn nên tự tìm hiểu để trao dồi hơn khả năng của mình và khám phá những trang đó.

Các kĩ năng cần có của một lập trình viên thi đấu

Thuật toán

Để thi đấu lập trình, bạn cần thuật toán (tất nhiên). Nhưng học những thuật toán nào cho đủ, và học ở đâu?

Nhóm VNOI đã tập hợp lại các kiến thức về thuật toán một cách đầy đủ thành một thư viện, gọi là VNOI Wiki. Đây là nguồn tài liệu quý giá, giúp cho các bạn có thể tiếp cận với kiến thức về thuật toán từ con số không.

Ngoài ra, các bạn cũng có thể đọc cuốn ebook Giải thuật và Lập trình của thầy Lê Minh Hoàng. Đây được ví như cuốn Sách giáo khoa dành cho các đội tuyển tin trên cả nước, với hướng dẫn tường tận cụ thể cho các thuật toán, đi kèm cùng với chứng minh và bài tập thực hành.

undefined

Code nhanh và chính xác

Đúng vậy, kĩ năng code nhanh là cực kì cần thiết trong lập trình thi đấu. Trong các kì thi ACM, khi mà điểm của các đội bằng nhau thì người ta sẽ xếp hạng dựa trên penalty - tức là thời gian hoàn thành problems của các đội. Đội nào có penalty nhỏ hơn sẽ là đội giành chiến thắng. Vì vậy, code nhanh và chính xác là hết sức quan trọng. Nếu có được kĩ năng ấy thì bạn đã có một lợi thế lớn trong lập trình thi đấu. Các bạn có thể kiểm tra khả năng typing của mình và luyện tập ở các trang web nổi tiếng như: 10fastfingers.com, typingtest.com, …

Nắm vững một ngôn ngữ lập trình

Có rất nhiều ngôn ngữ được sử dụng trong các cuộc thi lập trình trên toàn thế giới. Tuy nhiên, ở Việt Nam đối với học sinh thì thường có hai lựa chọn là Pascal và C++, đối với sinh viên thì lại là C++ hoặc Java. Do đó, lựa chọn cho mình một ngôn ngữ chủ yếu và nắm vững nó là một điều bắt buộc phải làm nếu muốn đạt được những kết quả như ý.

Tại Cowboy Coder, chúng mình cung cấp series bài viết C++ Cơ bản, giúp các bạn có thể tiếp cận với một trong những ngôn ngữ phổ biến của bộ môn Lập trình thi đấu từ cơ bản.

Quản lí thời gian trong kì thi

Đây là một kĩ năng cực kì quan trọng. Thời gian luôn luôn là một áp lực vô hình đáng sợ. Nếu không muốn bị nó đè bẹp thì hãy tập cho mình một cách quản lí thời gian trong cuộc thi thật tốt. Hãy phân bổ hợp lí để lấy được càng nhiều điểm có thể.

Chiến thuật làm bài

Cũng như thời gian, chiến thuật cũng quan trọng không kém. Nguời xưa có câu: “Biết người, biết ta. Trăm trận, trăm thắng.” Khi đọc một bài toán, đầu tiên hãy cố gắng lấy được càng nhiều điểm càng tốt của bài toán đó. Hãy giải từng subtask một trước tiên. Tránh tình trạng lao đầu vào tìm thuật toán tối ưu đến hết giờ vẫn chưa ra. Trong khi ít nhất ta có thể có được phần nhiều số điểm của bài ở những subtask dễ hơn. Các bạn hãy hết sức lưu ý điều này, bời vì trong các kì thi lớn có tính cạnh tranh cao, đôi khi khẳng cách giữa có huy chương và không có huy chương là những điểm số cực kì nhỏ.

Bài viết phần một kết thúc ở đây. Trong phần hai, chúng ta sẽ bàn về quy trình giải một bài toán trong lập tình thi đấu.