You are on page 1of 8

MỤC LỤC

I. PHẦN ĐẶT VẤN ĐỀ:..............................................................................................2


I.1/ Lý do chọn đề tài..................................................................................................2
I.2/ Mục tiêu nghiên cứu.............................................................................................2
I.3/ Nhiệm vụ nghiên cứu ...........................................................................................2
I.4/ Đối tượng nghiên cứu...........................................................................................2
I.5/ Các phương pháp nghiên cứu ...............................................................................2
II/. PHẦN NỘI DUNG: ...............................................................................................3
II.1/ Lịch sử của vấn đề nghiên cứu ............................................................................3
II.2/ Cơ sở lý luận của đề tài.......................................................................................3
II.3/ Thực trạng của vấn đề nghiên cứu.......................................................................3
II.4/ Nội dung nghiên cứu và kết quả nghiên cứu........................................................3
A/ NỘI DUNG NGHIÊN CỨU ..................................................................................3
1/. Bài 1: Đếm bò ....................................................................................................4
2/. Bài 2: Dự tiệc .....................................................................................................5
3/. Bài 3: Chuỗi kiểm tra .........................................................................................6
4/. Bài 4: Tuyển nhân viên.......................................................................................6
5/. KẾT LUẬN........................................................................................................7
B/ KẾT QUẢ NGHIÊN CỨU ....................................................................................8
III. PHẦN KẾT LUẬN................................................................................................8
III.1/ Kết luận .............................................................................................................8
III.2/Tài liệu tham khảo ..............................................................................................8

1
I. PHẦN ĐẶT VẤN ĐỀ:

I.1/ Lý do chọn đề tài

Để hệ thống lại các chuyên đề bồi dưỡng HSG chuyên Tin học mà tôi đã dạy
trong nhiều năm qua, đồng thời qua quá trình nghiên cứu, giảng dạy, tham khảo ý kiến
đồng nghiệp, tôi thấy rằng một số bài toán tin học có liên quan đến việc đếm. Chính vì
vậy tôi chọn viết đề tài về chuyên đề “ĐẾM ĐƠN GIẢN BẰNG PHƯƠNG PHÁP LÙA
BÒ”.

I.2/ Mục tiêu nghiên cứu

Đếm là công việc quan trọng và đơn giản mà chúng ta làm thường ngày, điều
đó thì không cần phải bàn đến làm gì? Điều đáng nói ở đây là công việc có vẽ nhàm
chán đó lại chứa bao điều thú vị, nhất là khi gặp những bài toán yêu cầu ta phải đếm.
Đếm ở đây không phải đơn thuần là đếm 1, 2, 3, ... mà còn cần ở người đếm một sự
khéo léo và có thể có một chút kỹ thuật. Bên cạnh đó giúp các em học sinh có kiến thức
tốt, tư duy tốt về lập trình. Các phương pháp đếm đơn giản là một trong những vấn đề
mà bất cứ người lập trình tin học đều cần phải nắm vững.

I.3/ Nhiệm vụ nghiên cứu

Trước hết là thực hiện đổi mới phương pháp giảng dạy Tin học làm cho học
sinh tìm ra những kết quả sáng tạo, lời giải hay trên một số “dạng bài toán tin có liên
quan đến việc đếm”; giúp bản thân nắm vững hơn nữa về tư duy thuật toán, khả năng
lập trình, đồng thời trao đổi và học tập kinh nghiệm ở Quý Thầy Cô ở Tổ Tin học.

I.4/ Đối tượng nghiên cứu

Trong nghiên cứu này, các học sinh được chọn là các em học lớp chuyên Tin
học khối 10, 11, 12 và một số giáo viên đứng lớp dạy tin học ở trường THPT Chuyên
Tiền Giang.

I.5/ Các phương pháp nghiên cứu

