Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 36 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
36
Dung lượng
310,7 KB
Nội dung
SỞ GIÁO DỤC VÀ ĐÀO TẠO NGHỆ AN TRƯỜNG THPT THÁI HÒA SÁNG KIẾN KINH NGHIỆM SỬ DỤNG PHƯƠNG PHÁP CHIA ĐỂ TRỊ ĐỂ GIẢI MỘT SỐ BÀI TOÁN Lĩnh vực : Tin học Tên tác giả : Châu Đức Vinh Tổ : Toán Tin Điện thoại : 0942 910 226 Năm học: 2020- 2021 A PHẦN MỞ ĐẦU I Lí chọn đề tài Hiện tài liệu dạng chuyên đề nâng cao phục vụ cho việc bồi dưỡng học sinh giỏi môn Tin học chưa thật đầy đủ tổng quát, đặc biệt chuyên đề khó, đưa vào đề thi học sinh giỏi tỉnh như: Chia để trị, Quy hoạch động, … Từ thực tiễn giảng dạy tin trường THPT thấy để đạt hiệu cao bồi dưỡng học sinh giỏi, cần có cách thiết kế giảng cho phù hợp với nội dung kiến thức dựa tài liệu chuyên đề đầy đủ rõ ràng từ lý thuyết đến tập theo xu chung kì thi học sinh giỏi cấp tương lai, để mang lại thành tích cao cho đội tuyển học sinh giỏi kì thi Xuất phát từ sở trên, chọn đề tài “Sử dụng phương pháp chia để trị để giải số toán”, sáng kiến giúp học sinh trường THPT Thái Hòa vận dụng kiến thức vào làm tốt dạng đề thi học sinh giỏi tỉnh có liên quan đến phương pháp chia để trị, phục vụ cho việc bồi dưỡng học sinh giỏi trường II Mục đích đề tài - Mục tiêu đề tài nghiên cứu phương pháp “Chia để trị” để giải số toán - Giúp cho việc ôn thi học sinh giỏi đạt kết cao - Tạo nguồn tài liệu tham khảo phương pháp thuật toán nhằm hỗ trợ cho học sinh, giáo viên dạy bồi dưỡng học sinh giỏi tin học III Đối tượng phạm vi nghiên cứu Đối tượng nghiên cứu - Sử dụng phương pháp chia để trị số toán - Học sinh giỏi tin khối 11, giáo viên giảng dạy học sinh giỏi tin 11 Phạm vi nghiên cứu Sử dụng phương pháp chia để trị để giải số toán bồi dưỡng học sinh giỏi tin học 11 IV Phương pháp nghiên cứu - Thu thập, phân tích tài liệu thông tin liên quan đến phương pháp chia để trị - Lựa chọn số toán để sử dụng phương pháp chia để trị - Thiết kế toán lựa chọn chương trình tin học 11 để bồi dưỡng học sinh giỏi - Dùng ngơn ngữ lập trình Free Pascal để cài đặt toán chạy thử nghiệm số test để đánh giá kết B NỘI DUNG SÁNG KIẾN KINH NGHIỆM I Cơ sở lý luận: - Cách tiếp cận tri thức mới, đại học sinh trường THPT số trường thuộc trung du miền núi nói chung có THPT Thái Hịa nói riêng khó khăn vì: Thứ thiếu tài liệu chuyên sâu bồi dưỡng học sinh giỏi, thứ hai em chưa quan tâm đến lập trình lẽ khó - Vì tơi tham khảo tài liệu để viết đề tài phương pháp chia để trị từ lý thuyết đến thuật tốn có số toán cho em vận dụng để thực hành máy tính Từ em làm tốt đề có dạng tương tự kì thi chọn học sinh giỏi tin học II Nội dung giải pháp thực Khái niệm: Chia để trị tư tưởng phổ biến sống áp dụng hiệu Tin học Tư tưởng phương pháp chia để trị Người ta phân toán thành toán con, toán lại tiếp tục phân thành toán nhỏ hơn, tiếp tục ta nhận tốn có thuật giải dễ dàng đưa thuật giải Sau kết hợp nghiệm toán để nhận nghiệm toán lớn để cuối nhận nghiệm tốn cần giải Thơng thường toán phân chia dạng với tốn ban đầu có cỡ chúng nhỏ Sơ đồ chung: bước: Các tốn giải phương pháp chia để trị thông qua Bước 1: Chia: Chia toán cần giải thành loạt toán độc lập Tại bước tốn ban đầu chia thành tốn khơng thể chia nhỏ Các toán trở thành bước nhỏ việc giải toán lớn Bước Trị: Giải toán cách đệ quy Tại bước ta phải tìm phương án để giải cho toán cách cụ thể Bước Kết hợp lời giải lại để suy lời giải Khi giải xong toán nhỏ, lặp lại bước giải kết hợp lại lời giải để suy kết cần tìm (có thể dạng đệ quy) Thuật toán β: Giả sử có thuật tốn α để giải tốn kích thước liệu vào n với thời gian bị chặn cn2 (c: số) Xét thuật giải β để giải toán cách: - Bước 1: Chia toán cần giải thành tốn với kích thước n/2 - Bước 2: Giải toán thuật toán α toán - Bước 3: Tổng hợp lời giải toán để thu lời giải Tính đắn thuật tốn: Giả sử bước địi hỏi thời gian dn (d: sơ) Gọi: T α(n)= thời gian thuật toán α T β(n)= thời gian thuật tốn β Ta có: T α(n)= cn2 (theo giả thuyết) T β(n)= T α(n/2) + dn = ¾.cn2 + dn Nếu: dn < c.n2/4 hay n > 4.d/c thuật tốn β nhanh thuật toán α Do 4.d/c số nên với n đủ lớn ta ln có n > 4.d/c Điều cho thấy việc sử dụng thuật tốn β để giải tốn đặt cách chia thành tốn có kích thước ngày nhỏ đến thu tốn kích thước n0 < 4.d/c thu hiệu cao Thuật tốn chia để trị biểu diễn mơ hình đệ quy sau: Procedure DivideConquer(A,x); //Tìm nghiệm x toán A Begin If (A đủ nhỏ) then Solve(A) Else Begin Phân A thành toán A1, , Am; For i:=1 to m DivideConquer(Ai,xi); toán A; Kết hợp nghiệm xi toán Ai để nghiệm End; End; Chúng ta nghiên cứu toán Tháp Hà nội, tốn điển hình giải phương pháp chia để trị để thấy rõ tư tưởng phương pháp Ví dụ Bài tốn Tháp Hà Nội Có N đĩa có đường kính khác đặt chồng lên theo thứ tự giảm dần đường kính tính từ lên Có ba vị trí đặt đĩa đánh số 1, 2, Chồng đĩa ban đầu đặt vị trí 1: Cần chuyển chồng đĩa từ vị trí sang vị trí 2, theo quy tắc sau: Khi di chuyển đĩa, phải đặt vào ba vị trí cho Mỗi lần chuyển đĩa phải đĩa Tại vị trí, đĩa chuyển đến phải đặt lên Đĩa lớn không phép đặt lên đĩa nhỏ (hay nói cách khác: đĩa đặt mặt đất đặt đĩa lớn hơn) Bài tốn có nguồn gốc truyền thuyết Ấn độ có nhóm cao tăng Ấn độ giáo giao trọng trách chuyển dần 64 đĩa vàng cọc kim cương theo điều kiện nói phần Khi hồn tất cơng việc, tức chuyển xong tồn 64 đĩa từ vị trí ban đầu sang vị trí kết thúc thời điểm tận Chúng ta giải toán cách chia toán chuyển N đĩa, từ vị trí sang vị trí thành ba toán đơn giản sau: Chuyển N-1 đĩa từ vị trí sang vị trí 3, dùng vị trí làm trung gian gian Chuyển đĩa thứ N từ vị trí sang vị trí Chuyển N-1 đĩa từ vị trí sang vị trí 2, dùng vị trí làm trung Chú ý toán tương tự toán ban đầu, khác kích thước nhỏ Chúng giải phương pháp “chia để trị” giống toán ban đầu Dễ dàng kiểm tra giải chúng thoả mãn điều kiện Bài tốn giải đơn giản Thuật tốn viết dạng giả mã sau: Procedure Hanoi; begin Move(n,1,2,3); end; Procedure Move(n,a,b,c); {chuyển n đĩa, từ vị trí a sang vị trí b, dùng vị trí c làm trung gian } begin if n=0 then exit; Move(n-1,a,c,b); writeln('Chuyển đĩa ',n, ' từ vị trí ',a, 'sang vi tri ',b); Move(n-1,c,b,a); end; Chương trình Pascal: Program ThapHN; var n:integer; procedure move(n,a,b,c:integer); begin if n=0 then exit; move(n-1,a,c,b); writeln('Chuyen dia ',n,' tu vi tri ',a,' sang vi tri ',b); move(n-1,c,b,a); end; begin write('Nhap N = ');readln(n); move(n,1,2,3); readln end Chúng ta dừng lại chút để phân tích độ phức tạp tính tốn Gọi T(n) số thao tác chuyển đĩa cần thiết để chuyển xong n đĩa Theo thuật tốn ta có: T(n) = T(n-1) + + T(n-1) Bằng phương pháp giải cơng thức truy hồi ta có T(n) = 2n-1 Áp dụng kết với giả thiết cao tăng phải giây để chuyển xong đĩa từ cọc sang cọc kia, ta thấy thời gian để chuyển toàn 64 đĩa vàng T(64)=216-1=18446744073709551615 giây Như ngày tận (nếu có) theo truyền thuyết phải 600 tỉ năm đến Áp dụng phương pháp chia để trị cho tốn tìm kiếm: Bài tốn tìm kiếm Thuật tốn tìm kiếm nhị phân Bài toán: Cho dãy A gồm N số nguyên xếp theo thứ tự không giảm số ngun K Cho biết có hay khơng phần tử dãy có giá trị K? Ý tưởng: Sử dụng tính chất dãy tăng ta thu hẹp phạm vi tìm kiếm sau lần so sánh khóa K với số hạng chọn Để làm điều ta chọn số hạng AGiữa “giữa dãy để so sánh với K, Giữa = [(n+1)/2] Khi xẩy trường hợp sau: thúc - Nếu AGiữa = K Giữa số cần tìm Việc tìm kiếm kết - Nếu AGiữa > K dãy xếp nên việc tìm kiếm thực dãy từ A1 đến AGiữa-1 phạm vi tìm kiếm khoảng nửa phạm vi tìm kiếm trước - Nếu AGiữa < K thực tìm kiếm dãy từ AGiữa+1 đến AN Quá trình tìm kiếm kết thúc tìm thấy khóa K dãy A phạm vi tìm kiếm rỗng Thuật tốn: Bước 1: Nhập N số hạng A1 AN khóa K; Bước 2: First=1; Last=N; Bước 3: Mid=[(First+Last)/2]; Bước 4: Nếu AMid=K thơng báo số Mid kết thúc; Bước 5: Nếu AMid>K Last=Mid-1, chuyển đến bước 7; Bước 6: First=Mid+1; Bước 7: Nếu First>Last thơng báo dãy A khơng có số hạng K kết thúc; Bước 8: Quay lại bước Thuật tốn tìm kiếm nhị phân có tư tưởng gần giống với thuật tốn xếp nhanh Nó thực việc tìm vị trí trung tâm, thơng qua phép so sánh giá trị cần tìm với giá trị vị trí trung tâm để định vùng liệu (trước hay sau vị trí trung tâm) mà giá trị thuộc Việc tìm kiếm tiếp tục 1/2 tập hợp liệu vừa xác định với cách thức tìm kiếm, giá trị vị trí trung tâm giá trị cần tìm phạm vi tìm kiếm rỗng dừng Vì sau bước tìm kiếm miền liệu lại giảm phân nữa, số lượng bước tìm kiếm tăng dần tới tối đa log2(N) Vì độ phức tạp thuật toán xem O(logN) Chúng ta xem cách cài đặt thuật tốn thơng qua ví dụ sau: Bài tốn áp dụng: Bài Bài tốn Hẹn gặp Thành phố Gloaming (Hồng hơn) tiếng với đường dẫn vào công viên thành phố Các tượng tuyệt đẹp theo chủ đề thần thoại Hy lạp – La mã đặt dọc theo đường thẳng có sức hút khơng cưỡng với khách dulịch Còn tia nắng cuối ngày miễn cưỡng rời khỏi bầu trời sương mù dày đặc, voan trắng mềm mại từ từ rũ xuống Bây đứng cách r mét khơng nhìn thấy mặt tượng trở thành nơi lý tưởng cho đôi nam nữ niên hẹn hò James Bond cần gặp gấp điệp viên nội tuyến để nhận mật báo khẩn Khơng muốn người nhìn thấy nhau, Bond hẹn gặp người tượng cho khoảng cách chúng lớn r Trên đường có n tượng, tượng thứ i vị trí cách đầu đường di mét i = ÷ n, ≤ d1< d2 < .< dn ≤ 109 Yêu cầu: Hãy xác định James Bond có cách chọn địa điểm Dữ liệu vào: Vào từ file văn BAI1.INP: - Dòng chứa số nguyên n r (1 ≤ n ≤ 3×105, ≤ r ≤ 109) - Dòng thứ chứa n số nguyên d1, d2, , dn Kết quả: Đưa file văn BAI1.OUT số nguyên số cách chọn địa điểm tìm Ví dụ: BAI INP 44 BAI 1.OUT 1358 Rằng buộc: - Có ½ số test tương ứng với ½ số điểm có n ≤ 104 - Có ½ số test tương ứng với ½ số điểm có 104 < n ≤ 3×105 Thực trạng: Với cách tư thơng thường học sinh khai báo mảng lưu trữ vị trí di Sử dụng vịng lặp for để kiểm tra r + d[i]< d[j] dừng lại để cộng vào biến đếm Khi độ phức tạp thuật toán O(n2), mà theo giới hạn đầu 1≤n≤3x105 nên với n max số lượng phép tốn phải thực là: 3x105x 3x105 Nếu gặp test chắn chương trình khơng thể thực giây Procedure xuli; Var i,j:int64; Begin Dem:=0; For i:=1 to n For j:=i to n If r+d[i] n; - Đưa max Chương trình tham khảo: const fi=’TC.INP’; fo=’TC.OUT’; 23 var F1,F2:TEXT; a:array[1 1000]of integer; n,i:integer; procedure taotep; begin Assign(f1,fi); assign(f2,fo); Reset(f1); rewrite(f2); end; procedure doctep; var i:integer; begin readln(f1,n); for i:=1 to n read(f1,a[i]); end; procedure quicksort(l,h:integer); var i,j,key,tg:integer; begin i:=l; j:=h; key:=a[(l+h) div 2]; repeat while a[i]key dec(j); if ij; if j>l then quicksort(l,j); if i