(SKKN HAY NHẤT) một số giải pháp phân loại và tối ưu cho các bài toán dãy con trong ôn luyện học sinh giỏi môn tin học

21 4 0
(SKKN HAY NHẤT) một số giải pháp phân loại và tối ưu cho các bài toán dãy con trong ôn luyện học sinh giỏi môn tin học

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

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

MỤC LỤC Mở Đầu 1.1 Lí chọn đề tài .1 1.2 Mục đích nghiên cứu 1.3 Đối tượng nghiên cứu .1 1.4 Phương pháp nghiên cứu Nội dung sáng kiến kinh nghiệm 2.1 Cơ sở lí luận sáng kiến kinh nghiệm 2.2 Thực trạng vấn đề trước áp dụng sáng kiến .2 2.3 Các giải pháp áp dụng để giải vấn đề 2.4 Hiệu sáng kiến 17 Kết luận kiến nghị 18 3.1 Kết luận 18 3.2 Kiến nghị 19 Tài liệu tham khảo 20 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Mở Đầu 1.1 Lí chọn đề tài Qua nhiều năm giảng dạy ôn đội tuyển học sinh giỏi môn Tin học nhận thấy đề thi học sinh giỏi tập dãy gần năm có mức độ khó dễ khác Để giải toán dãy phải nhận biết vận dụng linh hoạt thuật toán như: Quay lui vét cạn, chặt nhị phân đặc biệt phương pháp quy hoạch động mảng chiều, hai chiều vận dụng nhiều để giải Nội dung sách giáo khoa Tin học 11 giới thiệu mảng chiều số toán liên quan tới mảng chiều để học sinh vận dụng vào giải thi học sinh giỏi khó Tài liệu ơn luyện học sinh giỏi viết dãy không nhiều, đa số lồng ghép tài liệu quy hoạch động hay chuyên đề quay lui vét cạn… Học sinh giải toán dãy thường chưa đưa thuật toán tối ưu nên dẫn đến test, điểm khơng cao tơi chọn đề tài “Một số giải pháp phân loại tối ưu cho tốn dãy ơn luyện học sinh giỏi môn Tin học” làm sáng kiến kinh nghiệm năm học 2020-2021 với mục đích trao đổi phương pháp mà áp dụng có hiệu bạn đồng nghiệp hy vọng phương pháp bổ sung, hoàn thiện sử dụng THPT Nguyễn Quán Nho nói riêng trường THPT địa bàn tỉnh Thanh Hóa nói chung 1.2 Mục đích nghiên cứu Việc dạy cho học sinh niềm đam mê khả tư lập trình điều khơng thể thiếu việc bồi dưỡng học sinh giỏi môn Tin học Tôi viết đề tài với mục đích: - Cùng trao đổi với bạn đồng nghiệp cách dạy học sinh bước đầu vào học lập trình mơn Tin học xử lí tốt tốn dãy - Giúp học sinh có thêm tài liệu để tham khảo trình học lập trình - Giúp anh chị em đồng nghiệp trường trường phổ thông địa bàn tỉnh có thêm tài liệu để ơn tập thi giáo viên giỏi phục vụ công tác bồi dưỡng học sinh giỏi 1.3 Đối tượng nghiên cứu Các dạng tốn, thuật tốn dãy lập tình Pascal học sinh THPT việc ôn luyện đội tuyển học sinh giỏi 1.4 Phương pháp nghiên cứu -Phương pháp nghiên cứu lý luận: Nghiên cứu tài liệu, sách báo LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com -Phương pháp điều tra thực tiễn: Quan sát việc học học sinh trình khai thác tập sách giáo khoa, sách tập đề thi học sinh giỏi -Phương pháp thực nghiệm sư phạm đối tượng học sinh giỏi môn Tin học THPT Nội dung sáng kiến kinh nghiệm 2.1 Cơ sở lí luận sáng kiến kinh nghiệm Căn vào cấu trúc đề thi học sinh giỏi tỉnh cấp THPT mơn văn hóa nói chung mơn Tin học nói riêng Sở giáo dục đào tạo Thanh Hóa Trường THPT Nguyễn Quán Nho trường xa trung tâm, chất lượng tuyển sinh đầu vào thấp, khu vực tuyển sinh hạn chế (gồm xã Thiệu Quang, Thiệu Giang, Thiệu Thịnh, Thiệu Hợp, Định Công, Định Thành) nên số lượng học sinh mũi nhọn ít, năm nhà trường có lớp khoa học tự nhiên, việc lựa chọn học sinh giỏi hầu hết môn lấy lớp nên trường năm học sinh giỏi môn Tin em phải thi mơn (Tốn-Tin) (Lí-Tin) Mơn Tin học chưa học cấp lại môn phụ không thi tốt nghiệp, đại học nên học sinh không trọng học tập nghiên cứu Là môn khơng có dạy thêm nên việc dạy đội tuyển gặp nhiều khó khăn Chính việc hệ thống, phân loại tối ưu dạng ôn luyện để học sinh hiểu dễ, hiểu sâu dễ dàng việc ôn luyện cần thiết Cách lựa chọn thuật tốn tối ưu cho bài: “Nói độ phức tạp thuật tốn độ phức tạp thời gian quan trọng nhất, thuật toán cho kết thời gian thực thuật toán cần khoảng thời gian lớn chấp nhận (Ví dụ tốn tháp Hà Nội dùng đệ quy để tính tốn với tốc độ máy tính phải giải khoảng vài ngàn năm) Do yêu cầu thời gian đưa Thuật tốn gọi hay phải có thời gian thực ngắn tiết kiệm tài nguyên máy tính Sự hao phí tài nguyên máy tính liên quan đến phần cứng máy tính Vì mà thuật tốn đưa thường lấy thời gian để tính độ phức tạp tài nguyên (vì máy khác tài ngun) Vì vậy, độ phức tạp thuật tốn thời gian thực thuật toán.” 2.2 Thực trạng vấn đề trước áp dụng sáng kiến Khi tìm hiểu lập trình với Pascal, ban đầu em hứng thú nội dung học tập sách giáo khoa nội dung đơn giản Các toán dãy đề thi lại đa dạng yêu cầu tư cao, vận dụng linh hoạt nên học sinh thấy khó phân loại áp dụng kĩ thuật lập trình cho cụ thể LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Trong q trình ơn luyện tập dãy giảng dạy cho học sinh theo đơn lẻ chưa có hệ thống nhiên tập dãy đa dạng có nhiều cách giải khác Các em tham gia đội tuyển thường em học môn tự nhiên, em giải vấn đề theo hướng dễ hiểu mà chưa ưu tiên lựa chọn thuật toán tối ưu mặt thời gian thực dẫn đến em làm kết không cao 2.3 Các giải pháp áp dụng để giải vấn đề 2.3.1 Giải pháp 1: Cung cấp lý thuyết mảng chiều, chuyên đề dãy Để thực giải pháp yêu cầu học sinh nắm thật kỹ kiến thức kiểu mảng chiều trình bày sách giáo khoa Tin học 11 Ngồi ra, tơi cung cấp thêm kiến thức dãy con, thao tác bản, cách duyệt dãy * Mảng chiều Khai báo: “- Khai báo trực tiếp: VAR  : ARRAY [] OF ; Ví dụ: Khai báo biến a mảng chiều gồm 1000 phần tử kiểu số nguyên Var  a : array [1 1000] of longint; - Khai báo gián tiếp: TYPE  = ARRAY [] OF ; VAR  : ; Ví dụ: Khai báo biến a mảng chiều gồm 1000 phần tử kiểu số nguyên Type  mang = array [1 1000] of longint; Var  a : mang; Ta nhận thấy khai báo trực tiếp ngắn gọn khai báo gián tiếp Tuy nhiên có số trường hợp ta khơng thể khai báo trực tiếp mà phải khai báo gián tiếp Chẳng hạn ta khai báo trực tiếp cho tham số chương trình Truy xuất phần tử:      Ta truy xuất trực tiếp đến biến kiểu mảng chiều mà ta phải truy xuất đến phần tử      Mỗi phần tử mảng chiều truy xuất thông qua tên biến mảng với số đặt cặp [ ] Ví dụ:      + a[1] : truy xuất đến phần tử thứ mảng a LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com      + a[5] : truy xuất đến phần tử thứ mảng a” [1] * Dãy con: “ Dãy dãy phần tử liên tục thuộc dãy có trước (dãy mẹ) thỏa mãn tính chất (dãy lưu dạng mảng chiều) - Để quản lí dãy cần số (nơi bắt đầu dãy con) độ dài dãy - Một cách quản lí khác số đầu số cuối - Để xây dựng dãy cần: - Xây dựng giá trị ban đầu - Duyệt qua phần tử dãy, nếu: Thỏa điều kiện, tăng độ dài thêm ngược lại: + Nếu dãy xét cần lưu thì: Lưu lại độ dài, số đầu dãy, xác định lại độ dài, số đầu dãy +Nếu dãy xét khơng cần lưu thì: Xác định lại độ dài, số đầu dãy - Để duyệt qua tất dãy dãy gồm n số ta dùng thuật toán vét cạn sau:     For i:= to n       For j:= to n-i+1 xét dãy vị trí thứ i có độ dài j.” [2] Thời gian thực giải pháp 1: Là buổi, giáo viên cho học sinh nhắc lại kiến thức mảng chiều học sách giáo khoa, làm tập vận dụng để nắm kiến thức Đưa khái niệm dãy con, thao tác dãy con, làm số ví dụ đơn giản Kết sau thực giải pháp 1: Học sinh nhớ thao tác, hiểu chất mảng, vận dụng để giải tập 2.3.2 Giải pháp 2: Cung cấp số thuật toán mảng -Dạng 1: Duyệt để tìm kiếm mảng Thuật tốn 1: Tìm kiếm Thuật tốn 2: Tìm kiếm nhị phân -Dạng 2: Sắp xếp mảng theo thứ tự tăng giảm dần Có nhiều thuật tốn xếp như: Sắp xếp đơn giản, xếp bọt, xếp chèn, xếp nhanh… -Dạng 3: Chia mảng thành k dãy thỏa mãn điều kiện cho trước Một mảng gồm n phần tử, toán đặt cắt mảng thành k dãy thỏa mãn số điều kiện tốn xử dụng nhiều xử lý mảng Thời gian thực giải pháp 2: Là buổi, giáo viên giới thiệu thuật toán mảng chiều, cách vận dụng thuật toán cho tập cụ thể Giới thiệu số đề thi cụ thể Kết sau thực giải pháp 2: Học sinh biết cách áp dụng thuật toán mảng phù hợp với yêu cầu toán 2.3.3 Giải pháp 3: Phân loại toán dãy LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Trong qua trình nghiên cứu tài liệu, sách báo: Tài liệu tập huấn bồi dưỡng HSG năm 2015 năm 2017 Sở GD&ĐT Thanh Hóa (nguồn nội bộ), tìm giải đề thi HSG tỉnh tỉnh Thanh Hóa mơn Tin học tra cứu tập dãy diễn đàn học Pascal Tôi tập hợp phân loại toán dãy giải pháp chủ yếu giúp tơi ơn tập có hiệu phần dãy nhằm nâng cao chất lượng bồi dưỡng học sinh giỏi môn Tin học 2.3.3.1 Dãy gồm phần tử liên tiếp Dãy dãy phần tử liên tục thuộc dãy có trước thỏa mãn tính chất Giải thuật áp dụng cho toán dãy liên tục sử dụng vòng lặp WHILE lồng để duyệt dãy số lần từ đầu đến cuối dãy Ngoài dùng phương pháp quy hoạch động “Trong tốn mảng chiều tốn tìm dãy thỏa mãn điều kiện nào toán tương đối hay, thường chọn làm cấp độ đề thi học sinh giỏi Tin học vịng huyện hay vịng tỉnh Dạng tốn địi hỏi học sinh lập trình phải có kĩ tương đối thành thạo việc xử lí mảng chiều.” [3] Bài toán 1: Cho dãy A gồm N số nguyên (a1, a2,…, aN) Dãy ai, ai+1,…, aj(1≤i≤j≤N) dãy tạo từ phần tử liên tiếp dãy A phần tử i kết thúc phần tử j Yêu cầu: Hãy tìm độ dài liệt kê giá trị phần tử dãy dài tạo thành cấp số cộng có cơng sai d Dữ liệu vào: File văn bản daycon.inp gồm: - Dòng đầu ghi giá trị N, d (2≤N≤10000; 0≤d≤500 ) - Dòng sau gồm N số nguyên (a1, a2,…, aN) (-106≤ai≤106) mỗi số cách một dấu cách Dữ liệu ra: File văn bản daycon.out gồm - Dòng đầu ghi độ dài dãy số dãy thỏa mãn - Dòng tiếp theo ghi giá trị các phần tử dãy (Chú ý: Nếu khơng có dãy thỏa mãn ghi 0) Ví dụ: Daycon.inp 83 36952584 Daycon.out 32 369 258 Cách 1: Khi gặp tốn thơng thường học sinh sử dụng phương pháp vét cạn dãy sau: *Thuật toán: For i:=1 to n For j:=1 to n-i+1 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Begin {Xét tất cả các dãy bắt đầu từ vị trí i có độ dài j} end; For k:=1 to n For j:=1 to n-k+1 begin j:=i+k-1; {Xét tất cả các dãy bắt đầu từ vị trí i đến vị trí j với độ dài k} end; *Code tham khảo: Type km=array[0 10001] of longint; Var a,cs:km; f,g:text;dmax,i,j,n,k,d:longint; Procedure inday(b:km;m,l:longint); Var i:integer; Begin for i:=m to m+l-1 write(b[i],' '); writeln; End; Function kt(b:km;m,l:integer):boolean; Var i:integer; Begin for i:=m to m+l-2 if b[i+1]-b[i]d then exit(false); exit(true); End; BEGIN assign(f,’daycon.inp’);reset(f); assign(g,’daycon.out’);rewrite(g); readln(f,n,d); for i:=1 to n read(f,a[i]); {tim dai va chi so dau day thoa man} dmax:=0; k:=0; for i:=1 to n-1 for j:=2 to n-i+1 if kt(a,i,j) then begin if j>dmax then begin dmax:=j;k:=0; end; if j=dmax then begin k:=k+1;cs[k]:=i; end; end; {in ket qua} if dmax=0 then write(g,'0') else begin writeln(g,dmax,' ',k); for i:=1 to k inday(a,cs[i],dmax); end; close(f); close(g); END Với cách lấy 40% số điểm câu Vì số test có liệu lớn chạy thời gian Cách 2: Thuật toán duyệt qua phần tử dãy mẹ *Thuật toán: LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com - Khởi tạo: dmax=1; dem=1; dau=1; a[n+1]=a[n]+d+1;k=0; {Biến dmax lưu độ dài max dãy, biến dau lưu giá trị đầu dãy, biến k lưu số lượng dãy thỏa mãn} - For i:=1 to n Nếu a[i+1]-a[i]=d tăng biến dem, ngược lại: Nếu dem>dmax begin dmax=dem;k=1;dem=1;cs[k]=dau;dau=i+1; end, ngược lại: Nếu dem=dmax begin inc(k);cs[k]=dau;dau=i+1;dem=1; end, ngược lai: begin dem=1; dau=i+1; end; *Code tham khảo: Type km=array[0 10001] of longint; Var a,cs:km; f,g:text;dmax,i,j,n,k,d:longint; BEGIN assign(f,’daycon.inp’);reset(f); assign(g,’daycon.out’);rewrite(g); readln(f,n,d); for i:=1 to n read(f,a[i]); {tim dai dmax va chi so dau cac day thoa man} k:=0;dmax:=1;dem:=1; dau:=1;a[n+1]:=a[n]+d+1; For i:= to n begin if a[i+1]-a[i]=d then inc(dem) else begin if dem>dmax then begin dmax:= dem; k:=1;cs[k]:=dau; dem:=1;dau:=i+1; end else if dem=dmax then begin inc(k);cs[k]:=dau;dau:=i+1;dem:=1;end else begin dem:=1;dau:=i+1;end; end; end; {in ket qua} if dmax=1 then write(0) else begin writeln(g,dmax,' ',k); for j:=1 to k Begin for i:=cs[j] to cs[j]+dmax-1 write(g,a[i],' '); writeln; End; end; close(f); close(g); END Với cách lấy 100% số điểm câu Tuy nhiên liệu vào lớn như  n=108 thì có số test yếu nên không lấy điểm tối đa Cách 3: Dùng quy hoạch động LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com *Thuật toán - Gọi f[i] độ dài dãy tạo thành cấp số cộng công sai d có số cuối i - f[1]=1 ; - Cơng thức quy hoạch động : Nếu a[i+1]-a[i]=d f[i+1]=f[i], ngược lại f[i+1]=1 - Kết toán: Max(f[i+1]) với i=1,2, ,n-1 *Code tham khảo Type km=array[0 10001] of longint; Var f,a,cs:km; s,g:text;dmax,i,j,n,k,d:longint; BEGIN assign(s,’daycon.inp’);reset(s); assign(g,’daycon.out’);rewrite(g); readln(s,n,d); for i:=1 to n read(s,a[i]); f[1]:=1; dmax:=0; k:=1; for i:=1 to n-1 begin if a[i+1]-a[i]=d then f[i+1]:=f[i]+1 else f[i+1]:=1; if f[i+1]>dmax then begin dmax:=f[i+1];k:=1;cs[k]:=i+1; end else if f[i+1]=dmax then begin inc(k);cs[k]:=i+1; end; end; {in ket qua} if dmax=1 then write(g,'0') else begin writeln(g,dmax,' ',k); for j:= to k begin for i:=cs[j]-dmax+1 to cs[j] write(g,a[i],' '); writeln; end; end; close(s); close(g); End Dễ dàng nhận thấy cách tối ưu mà chương trình ngắn gọn dễ cài đặt phù hợp với lực học sinh trường Do giải tập dạng ta nên lựa chọn cách thứ Cách lấy điểm với dãy có số phần tử lớn lên đến n=108. (Tuy nhiên học sinh lựa chọn cách để giải tốn lấy 100% số điểm n

Ngày đăng: 28/11/2022, 14:08

Mục lục

  • 1. Mở Đầu

    • 1.1. Lí do chọn đề tài

    • 3. Kết luận và kiến nghị

    • Tài liệu tham khảo

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

Tài liệu liên quan