* Phương pháp suy luận, tổng hợp: kết hợp từ nhiều nguồn tài liệu tham khảo
của các tác giả và tra cứu trên mạng internet với các đề thi Học sinh Giỏi rút ra những
kinh nghiệm, hệ thống lại kiến thức, mở ra các hướng mới.

* Phương pháp trò chuyện – phỏng vấn: trao đổi tâm tình với nhiều học sinh
giỏi để nắm tình hình trong việc giải các bài toán tin về lý thuyết đồ thị.

2
* Phương pháp khảo sát: bản thân được tham gia giảng dạy các lớp, đội tuyển
HSG, các kỳ tập huấn, ra đề; tham khảo đồng nghiệp, quý Thầy Cô đã giảng dạy đội
tuyển nhiều năm nên có nắm được tình hình sử dụng các phương pháp làm bài của các
em học sinh.

* Phương pháp phân tích lý luận: phân tích giúp học sinh nắm thật rõ bản chất
vấn đề, lựa chọn được phương pháp giải cho phù hợp.

II/. PHẦN NỘI DUNG:


II.1/ Lịch sử của vấn đề nghiên cứu

Trong những năm liên tiếp dạy bồi dưỡng HSG môn Tin Học lớp 10, 11, 12 và
đội tuyển thi HSG cấp Tỉnh, cấp Quốc Gia, đội tuyển dự thi Olimpic 30/4 dành cho các
trường THPT, cũng như tham khảo ý kiến các đồng nghiệp chuyên dạy bồi dưỡng đội
tuyển ở các Tỉnh bạn, ở các trường THPT Chuyên, tôi rút ra một điều là “CÔNG VIỆC
ĐẾM RẤT QUAN TRỌNG TRONG DẠY LẬP TRÌNH”. Được sự động viên khuyến
khích của quý Thầy Cô trong tổ, tôi mạnh dạng chọn viết đề tài “ĐẾM ĐƠN GIẢN
BẰNG PHƯƠNG PHÁP LÙA BÒ”.

II.2/ Cơ sở lý luận của đề tài

Kết hợp bài giảng và các tài liệu tham khảo để phân tích, tổng hợp, hệ thống.

II.3/ Thực trạng của vấn đề nghiên cứu

Đa số học sinh chuyên tin rất ngại, sợ khi giải các bài toán tin có liên quan đến
việc đếm; rất lúng túng trong quá trình phân tích, tổ chức dữ liệu, tìm ra thuật toán hiệu
quả để tìm ra bản chất và vận dụng kiến thức một cách thích hợp.

II.4/ Nội dung nghiên cứu và kết quả nghiên cứu

A/ NỘI DUNG NGHIÊN CỨU


Trong kỹ thuật lập trình, các bài toán có liên quan đến đếm các đối tượng rất
gần gũi và dễ giải đối với chúng ta vì tính dễ xây dựng thuật toán cho nó. Tuy nhiên,
những bài toán “đếm” thường yêu cầu với dữ liệu rất lớn. Nếu không biết tổ chức dữ
liệu và thuật toán hiệu quả thì khó có thể đưa ra lời giải tốt. Một trong những cách tiếp
cận để xử lý hiện tượng này là sử dụng thuật toán “lùa bò vào chuồng”.

Tư tưởng của thuật toán được xây dựng dựa trên suy nghĩ thực tế là để đếm số
lượng bò trên một vùng xác định thì người ta phải tìm cách lùa chúng vào các chuồng
3
(để chúng khỏi chạy rông) cho dễ đếm. Đương nhiên là những con bò cùng loại phải
được lùa vào cùng một chuồng để dễ phân biệt hoặc lùa mỗi con vào một chuồng thì
càng tốt. Tương tự như vậy, muốn giải bài toán đếm các đối tượng thì ta dùng một cấu
trúc dữ liệu hợp lý (thường là mảng tĩnh hay mảng động) với ý nghĩa giống như các
“chuồng” để lưu các đối tượng, mỗi phần tử của mảng tương ứng với một chuồng. Trên
cơ sở đó ta dễ dàng thực hiện được mục đích của mình là thực hiện thao tác đếm.

