Kinh nghiệm làm bài thi HSG

6 2.9K 10
Kinh nghiệm làm bài thi HSG

Đang tải... (xem toàn văn)

Thông tin tài liệu

Kinh nghiệm làm bài thi HSG

Kinh nghiệm làm bài khi đi thiNguyễn Tuấn DũngLà các đối tượng học sinh và sinh viên, hai chữ thi cử xưa nay đã khá gẫn gũi với chúng ta. Bắt đầu năm học, thi. Kết thúc năm học, thi. Vào trường, thi. Ra trường lại cũng thi. Thi để trả bài cho thầy cô, thi để lấy học bổng, thi để đi nước ngoài, thi để lấy chứng chỉ nọ, bằng kia, hay đơn giản, thi vui để đem lại nụ cười trong đời sống tinh thần cho mọi người như Chiếc nón kỳ diệu, ở nhà chủ nhật Thi gắn liền với sự thành đạt công danh một con người, thi có ý nghĩa hết sức quan trọng trong sự nghiệp của mỗi người. Nhưng, thi lại chỉ được thực hiện trong một khoảng thời gian ngắn ngủi hơn rất nhiều so với quá trình học tập và nghiên cứu của chúng ta. Chính vì thế, kinh nghiệm là một nhân tố đóng vai trò không nhỏ, cần được biết đến trước khi bước vào phòng thi. Trải qua các kỳ thi học sinh giỏi PTTH cũng như Olympic sinh viên môn Tin học, có cơ hội tiếp xúc với các sĩ tử, từ chuyên nghiệp trong giới gà trọi (chủ yếu là những học sinh đã từng tham gia thi học sinh giỏi Tin học PTTH) cho đến nghiệp dư như hầu hết các sinh viên mới tham gia trong những hội thi Olympic Tin học sinh viên, tôi nhận thấy hầu hết các bạn học sinh đều có phương pháp và nhiều thủ thuật làm bài trong khi thi nhưng một bộ phận đông đảo tập trung chủ yếu là các sinh viên tham gia trong các Olympic Tin học toàn quốc lại còn quá ít kinh nghiệm. Sự non nớt đó trong trường thi khiến không ít chiến sỹ phải hy sinh một cách oan uổng. Không đâu xa, trong kỳ thi Olympic 2002 năm nay tại Nha Trang, ở bài 2 bảng chuyên tin, đội của tôi có một anh vì quá say mê với cách giải riêng của mình, không nhận ra đó là một bài hết sức đơn giản mà mọi người hầu như đều đi theo một hướng giải chung nên đã để tốn mất tới 3/ 4 thời gian thi mà vẫn cho ra kết quả sai. Thế đấy, sự cay cú và bảo thủ làm cho con người ta trì trệ và lú lẫn như vậy đó. Mong rằng các bạn trong lúc làm bài thi luôn luôn tỉnh táo phân biệt khó dễ mà chia thời gian làm từng bài cho phù hợp.Tất nhiên sai lầm trên chỉ là một trong vô số những sai lầm mà bất cứ ai khi đi thi đều phải có. Nhưng đó là những trục trặc thuộc mặt tâm lý, tính cách của từng người phải tự sửa lấy. Ta không bàn lĩnh vực đó mà chủ yếu xem xét những kinh nghiệm về phương pháp làm bài thi sao cho hiệu quả. Tôi hy vọng nó sẽ giúp bạn đạt thành công tốt hơn, không chỉ khi thi mà ngay cả trong công việc lập trình của mình.Phân tích Khi gặp một bài toán A nào đó, chúng ta thông thường hay chú ý đến chi tiết cụ thể bên trong mà không có cái nhìn tổng quan hơn một chút về nó : bản chất của bài toán là gì? xuất phát từ đâu?. Sau đó rồi mới xem xét có thể đưa về bài toán B khác đã có thuật toán chuẩn không? Hoặc tương tự với một bài toán C có lời giải tốt? Tôi lấy ví dụ bài Đoán số (đề thi học sinh giỏi quốc gia bảng A 1993-1994), tưởng rằng đó là một bài toán chỉ có thể giải bằng số học nhưng thực ra lại chính là bài toán tìm đường đi trên đồ thị trong đó ta chưa biết trước cạnh nối giữa các đỉnh mà phải sau mỗi câu trả lời thì ta mới biết thêm được dần dần. Này nhé, đầu tiên lấy 1 số bất kỳ ra hỏi(thường lấy số có số chữ số khác nhau : 1234). Nhận được câu trả lời => tập S1 các số có thể là số cần tìm (hay tập các đỉnh nối với đỉnh ban đầu). Lấy số bất kỳ trong S1 ra hỏi, nếu đúng luôn thì thôi, nếu không ta lại => tập S2 chứa số cần tìm. Vậy số cần tìm phải nằm trong tập S là giao của S1 và S2. Gán S1 bằng S và quay lại tiếp tục làm như vậy cho đến khi S chỉ còn là tập của 1 phần tử.Tuy nhiên không phải lúc nào cũng tìm được nguồn gốc xuất phát của bài toán và lời giải chuẩn. Chính vì vậy, đặc biệt là trong khi thi, phương pháp luôn luôn cho hiệu quả cao, đảm bảo bài của bạn vẫn có điểm, thậm chí không ít, là duyệt nhánh cận hoặc giải theo tư tưởng tham lam làm tốt đến đâu thì làm hay nôm na người nhỏ làm việc nhỏ, tùy theo sức của mình. Nhưng đối với duyệt vét cạn, để đảm bảo thời gian chạy của chương trình thì tốt nhất bạn vẫn phải có thêm một cận kiểm tra thời gian để dừng chương trình khi cần và in ra kết quả tốt nhất hiện thời đang tìm được.Đó mới chỉ là những phương hướng. Trước khi bắt tay vào làm cụ thể theo một hướng nào đó , bạn hãy cẩn thận xem rằng có thể kiểm soát hết được cách làm của mình hay không? Vì nếu may mắn, bạn sẽ làm suôn sẻ, nhưng rất có thể có những khúc mắc tuy không lớn lại có thể đưa bạn đến ngõ cụt đấy. Tính bó buộc về thời gian trong thi cử không cho phép ta dừng lại lâu trong lúc làm bài. Do đó, đi theo con đường nào mà ta có thể nhìn thấy rõ nhất về nó là điều nên làm.Ngoài ra, đôi khi đi thi, gặp dạng bài phải đưa ra kết quả có hay không có mà bí quá không có cách giải quyết nào, tôi khuyên bạn cứ trả lời có tất hoặc không tất. Nếu bạn nào thích may rủi thì dùng thủ tục random của turbo mà sinh ngẫu nhiên các giá trị 0 hoặc 1. Tất nhiên người ra đề thường cũng không đến nỗi không lường trước được trường hợp này, tuỳ thuộc họ có để cho ta làm theo cách đó hay không thôi !Lập trìnhSau khi đã có cách giải, chúng ta bắt tay vào việc lập trình cụ thể bài toán. Trong giai đoạn này cũng xin được nêu một vài ý kiến để các bạn tham khảo.1. Tốc độ soạn thảo: thời gian làm bài thi có hạn nên không nhất thiết chương trình phải đẹp mắt vì ban giám khảo không chấm cách viết chương trình của bạn mà họ chấm kết quả đưa ra. Tôi khuyên những người đang chuẩn bị cho các cuộc thi nên luyện trước cho mình cách gõ không chữ hoa. Còn những ai có tốc độ gõ chưa nhanh lắm hoặc hay bị gõ sai một số loại từ như kiểu biến chẳng hạn thì tốt nhất cứ định nghĩa sẵn trong mục type , chẳng hạn: Type bb= byte; ii= integer ; ww= word; ll= longint;M1= array[1 maxN]of kiểu biến;M2= array[1 maxM,1 maxN]of kiểu biến; Như vậy sẽ rất tiện sử dụng trong các phần sau của chương trình mà lại gõ nhanh, đồng thời ít bị sai hơn. Ví dụ cần khai báo các biến longint và các mảng 1 chiều , 2 chiều ta chỉ cần: i,j,k:ll; a:M1; b,c:M2; ~2. Dẫn biên dịch: Trước hết là {$R+}, dẫn biên dịch này giúp ta kiểm soát được lỗi Range check error (lỗi giá trị của biến vượt quá kích thước của nó được khai báo) khi chạy chương trình, mặc dù điều đó làm cho chương trình chạy chậm hơn so với {$R-}. Có thể minh hoạ lỗi này như sau: Program vidu1;Uses crt;Var a : array[1 5]of byte; X:byte;BeginFillchar(a,sizeof(a),0);X:=1;Writeln(a[6]);End.Kết quả hiện ra màn hình số 1 (là giá trị của biến x). Thông thường, turbo mặc định sẵn chế độ chạy là {$R-} cho dù bạn không đặt dẫn biên dịch này. Còn nếu đặt dẫn biên dịch {$R+} vào đầu chương trình trên thì khi chạy sẽ xuất hiện dòng màu đỏ Range check error trên màn hình soạn thảo. Chúng ta hình dung nôm na bộ nhớ được chia thành từng ô xếp liền nhau, mảng A sẽ được cung cấp 5 ô liền nhau (mỗi ô 1 byte) tương ứng với A1, A2, ., A5. ô nhớ liền kế tiếp sẽ được dùng cấp phát cho biến x. Chính vì thế, không kiểm tra lỗi tràn kích thước của biến mảng A thì a[6] chính là giá trị của ô nhớ thứ 6 được dùng ghi biến x.Ngoài {$R+}, {$M 65520,0,655360} là một dẫn biên dịch khác cũng khá quan trọng khi chương trình của ta dùng nhiều biến trong các chương trình con (CTC), chẳng hạn các bài cần giải theo cách gọi đệ qui nhiều lần một thủ tục hoặc hàm nào đó, hay một thủ tục tìm kiếm loang theo chiều rộng (Bfs) tuy không đệ quy nhưng cần một mảng ghi nhận hàng đợi (Queue) có kích thước lớn . Như mọi người đã biết, TP dành riêng một phần trong bộ nhớ cho các biến trong chương trình con gọi là stack với kích thước tối đa của stack (Maximum size) 65536 bytes (64Kb)và mặc định (Default size) là 16384 bytes (16Kb). TP cho phép ta có thể thay đổi kích thước này bằng dẫn biên dịch {$M stacksize,heapmin,heapmax}, trong đó stacksize là số nguyên từ 1024 đến 65520 chỉ kích thước của stack, heapmin và heapmax là các số tương ứng chỉ kích thước nhỏ nhất, lớn nhất của vùng nhớ heap (heapmin chạy từ 0 đến 655360, heapmax chạy từ heapmin đến 655360). Thông thường, khi không có dẫn biên dịch, TP sẽ mặc định kích thước tối đa của stack là 16384 bytes với {$M 16384,0,655360}. Vì vậy, khi có đệ qui trong chương trình hoặc ngay cả việc khai báo một mảng lớn vượt quá kích thước 16368 bytes cho phép của stack trong CTC bình thường thôi cũng khiến chương trình không chạy được với lỗi xuất hiện Stack over flow (lỗi tràn stack). Ví dụ:Program vidu2;{$R+} Uses crt;Procedure Stackoverflow;Var A : array[0 60000]of byte;Begin End;Beginstackoverflow;End.Program vidu3;{$R+}{$M 65520,0,655360}Uses crt;Procedure Notstackoverflow;Var A : array[0 60000]of byte;Begin End;Beginnotstackoverflow;End. Tuy nhiên, không thể sử dụng toàn bộ stack cho các biến vì một phần của stack sẽ được dùng để thực hiện CTC. Do đó, trong 2 ví dụ trên không thể khai báo mảng A : array[0 65535]of byte, thậm chí 65520 bytes (các bạn có thể thử điều này).3. Chương trình con: Nói chung không nên dùng quá nhiều tham biến (TB), nhất là kiểu mảng lớn trong các CTC. Nếu có thì dùng tham biến được khai báo sau Var chương trình sẽ chạy nhanh hơn so với việc dùng tham biến trực tiếp không có khai báo Var. Bởi vì, nếu TB dùng dưới dạng Var thì khi CTC được gọi, nó sẽ lấy luôn vùng nhớ đang ghi giá trị TB để sử dụng, chính vì vậy giá trị TB sẽ thay đổi nếu trong CTC thực hiện lệnh làm thay đổi giá trị này. Còn đối với TB không dùng dưới dạng khai báo Var thì khi CTC được gọi, nó sẽ dùng 1 vùng nhớ mới (B) để ghi TB, đồng thời giá trị TB ở vùng nhớ cũ (A) được copy vào (B). Kết thúc CTC, vùng nhớ mới (B) lại được giải phóng. Do đó đối với cách thức thứ hai, CT sẽ chậm hơn một chút. Nhưng trong một số trường hợp, sử dụng TB dưới dạng Var hoặc không Var lại là một điều bắt buộc phải làm đối với chúng ta.Test Sau khi đã hoàn thành xong CT, công việc tiếp theo là kiểm tra kết quả chạy của CT. Trước hết hãy chạy với test nhỏ, đơn giản. Nếu được, chuyển sang những test khác vẫn nhỏ nhưng phức tạp dần lên mà ta phải kiểm soát được sự đúng, sai của kết quả. Đôi khi tạo các test khác nhau cũng không dễ lắm nên ta có thể biến đổi các test bằng cách lấy đối xứng chúng hoặc tạo hình đặc biệt trên test~Rồi tiếp đến cần phải test các trường hợp đặc biệt hay trường hợp biên của bài toán, kiểm tra với các kích thước nhỏ nhất và lớn nhất mà đâù bài đã cho. Để tạo những test lớn, ta dùng thủ tục sinh ngẫu nhiên random của TP, ví dụ đơn giản sinh ma trận trọng số C của một đồ thị vô hướng N đỉnh: Program vidu4;uses crt;const maxN=100;maxtrongso=1000;var C : array[1 maxN,1 maxN]of word;N : byte;procedure maketest;var f:text; i,j:word;beginassign(f,'input.txt'); rewrite(f); n:=80;fillchar(c,sizeof(c),0);for i:=1 to n-1 dofor j:=i+1 to n dobeginc[i,j]:=random(maxtrongso);c[j,i]:=c[i,j];end;for i:=1 to n dobeginfor j:=1 to n do write(f,c[i,j],' ');writeln(f);end;close(f);end;Begin Maketest; End.Đôi khi học vẫn là một chuyện, thi lại là chuyện khác, thậm chí có thể hoàn toàn trái ngược. Đó chỉ là cách làm đối phó trong một khoảng thời gian nhất định chứ không phải quá trình nghiên cứu. Vì vậy, cần có càng nhiều kinh nghiệm và phương pháp trong khi thi càng tốt. Tuy nhiên trên đây chỉ là những kiến thức hết sức sơ đẳng và cơ bản muốn nói với các bạn để trao đổi và học tập thêm. Mong nhận được sự đóng góp ý kiến.Nguyễn Tuấn Dũng . học, thi. Kết thúc năm học, thi. Vào trường, thi. Ra trường lại cũng thi. Thi để trả bài cho thầy cô, thi để lấy học bổng, thi để đi nước ngoài, thi để. Kinh nghiệm làm bài khi đi thiNguyễn Tuấn DũngLà các đối tượng học sinh và sinh viên, hai chữ thi cử xưa nay đã khá gẫn gũi

Ngày đăng: 10/09/2012, 15:26

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan