Làm thế nào tôi giành được 3 trong số 4 huy chương vàng tại Olympic Tin học

Làm thế nào tôi giành được 3 trong số 4 huy chương vàng tại Olympic Tin học

Tôi đang chuẩn bị cho vòng chung kết giải vô địch thế giới Google HashCode 2017. Đây là cuộc thi lớn nhất về các bài toán thuật toán do Google tổ chức.

Tôi bắt đầu học C++ từ đầu năm lớp chín. Tôi không biết gì về lập trình, thuật toán hay cấu trúc dữ liệu. Tại một thời điểm nào đó, tôi đã viết dòng mã đầu tiên của mình. Bảy tháng sau, cuộc thi lập trình đã đến gần. Tôi muốn xem phong cách học lập trình của tôi hoạt động tốt như thế nào. Đó là cơ hội hoàn hảo.

Sau hai ngày thi đấu đã có kết quả: Em đạt huy chương vàng.

Tôi đã bị sốc. Tôi đã đi trước các đối thủ với 5 năm kinh nghiệm. Tôi biết mình đã làm việc chăm chỉ nhưng thành tích này đã vượt quá mọi mong đợi của tôi. Tôi nhận ra rằng chương trình thể thao là chủ đề của mình và lao đầu vào nó.

Tôi biết điều gì đã đưa tôi đến thành công và tôi muốn chia sẻ điều đó với bạn.

Làm thế nào tôi giành được 3 trong số 4 huy chương vàng tại Olympic Tin học

Bài viết được dịch với sự hỗ trợ của EDISON Software, công ty chăm sóc sức khỏe của các lập trình viên và bữa sáng của họphát triển phần mềm tùy chỉnh.

Chọn ngôn ngữ lập trình nào

  • C++ - Rất khuyến khích! Anh ấy rất nhanh. Việc thực hiện các thuật toán mất ít thời gian do STL. C++ được chấp nhận trong mọi cuộc thi. Tôi đã viết dòng mã đầu tiên của mình bằng C++.
  • C - Học C++ nhờ STL. Nếu bạn biết C, bạn cũng có thể lập trình bằng C++.
  • Java là một ngôn ngữ lập trình chậm. Nó có lớp Big Integer, nhưng nó sẽ không giúp ích gì nhiều cho bạn. Nếu một cuộc thi có giới hạn thời gian, với Java bạn chắc chắn sẽ vượt qua nó. Java không được chấp nhận ở mọi cuộc thi.

Bạn có thể thực hành ở đâu

Tôi đề nghị Thẩm phán trực tuyến Sphere (SPOJ). Đây là nguồn lực có hiệu quả cả về số lượng và chất lượng. Các trình soạn thảo và giải pháp đều có sẵn trực tuyến nếu bạn gặp khó khăn trong quá trình giải quyết vấn đề. Ngoài trang web này tôi khuyên bạn nên Bộ công cụ SPOJ и phân loại vấn đề cho SPOJ.pl.

Đầu tiên bạn cần trau dồi kiến ​​thức cơ bản

Khi bạn đã quen với cú pháp của ngôn ngữ, sẽ có một số vấn đề cần khắc phục. Bắt đầu với những vấn đề đơn giản đòi hỏi phải thực hành. Ở giai đoạn này, điều quan trọng nhất là xác định phong cách lập trình của bạn. Có thể bạn thích viết mã có nhiều khoảng trắng, có thể không. Bạn có thể đặt dấu ngoặc đơn trên cùng một dòng với chữ “if” hoặc bạn có thể đặt chúng trên các dòng riêng biệt.

Bạn phải tìm ra phong cách lập trình của mình vì đó là phong cách CỦA BẠN.

Khi bạn tìm kiếm nó, hãy nhớ hai nguyên tắc cơ bản:

  • Mã của bạn phải dễ thực hiện. Bạn sẽ cảm thấy thoải mái khi thực hiện giải pháp mà bạn nghĩ ra. Tại sao? Bởi vì trong một cuộc thi, điều cuối cùng bạn muốn là bị lạc mã của mình. Sẽ tốt hơn nếu bạn dành thêm 5 phút để suy nghĩ về cách đơn giản hóa việc triển khai mã hơn là dành 10 phút để tìm ra nó.
  • Mã của bạn phải dễ đọc. Khi mã dễ đọc thì dễ gỡ lỗi. Hãy đối mặt với điều đó—lỗi luôn xảy ra. Bạn có biết cảm giác đó khi bạn chỉ còn 10 phút và không thể tìm ra sai lầm chết tiệt nào không? Tất nhiên là có. Để tránh tình trạng này, hãy viết mã dễ đọc. Khi bạn bắt đầu gỡ lỗi, mã sẽ có vẻ tự nhiên và dễ hiểu.