1/. Bài 1: Đếm bò Tên chương trình: Dembo.pas


Bài toán đặt ra là giả sử trên cánh đồng rộng thả rất nhiều bò (N con), mỗi con
bò đeo một thẻ có số hiệu nguyên dương (là số tháng tuổi của nó). Tất nhiên, hai con bò
cùng tháng tuổi thì đeo thẻ có số hiệu như nhau. Làm thế nào để đếm được loại bò nào
có nhiều nhất?

Bài toán này có thể phát biểu lại như sau:


 Nhập từ bàn phím số nguyên dương N (0 < N  200) và các phần tử của mảng
một chiều A(N) có giá trị nguyên dương (0 < A[i]  100).
 Giá trị nào xuất hiện nhiều nhất trong A và xuất hiện bao nhiêu lần?
 Ví dụ: A(12) = {2,3,2,4,5,6,2,6,7,1,6,2} thì A(12) có số phần tử giá trị bằng 2
là nhiều nhất. Số lượng phần tử này là 4.

Thuật toán “Lùa bò vào chuồng”


Để giải bài toán này người ta dùng thuật toán “lùa bò vào chuồng” gồm 3 bước:
 Bước 1: Đóng dãy chuồng bò và đánh số các chuồng bằng các số tự nhiên liên tiếp
từ 1 đến max (max là số tháng tuổi của con bò già nhất), ban đầu mọi
chuồng đều chưa có bò ở trong.
 Bước 2: Lùa bò vào chuồng có số hiệu bằng số thẻ của nó.
 Bước 3: Duyệt dãy chuồng bò tìm chuồng có nhiều bò nhất.

Áp dụng thuật toán vào bài tập:


Bước 1: Giả sử con bò thứ i có tháng tuổi là a[i] (1  i  n). Coi mảng b(n) như
dãy chuồng bò, b[x] là số lượng bò (có x tháng tuổi) trong chuồng có số
hiệu x, ban đầu các phần tử của mảng b(n) đều bằng 0.
Bước 2: Con bò có tháng tuổi a[i] phải vào chuồng bò có số hiệu a[i]. Thêm 1 con
bò vào chuồng a[i] tương ứng với lệnh inc(b[a[i]])
Bước 3: Duyệt mảng b, tìm chỉ số phần tử lớn nhất.

4
Chương trình tham khảo:
Uses crt;
Const max = 200;
Var N: integer;
A: array[1..max] of byte;
B: array[1..max] of byte;
maxsl, i, li:integer;
BEGIN
Clrscr;
Write('Nhap so nguyen duong N = ');Readln(N);
For i := 1 to N do
Begin
Write('A[',i:2,'] = ');Readln(A[i]);
End;
Fillchar(B,sizeof(B),0); {Tao day chuong bo rong chua co bo}
For i := 1 to N do
inc(B[A[i]]); {Tang them 1 con bo vao chuong co so hieu A[i]}
maxsl := 0;
For i := 1 to max do {Duyet day chuong tim chuong co nhieu bo nhat}
if B[i] > maxsl then
Begin
maxsl := B[i];
li := i;
End;
Write('So ',li,' co so luong lon nhat la ',B[li]);
Readln;
END.

* Có thể dùng thuật toán “Lùa bò vào chuồng” để giải quyết bài toán sau:

2/. Bài 2: Dự tiệc Tên chương trình: Dutiec.pas


