Do mục đích sư phạm nên các link download trong bài viết được sắp xếp tuần tự, từng link một.. Về phần thi thuật toán Đây là phần thi hay vì nó tổng hợp những kiến thức bạn học về thuật
Trang 1Giải đề thi Olympic Tin học 2010 và 2011 Một số kỹ năng cần thiết.
Nội dung thi:
- Chuyên: Thuật toán
- Không chuyên: Excel + Thuật toán
- Cao đẳng (Thường có 1 bài chung giữa đôi một của ba nhóm này)
(Do mục đích sư phạm nên các link download trong bài viết được sắp xếp tuần tự, từng link một Đây là ý đồ của người viết Còn không, bạn có thể vào thư mục để download luôn một thể, link download ở cuối bài)
1 Về phần thi Excel
Đây là phần thi hay cho khối Cao đẳng và Không chuyên Nguyên tắc để làm tốt phần thi này là:
- Xác định phần thi này là khó Nguyên nhân khó là vì thông thường khi ta làm bài thi Excel ở Trường thì các Thầy Cô dường như đã giúp chúng ta định hướng được từng bước đi cụ thể như thế nào trong đề thi rồi Còn đối với Olympic hình như là không có điều đó Vì vậy, thí sinh phải
tự xác định từng bước vấn đề của mình là gì Nắm được vấn đề then chốt sẽ hóa giải được toàn bộ phần thi này
- Khi đọc đề phải đọc thật kỹ để phân tích mình sẽ cần phải thực hiện những bước trung gian nào Tránh hiện tượng: lạc giữa một rừng công thức của Excel, chẳng biết đi đâu và về đâu
- Và đôi khi cần một chút thông minh (chỉ một chút thôi) Có thể rèn việc này bằng cách hiểu thật ngọn ngành, chi tiết từng hàm thông dụng của Excel một
Ví dụ: Bài 1 về Excel trong Đề thi Khối Cao đẳng
2010: http://www.mediafire.com/download.php?79o0vmmkep6ctj5
Lời giải: http://www.mediafire.com/download.php?p11q3a86tfu025p
2 Về phần thi thuật toán
Đây là phần thi hay vì nó tổng hợp những kiến thức bạn học về thuật toán, cấu trúc dữ liệu, và
cả kinh nghiệm làm bài nữa
Nguyên tắc để làm tốt phần thi này là:
- Thứ nhất: Một triết lý bất di bất dịch tồn tại từ lâu là:
Cấu trúc dữ liệu + Giải thuật = Chương trình
đây vẫn là nguyên lý thường trực
- Thứ hai: Cần đọc kỹ đề, chỉ khi hiểu đề ta mới có thể phân tích bằng suy nghĩ tự nhiên xem cần cài đặt cấu trúc dữ liệu nào thì phù hợp Đồng thời chọn một thuật toán để có thể ăn điểm qua từng test
Việc đọc kỹ đề cũng giúp bạn không bị choáng ngợp khi mới đọc đề Nếu bị choáng gần như
ta đã đánh mất một nửa thành công Vì vậy, việc chuẩn bị tư tưởng thoải mái, tâm thế vững
Trang 2vàng khi thi là cần thiết.
Trong thi Olympic thì việc làm đúng, cài đặt đúng không đồng nghĩa với việc ăn điểm mỗi test Nguyên nhân là mỗi test thường bị giới hạn thời gian chạy Nếu quá thời gian chạy sẽ không được tính điểm cho test đó
Lời khuyên:
+ Máy tính làm việc với kiểu nguyên sẽ nhanh hơn
+ Máy tính truy cập vào mảng cũng nhanh hơn
+ Nhập/xuất file nên cẩn thận Nhưng không nên cẩn thận quá vì việc nhập/xuất làm chậm việc chạy chương trình Tất nhiên, ta vẫn phải nhập/xuất file ít nhất 1 lần để đọc và ghi dữ liệu
- Thứ ba: Nên học kỹ một số thuật toán thông dụng: Sắp xếp nhanh, Sắp xếp nhanh dựa trên mảng chỉ dẫn [Tìm hiểu tại đây], Tìm kiếm nhị phân, Quy hoạch động, Thuật toán quay lui, Các thuật toán về đồ thị: Thuật toán tìm đường đi ngắn nhất gồm Dijkstra và Floyd, Thuật toán loang theo chiều rộng, Thuật toán loang theo chiều sâu và một số cấu trúc dữ liệu, thuật toán khác không được học trong Đại học Học được càng nhiều thuật toán, cấu trúc dữ liệu bạn càng có cơ hội chọn ra một thuật toán phù hợp để giải bài toán Và thực hành nhiều là cách duy nhất để nhớ tất cả các thuật toán, cấu trúc dữ liệu này
- Thứ tư: Nên vẽ, viết nháp ra giấy (bước này gọi là bước trực quan hóa) vì con người làm việc với tư duy trực quan nhanh hơn với tư duy trừu tượng Ta viết ra giấy xem giải quyết như thế nào, cần làm những thao tác gì rồi tổng quát hóa (hay còn gọi là trừu tượng hóa) nên thành chương trình
- Thứ năm: Tìm hiểu đặc tính của ngôn ngữ lập trình mình sử dụng Ví dụ như C và C++, tư tưởng của chúng hầu hết dựa trên khái niệm con trỏ Con trỏ của C/C++ rất linh hoạt, sử dụng được nhuần nhuyễn con trỏ sẽ giúp sức cho bạn rất nhiều
- Thứ sáu - Cuối cùng: ĐỌC NHIỀU và LÀM THẬT NHIỀU Đồng thời biết cách so sánh với
những bài toán đã biết sẽ cho các bạn kinh nghiệm làm bài Đây cũng là một bước quan
trọng trong tiến trình giải quyết bài toán
Ví dụ 1: Bài 2 - Khối Cao đẳng 2010: Rèn luyện tư duy cho người lập trình Với bài này, thao tác
thứ 4 (Trực quan hóa) rất quan trọng
Lời giải: http://www.mediafire.com/download.php?gvxixk93481gb1j
Ví dụ 2: Bài 3 - Đề thi Cao đẳng 2010 Rèn luyện suy nghĩ tự nhiên Tức là: "nghĩ gì, làm nấy" Bạn hãy nghĩ xem nếu gặp bài toán này thì bạn sẽ thực hiện bằng tay từng bước như
thế nào
Riêng nội dung đề bài này đã nhấn mạnh rất rõ tầm quan trọng của cấu trúc dữ liệu và giải thuật trong việc xây dựng chương trình tính toán
Trong trường hợp bài toán yêu cầu thêm: Đưa ra thứ tự giải các bài toán (trong thực tế thì bình thường vẫn phải đưa ra thứ tự này) thì cần phải giữ lại chỉ số của các bài toán nên thuật toán phải là:
Thuật toán: Sắp xếp nhanh dựa trên mảng chỉ dẫn.
Lời giải: http://www.mediafire.com/?99nfggq669b1781
Một lời giải khác dùng thuật toán sắp xếp bình thường và chậm hơn (nhưng dễ nhớ
hơn): http://www.mediafire.com/?uhvn5vc5dmb02j0
Trang 3Như vậy, ta thấy tính hai mặt của thuật toán: Thuật toán chạy càng nhanh thì càng phức
tạp và ngược lại, thuật toán càng đơn giản, càng dễ cài đặt thì chạy chậm hơn.
Ví dụ 3: Bài 4 - Khối Cao đẳng 2010 Bài này giúp ta biết cách so sánh với cấu trúc dữ liệu
ngăn xếp đã biết
Thuật toán: Gần giống với ngăn xếp nhé.
Lời giải: http://www.mediafire.com/?oxtnqxpn4xv842w
Đề thi khối không chuyên - 2010: http://www.mediafire.com/?vu6l18dzsu9qqu1
Ví dụ 4: Bài 2 - Khối không chuyên 2010 - Máy tính làm việc với số nguyên sẽ nhanh hơn Lời giải: Bạn hãy sửa lại Code của bài này Bài này thực hiện chậm nhưng là Code này vẫn là
chuẩn mực cho lớp các bài toán khác:http://www.mediafire.com/download.php?
3fu640d26cy3ej0
Ví dụ 5: Bài 4 - Khối không chuyên 2010
Thuật toán: Vẽ ra giấy sẽ hình dung ra.
Lời giải: http://www.mediafire.com/download.php?ke3k6abi20cqv1d
Đề thi khối chuyên Tin 2010: http://www.mediafire.com/download.php?f4ac6z024wcecsc
Ví dụ 6: Bài 2 - Khối chuyên Tin 2010 - Máy tính làm việc với mảng sẽ nhanh hơn.
Lời giải: Mình cài đặt khác với ý tưởng đã nêu ở trên Nhưng Code bài này vẫn rất chuẩn mực
cho lớp các bài toán tổng quát khác:http://www.mediafire.com/download.php?
pm615d0pz90bhz4
Ví dụ 7: Bài 3 - Khối chuyên Tin 2010
Thuật toán: Sử dụng thuật toán Floyd trên đồ thị.
Lời giải: http://www.mediafire.com/download.php?ttmxithgtj8h0t5
Ví dụ 8: Bài 4 - Khối chuyên Tin 2010
Thuật toán: Đây là bài toán sử dụng thuật toán tìm kiếm trên xâu Ở đây, ta sử dụng cấu trúc
dữ liệu: Suffix Array hoặc cấu trúc Trie Mình chưa code bài này nên chỉ đề xuất vậy
Qua đây, ta cũng nhận thấy tầm quan trọng của cấu trúc dữ liệu: Nếu ta sử dụng các cấu trúc dữ liệu trước đây thì hoặc là không giải được, hoặc là giải được nhưng rất khó khăn khi cài đặt (Ví dụ: cài đặt bảng băm cho bài này cũng được, nhưng không ăn hết được các test)
Xét đến đề thi năm 2011
Trang 4Đề Khối Cao đẳng năm 2011: http://www.mediafire.com/?8oy9696uobbn62y
Ví dụ 9: Bài 3 - Khối Cao đẳng 2011: Không khác gì Bài 3 - Đề thi Cao đẳng 2010 (Tất nhiên có
thay đổi chút xíu, nhưng không đáng kể)
Kết luận: Ta thấy được sự cần thiết khi so sánh để thấy sự tương đồng giữa bài toán cần giải
quyết với những bài toán đã biết trước đó
Đề Khối không chuyên năm 2011: http://www.mediafire.com/?3cdc4cxuu2cdgg2
Ví dụ 10: Bài 4 - Khối không chuyên 2011
Ở đây, mình in thêm cả những số thuộc vào tập số này
Thuật toán: Quay lui (Duyệt toàn bộ).
Lời giải: http://www.mediafire.com/?6wmaucd5nvqm61b
- Các file zip là file mình code năm 2010 Các bạn chạy file dev
- Các file c là code năm 2012
Một số bài giữa các khối trùng nhau, các bạn xem ở trong đề sẽ thấy
Toàn bộ thư mục: http://www.mediafire.com/?dzzyt32hydfl6
Xem thêm: Đạo lập trình - http://fit.hnue.edu.vn/forum/showthr ADp-tr%C3%ACnh
Sơn,