Đây là một ví dụ của tôi phong cách lập trình.

Làm thế nào để cải thiện kỹ năng phát triển của bạn

Luyện tập, luyện tập và luyện tập nhiều hơn nữa. Tôi khuyên bạn nên giải quyết 250 vấn đề có thể giải quyết được đầu tiên trên SPOJ. Giải quyết chúng theo thứ tự. Hãy dành ít nhất một giờ để suy nghĩ về giải pháp cho từng vấn đề đó.

Đừng nói: “Bài toán này khó quá, tôi sẽ cố gắng giải bài tiếp theo”. Đây là cách suy nghĩ của những người thua cuộc.

Lấy một mảnh giấy và một cây bút chì. Hãy nghĩ về nó. Có thể bạn sẽ tìm được giải pháp, có thể không. Ở mức tối thiểu, bạn sẽ phát triển tư duy thuật toán. Nếu bạn không thể đưa ra giải pháp trong vòng một giờ, hãy tìm giải pháp có sẵn trên diễn đàn hoặc trong các bài viết.

Bạn sẽ đạt được gì với cách tiếp cận này? Tìm hiểu cách triển khai nhanh chóng ý tưởng của bạn bằng cách sử dụng mã. Và nghiên cứu các vấn đề và thuật toán cổ điển.

Thứ hai, bạn phải nắm vững các thuật toán và cấu trúc dữ liệu

Thực hiện theo một cách tiếp cận phân cấp. Bạn bắt đầu chạy mà không biết đi bộ? KHÔNG. Bạn có thể xây một tòa nhà chọc trời mà không có nền móng vững chắc không? Không lập lại.

Bạn không thể bỏ qua các bước trong lộ trình học tập. Nếu bạn bỏ qua chúng, bạn sẽ bị bỏ lại những lỗ hổng kiến ​​thức. Theo thời gian họ sẽ chỉ trở nên tồi tệ hơn.

Bắt đầu với các thuật toán và cấu trúc dữ liệu cơ bản

Thật khó để bắt đầu. Có lẽ vì bạn chưa biết nên học gì trước. Đó là lý do tại sao Tôi đã tạo một khóa học video “Thuật toán và cấu trúc dữ liệu”. Khi tạo khóa học này, tôi dựa trên cách tôi muốn được dạy. Phản ứng thật đáng kinh ngạc! Hơn 3000 sinh viên từ hơn 100 quốc gia đã đăng ký khóa học trong tháng đầu tiên.

Nếu bạn cố gắng giải quyết những vấn đề dễ dàng, bạn sẽ không bao giờ tiến bộ.

Cách hiệu quả nhất để hiểu những gì bạn chưa biết là trải nghiệm nó trong thực tế. Đó là cách tôi học được. Tôi đã học được nhiều kỹ thuật mới mà trước đây tôi chưa từng nghe đến bằng cách chọn một nhiệm vụ đầy thử thách.

Mỗi vấn đề thứ ba bạn giải quyết sẽ dạy cho bạn điều gì đó mới mẻ. Hãy cẩn thận hơn khi lựa chọn vấn đề. Chọn những vấn đề khó khăn hơn!

Sau khi hoàn thành 250 vấn đề này từ SPOJ, bạn sẽ có hiểu biết cơ bản về các chủ đề cốt lõi của lập trình thể thao. Với sự hiểu biết sâu sắc về logic đằng sau các thuật toán cơ bản, các thuật toán cấp cao sẽ có vẻ ít phức tạp hơn. Bằng cách này bạn có thể tận dụng tối đa kiến ​​thức của mình.

Tìm hiểu sâu hơn về từng chủ đề chính