Ông An đến dự một buổi tiệc. Buổi tiệc đã có N người (0 < N  500.000). Mỗi
người dự tiệc đều được cài lên áo một bông hoa trên đó có ghi một con số nguyên
dương X bất kì ( X  106 ) cho biết người khách đó sẽ dự tiệc tại phòng có chỉ số X. Hầu
hết các phòng đều có số lượng khách là số chẵn, duy nhất chỉ có một phòng có số lượng
khách là số lẻ. Để đảm bảo đủ cặp cho việc khiêu vũ nên ban tổ chức cần tìm ra số hiệu
của phòng khách có số lượng khách là số lẻ để ghi số cho ông An.
Yêu cầu: Cho trước một danh sách khách dự tiệc cùng với các số trên áo của họ,
hãy giúp ban tổ chức tìm ra số hiệu của phòng khách có số lượng khách là số lẻ.
Dữ liệu vào: Cho trong file văn bản DUTIEC.INP, gồm:
 Dòng đầu tiên ghi một số N cho biết số khách của buổi tiệc khi ông An đến.

5
 Trong N dòng tiếp theo, mỗi dòng ghi một số nguyên dương cho biết con số ghi
trên áo của người khách thứ i.
Dữ liệu ra: Ghi ra file văn bản DUTIEC.OUT gồm một số nguyên dương duy
nhất. Đó là số hiệu của phòng có số lượng khách là số lẻ.
Ví dụ:
DUTIEC.INP DUTIEC.OUT
5 2 3
1 3
2 1

Hướng dẫn: Trong bài toán này, dãy phòng chỉ cần đóng số hiệu từ 1 đến số
hiệu Xmax (Xmax = 106) và mỗi phòng chỉ chứa 1 trong 2 trạng thái chẳn hoặc lẻ (true,
false), tìm thấy thêm một người khách của phòng i thì đổi trạng thái phòng i (toán tử
not).

3/. Bài 3: Chuỗi kiểm tra Tên chương trình: ChuoiKT.pas


Cho một file văn bản có n dòng (3  n  30000), mỗi dòng là một chuỗi S có
tối đa 255 kí tự, các kí tự S[i]  [‘a’..’z’] với 1  i  length(S). Trong đó, chỉ có một
chuỗi S có số lần xuất hiện là một số lẻ, các chuỗi khác có số lần xuất hiện là số chẳn.
Yêu cầu: Tìm chuỗi S (có số lần xuất hiện lẻ) đó.
Dữ liệu vào: từ file ‘CHUOIKT.inp’
 Dòng đầu là một số nguyên n.
 Dòng thứ i + 1 trong n dòng sau, mỗi dòng là một chuỗi kí tự (1  i  n).
Kết quả: ghi vào file ‘CHUOIKT.out’ chứa chuỗi kí tự tìm được.
Ví dụ:
CHUOIKT.INP CHUOIKT.OUT
7 lop10tin
abcdef
bbcc
lop10tin
abcdef
bbcc
abcdef
abcdef
4/. Bài 4: Tuyển nhân viên Tên chương trình: Recruit.pas

6
Công ty phần mềm máy tính A có số lượng nhân viên rất lớn. Để tiện việc
quản lý, công ty đã cấp cho mỗi nhân viên một mã số, mã số của mỗi nhân viên là một
số nguyên dương, hai nhân viên bất kỳ thì có mã số khác nhau. Tuy nhiên, sau một thời
gian thì một số nhân viên đã nghỉ hưu hoặc chuyển công tác, nên công ty phải tiến hành
tuyển thêm k nhân viên mới. Các nhân viên mới này sau khi được tuyển vào cũng sẽ
được cấp mã số, mỗi nhân viên một mã số và mã số này cũng phải là một số nguyên
dương.
Yêu cầu: Với n nhân viên hiện có (còn lại) của công ty tương ứng với các mã số
a1, a2, …, an. Hãy tìm k mã số nhỏ nhất để cấp cho k nhân viên mới tuyển vào sao cho
vẫn thỏa mãn hai nhân viên bất kỳ (cả nhân viên cũ và nhân viên mới) có mã số khác
nhau.
Dữ liệu vào từ file ‘Recruit.inp’ có nội dung như sau:
 Dòng đầu chứ hai số nguyên dương lần lượt là n và k (k  n  106).
 n dòng tiếp theo, dòng thứ i là số nguyên dương ai (i = 1, 2, …, n; ai  2*109).
