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 15 0
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 1 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 tố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 toá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à tơi á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 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 toán, thuật toá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 -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 toá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 tốn cho kết thời gian thực thuật toán cần khoảng thời gian lớn khơng thể 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 toá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 nguyên) Vì vậy, độ phức tạp thuật toá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ể 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 + 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 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 tố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 Ngồ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 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 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) số cách dấu cách Dữ liệu ra: File văn daycon.out gồm - Dòng đầu ghi độ dài dãy số dãy thỏa mãn - Dòng ghi giá trị phần tử dãy (Chú ý: Nếu 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 Begin {Xét tất dãy 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 dãy 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: - 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 n=108 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 *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=10 (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: 21/05/2021, 22:22

Mục lục

  • 1. Mở Đầu

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

    • Qua nhiều năm giảng dạy và ôn đội tuyển học sinh giỏi môn Tin học tôi nhận thấy trong các đề thi học sinh giỏi bài tập về dãy con gần như năm nào cũng có ở các mức độ khó và dễ khác nhau. Để giải quyết các bài toán về dãy con này có thể phải nhận biết vận dụng linh hoạt các thuật toán như: Quay lui - vét cạn, chặt nhị phân và đặc biệt là phương pháp quy hoạch động trên mảng một chiều, hai chiều được vận dụng rất nhiều để giải quyết.

    • Nội dung sách giáo khoa Tin học 11 chỉ giới thiệu về mảng 1 chiều và 1 số bài toán cơ bản liên quan tới mảng 1 chiều và để học sinh vận dụng vào giải quyết các bài thi học sinh giỏi là rất khó.

    • Tài liệu ôn luyện học sinh giỏi viết về dãy con cũng không nhiều, đa số là lồng ghép trong các tài liệu về quy hoạch động hay các chuyên đề về quay lui vét cạn… Học sinh khi giải quyết các bài toán dãy con thường chưa đưa ra được các thuật toán tối ưu nên dẫn đến mất test, điểm không cao vì vậy tôi chọn đề tài “Một số giải pháp phân loại và tối ưu cho các bài toán về dãy con trong ôn luyện học sinh giỏi môn Tin học” làm sáng kiến kinh nghiệm trong năm học 2020-2021 với mục đích được trao đổi các phương pháp mà tôi đã và đang áp dụng rất có hiệu quả cùng các bạn đồng nghiệp và cũng hy vọng phương pháp này sẽ được bổ sung, hoàn thiện và sử dụng THPT Nguyễn Quán Nho nói riêng và các trường THPT trên địa bàn của tỉnh Thanh Hóa nói chung.

    • 1.2. Mục đích nghiên cứu.

    • 1.3. Đối tượng nghiên cứu.

    • 1.4. Phương pháp nghiên cứu.

    • 2. Nội dung sáng kiến kinh nghiệm

      • 2.1. Cơ sở lí luận của sáng kiến kinh nghiệm.

      • 2.2. Thực trạng vấn đề trước khi áp dụng sáng kiến.

      • 2.3 Các giải pháp đã áp dụng để giải quyết vấn đề.

      • 2.4. Hiệu quả của sáng kiến.

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

      • 3.1. Kết luận.

        • 3.2. Kiến nghị

        • Tài liệu tham khảo

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

  • Đang cập nhật ...

Tài liệu liên quan