Đây là một nguồn tài nguyên có giá trị với rất nhiều thông tin. Ở đó bạn sẽ tìm thấy 10 thuật toán và cấu trúc dữ liệu hàng đầu cho từng chủ đề. Sau 250 vấn đề từ SPOJ, bạn sẽ biết được rất nhiều điều từ danh sách này. Nhưng bạn cũng sẽ vấp phải nhiều điều bạn chưa từng nghe đến trước đây. Vì vậy hãy bắt đầu nghiên cứu các chủ đề này theo thứ tự tăng dần.

Nếu bạn không củng cố kiến ​​thức sau khi học một điều gì đó mới, bạn sẽ nhanh chóng quên đi mọi thứ.
Tôi khuyên bạn sau khi học một thuật toán mới, hãy áp dụng nó vào thực tế. Thực hiện nó thông qua 2-3 nhiệm vụ. Tìm thẻ thuật toán trong SPOJ. Ở đó bạn sẽ tìm thấy những vấn đề cần thuật toán này để giải quyết. Hãy giải quyết những vấn đề này trước tiên.

Nắm vững lập trình động vì nó sẽ đưa bạn đến chiến thắng
Theo kinh nghiệm của tôi, cuộc thi nào cũng có ít nhất một vấn đề lập trình năng động. Nhiều người đau đầu khi nghe đến cụm từ “lập trình động” vì không hiểu gì cả.

Và điều này là tốt. Bởi vì nếu bạn hiểu được lập trình động thì bạn sẽ thắng.

Tôi thích lập trình động, đó là chủ đề yêu thích của tôi. Bí quyết của quy hoạch động là đưa ra những lựa chọn tối ưu toàn cục chứ không chỉ những lựa chọn cục bộ. Bạn phải chia vấn đề thành các vấn đề phụ đơn giản hơn. Giải quyết mỗi vấn đề con này chỉ một lần. Sau đó tạo ra một giải pháp kết hợp các vấn đề con đã được giải quyết. Thuật toán tham lam - trái ngược với lập trình động. Nó đòi hỏi phải đưa ra các lựa chọn tối ưu cục bộ ở mỗi bước. Và một lựa chọn tối ưu cục bộ có thể dẫn đến một giải pháp tổng thể tồi.

Trong khi học các khái niệm mới, hãy kiểm tra Hướng dẫn TopCoder. Chúng rất chi tiết và dễ hiểu. Nhờ họ mà tôi đã có thể hiểu được cây chỉ số nhị phân.

Làm việc chăm chỉ

Bạn đã bao giờ nghe nói về những vận động viên vô địch Thế vận hội mà không cần nhiều năm luyện tập chưa? Tôi không.

Hàng năm, việc chuẩn bị cho Olympic Máy tính bắt đầu vào tháng 9 và kết thúc vào tháng 4.

Mỗi ngày trong 8 tháng này tôi đã luyện tập 5 giờ.

Và vâng, tôi đã dành 5 giờ này chỉ để giải các bài toán thuật toán. Tôi nhớ những ngày tôi tập luyện 8, thậm chí 10 tiếng. Tại sao? Bởi vì tôi thích nó. Mỗi ngày đi học về tôi vào thẳng phòng ngủ, ngồi trước máy tính và bắt đầu phân tích một bài toán mới. Hoặc tôi đang học một thuật toán mới mà tôi cần biết để giải quyết vấn đề này.

Nếu bạn muốn giành chiến thắng, bạn phải làm như vậy. Chọn một vấn đề và bám sát nó. Hãy suy nghĩ về nó khi đi bộ đến siêu thị hoặc khi lái xe.

Làm thế nào tôi giành được 3 trong số 4 huy chương vàng tại Olympic Tin học

Bạn có biết rằng khi ngủ, não của bạn sẽ phân mảnh những thông tin được thu thập ngày hôm đó? Có vẻ như anh ấy đang xếp sách theo thứ tự bảng chữ cái trên giá sách. Về cơ bản, bộ não của bạn nghĩ về những vấn đề khác nhau mà bạn đang gặp phải.

Điều này có thể được sử dụng một cách khéo léo. Trước khi đi ngủ, hãy đọc một bài toán khó và ghi nhớ những gì cần làm để giải nó. Ở giai đoạn này, bạn không cần phải tự tìm kiếm giải pháp. Đi ngủ. Bộ não của bạn sẽ bắt đầu xử lý vấn đề này. Khi thức dậy, bạn sẽ ngạc nhiên nhận ra rằng mình đã tìm ra giải pháp trong khi đang ngủ.