Kết quả ghi vào file ‘Recruit.out’ k mã số theo thứ tự từ nhỏ đến lớn (mỗi mã số
trên một dòng).
Ví dụ:
RECRUIT.INP RECRUIT.OU
T
53 6 2
3 9 4
1 8 5
Hướng dẫn:
 Cách 1: Thuật toán O(NlogN) dùng quicksort đủ chấp nhận.
 Cách 2: Dùng Distribution sort O(n + K). Trong bài toán này, dãy chuồng chỉ
cần đóng số hiệu từ 1 đến số hiệu 2*nmax (nmax = 10 6 ) và mỗi chuồng chỉ chứa
1 trong 2 trạng thái đã có hoặc chưa có (true, false). Bằng cách chạy từ 1 đến n,
nếu số nào  n+k thì đánh dấu chuồng đó bằng true. Sau đó chạy từ 1 đến n+k,
nếu số nào bằng false thì in số đó ra file (chỉ in đủ k số).
5/. KẾT LUẬN
Nếu biết vận dụng tốt những suy luận sẽ làm cho những bài toán tin có những
giải thuật đơn giản và đạt được kết quả tốt hơn. Đặc biệt là trong công việc đếm, đòi hỏi
phải lựa chọn cách giải quyết phù hợp cho các bài toán có đầu vào lớn.

7
B/ KẾT QUẢ NGHIÊN CỨU
Qua quá trình nghiên cứu và vận dụng đề tài chuyên đề “ĐẾM ĐƠN GIẢN
BẰNG PHƯƠNG PHÁP LÙA BÒ”, tôi nhận thấy vấn đề này giúp ích rất nhiều cho
học sinh chuyên tin học trong việc học, giúp các em không còn “ngán ngại” chuyên đề
này nữa, các em đã hiểu và vận dụng khá tốt những phần liên quan đến việc đếm ứng
dụng vào tin học; một số em đã bước đầu sáng tạo được những cách giải hay, các giải
mới (tuy là những bài toán còn “đơn giản”). Riêng bản thân tôi sẽ tiếp tục nghiên cứu
sâu hơn nữa về chuyên đề này hy vọng sẽ “làm rõ hơn nữa” để học sinh chuyên tin thích
học và đạt nhiều thành tích hơn nữa.

III. PHẦN KẾT LUẬN


III.1/ Kết luận

Tôi viết đề tài nghiên cứu này nhằm mục đích cùng trao đổi với Quý Thầy Cô
dạy chuyên đề bồi dưỡng học sinh giỏi Tin học về việc “hệ thống” các kiến thức, một
vài kỹ năng, ứng dụng toán học vào lập trình giải quyết các bài toán tin. Vì kiến thức và
thời gian còn nhiều hạn chế nên chắc rằng nghiên cứu còn có thiếu sót, tôi chân thành
đón nhận sự góp ý của Quý Thầy Cô. Xin chân thành cảm ơn.

III.2/Tài liệu tham khảo


1. Hồ Sĩ Đàm, Đỗ Đức Đông, Lê Minh Hoàng, Nguyễn Thanh Hùng, 2009, Tài
liệu giáo khoa chuyên tin, NXB Giáo dục, quyển 1, quyển 2, quyển 3.
2. Lê Minh Hoàng (ebook), Bài giảng chuyên đề.
3. Nguyễn Xuân Huy, 2008, Sáng tạo trong thuật toán và lập trình, NXB Giáo
dục, tập 1, tập 2, tập 3.
4. Các đề thi HSG Olympic 30/4.
5. Các đề thi HSG ĐBSCL.
6. Các đề thi HSG Quốc gia.
7. Các đề thi HSG Quốc tế.

You might also like