Hãy tự mình thử nó. Nó giống như phép thuật.

Tôi đã tạo một blog video

Làm thế nào tôi giành được 3 trong số 4 huy chương vàng tại Olympic Tin học

Đoạn văn ngắn này không liên quan đến chương trình thể thao. Nếu bạn đang ở độ tuổi hai mươi và thắc mắc tôi nhìn thế giới như thế nào, bạn có thể muốn xem thử blog video của tôi trên Youtube. Tôi nói về thế giới, cuộc sống và khoa học máy tính trong đó.

Làm việc thông minh

Đây là bí quyết của thành công. Bạn cần mục tiêu.

Chúng tôi là con người và chúng tôi thích điều đó trì hoãn. Chúng ta luôn muốn trì hoãn những việc cần làm ngay bây giờ. Xem Netflix luôn thú vị hơn việc giải quyết các vấn đề về lập trình động. Bạn biết điều này và bạn cần phải sửa nó.

Làm thế nào để đánh bại sự trì hoãn

Đặt mục tiêu cho mình. Bạn sẽ luôn tìm thấy những vấn đề thú vị mà từ đó bạn có thể học được điều gì đó mới (xem các tài nguyên tôi đã đề cập ở trên). Nhưng những vấn đề này cần được giải quyết chứ không chỉ đọc suông.

Đây là cách tôi vượt qua sự trì hoãn. Tôi bắt đầu viết lịch giấy và điền vào mỗi ngày những vấn đề tôi muốn giải quyết. Tôi luôn điền các vấn đề trước hai ngày. Thế là tôi đã biết cách quản lý thời gian của mình trong những ngày tiếp theo.

Làm thế nào tôi giành được 3 trong số 4 huy chương vàng tại Olympic Tin học

Vì thế tôi luôn có động lực. Tôi cần giải quyết một số vấn đề và tìm những vấn đề mới để điền vào lịch những ngày tiếp theo. Việc gạch bỏ các vấn đề đã được giải quyết mang lại cảm giác tuyệt vời. Tôi biết bạn cũng thích nó.

Nhận lịch giấy của riêng bạn. Đừng tạo một danh sách việc cần làm khác trên điện thoại mà ngày mai bạn sẽ quên.

Cách gỡ lỗi hiệu quả

Bạn có muốn trở thành một chuyên gia? Nếu có, thì bạn cần phải “gỡ lỗi nó trong đầu mình”.
Đây là kỹ thuật gỡ lỗi hiệu quả nhất mà tôi biết vì nó hoàn toàn không yêu cầu trình gỡ lỗi. Bộ não của bạn kiểm tra nhiều nhánh mã cùng một lúc và cung cấp cho bạn cái nhìn tổng quan về mã rộng hơn nhiều so với trình gỡ lỗi cổ điển.

Bạn có thể so sánh mình với một đại kiện tướng chơi cờ và nghĩ trước 3 nước đi.

Tôi chỉ sử dụng kỹ thuật này làm tuyến phòng thủ ban đầu của mình. Sau đó tôi sử dụng một trình gỡ lỗi thực sự.

Để học cách gỡ lỗi trong đầu, bạn cần phải thực hành. Khi bạn xác thực giải pháp cho một vấn đề và nhận được "câu trả lời sai", đừng đi thẳng tới nút gỡ lỗi. Đọc lại mã và nghĩ: “Điều gì đang xảy ra ở dòng này?”, “Chữ “if” ở đây ảnh hưởng đến chương trình như thế nào?”, “Khi chúng ta thoát khỏi vòng lặp, giá trị của vòng lặp là bao nhiêu?”

Bằng cách này bạn nghĩ cho chính mình. Theo thời gian, bạn sẽ học cách viết mã và gỡ lỗi nó một cách nhanh chóng.

Thông tin về các Tác giả

Làm thế nào tôi giành được 3 trong số 4 huy chương vàng tại Olympic Tin học
Andrei Margeloiu là một lập trình viên đam mê, quan tâm đến tinh thần kinh doanh, khởi nghiệp và hoạt động ngoài trời. Bạn có thể liên hệ với anh ấy Trên Linkedin.

Bản dịch: Diana Sheremyova

Nguồn: www.habr.com

Thêm một lời nhận xét