1. Trang chủ
  2. » Giáo án - Bài giảng

Giúp học sinh lựa chọn và cài đặt chương trình tối ưu khi giải một số dạng bài tập về dãy con nhằm nâng cao chất lượng

24 325 0

Đ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

Thông tin cơ bản

Định dạng
Số trang 24
Dung lượng 474 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

SỞ GIÁO DỤC VÀ ĐÀO TẠO THANH HOÁTRƯỜNG THPT ĐẶNG THAI MAI SÁNG KIẾN KINH NGHIỆM ĐỀ TÀI GIÚP HỌC SINH LỰA CHỌN VÀ CÀI ĐẶT CHƯƠNG TRÌNH TỐI ƯU KHI GIẢI MỘT SỐ DẠNG BÀI TẬP VỀ DÃY CON NHẰM

Trang 1

SỞ GIÁO DỤC VÀ ĐÀO TẠO THANH HOÁ

TRƯỜNG THPT ĐẶNG THAI MAI

SÁNG KIẾN KINH NGHIỆM

ĐỀ TÀI

GIÚP HỌC SINH LỰA CHỌN VÀ CÀI ĐẶT CHƯƠNG TRÌNH TỐI ƯU KHI GIẢI MỘT SỐ DẠNG BÀI TẬP VỀ DÃY CON NHẰM NÂNG CAO CHẤT LƯỢNG HỌC SINH GIỎI

MÔN TIN HỌC Ở TRƯỜNG THPT

Người thực hiện: Hoàng Thị Mai Chức vụ: Giáo viên

SKKN thuộc lĩnh vực: Tin học

THANH HOÁ NĂM 2016

Trang 2

1 MỞ ĐẦU 1.1 Lý do chọn đề tài

Cùng với công tác bồi dưỡng học sinh thi Đại học – Cao đẳng thì công tácbồi dưỡng học sinh giỏi là một công tác mũi nhọn của nhà trường Thông quakết quả học sinh giỏi phần nào khẳng định được vị thế của trường so với cáctrường bạn trong huyện nói riêng và trong tỉnh nói chung

Tuy nhiên chất lượng học sinh giỏi môn Tin học của trường từ năm học

2013 – 2014 trở về trước còn thấp, chưa có học sinh nào đạt được giải học sinhgiỏi môn Tin học cấp tỉnh, mặc dù một số năm vẫn có học sinh tham gia thi.Chất lượng học sinh giỏi môn Tin học còn thấp như vậy, phần vì năng lực họcsinh (do chất lượng đầu vào của học sinh thấp) phần vì phương pháp giảng dạycủa giáo viên chưa phù hợp Do đó việc nâng cao chất lượng học sinh giỏi mônTin học là cần thiết và cấp bách nhằm góp thêm vào thành tích chung của nhàtrường

Mặt khác, trong quá trình dạy bồi dưỡng học sinh giỏi tôi gặp rất nhiều bàitoán về dãy con Đây là dạng bài tập khó thường xuất hiện trong các đề thi họcsinh giỏi môn Tin học Rất nhiều học sinh khi gặp dạng bài tập này bị mất điểmhoặc điểm không cao Nguyên nhân có thể nhiều nhưng trong đó có hai nguyênnhân cơ bản là: chương trình cho kết quả output sai hoặc chương trình cho kếtquả output đúng với các bộ input có dữ liệu nhỏ nhưng với những bộ input có dữliệu lớn thì chương trình chạy quá thời gian quy định là 1giây/1test (mặc dù kếtquả output vẫn đúng)

Trên thực tế đã có một số tài liệu đề cập đến các bài tập về dãy con, nhưngcác tài liệu này mới chỉ đưa ra thuật toán và chương trình giải một số bài tập cụthể làm ví dụ minh họa cho một kỹ thuật lập trình nào đó khi nghiên cứu màchưa khái quát dạng, chưa phân tích sâu cách tư duy, cách lựa chọn và cài đặtchương trình tối ưu Các chương trình mà một số tài liệu đưa ra rất khó hiểu vàphức tạp không phù hợp năng lực học sinh Trường THPT Đặng Thai Mai Khinghiên cứu các tài liệu này, không chỉ học sinh mà ngay cả giáo viên còn lúngtúng, mơ hồ, áp dụng một cách máy móc mà chưa biết nên chọn cách làm nào?Cách làm nào tối ưu hơn?

Với mong muốn giúp học sinh giải quyết tốt hơn các bài tập về dãy con vàhiểu biết sâu sắc hơn cách giải các bài tập này, tôi đã dày công nghiên cứu, phândạng các bài tập dãy con, trăn trở để tìm ra nhiều cách làm khác nhau, đánh giáđộ phức tạp, đo thời gian thực hiện chương trình, để so sánh tìm ra chương trìnhtối ưu nhất và dễ hiểu nhất trong các chương trình đã đưa ra Từ đó nâng caochất lượng bồi dưỡng học sinh giỏi môn Tin học

Từ những lý do trên tôi đã mạnh dạn trình bày sáng kiến kinh nghiệm:

“Giúp học sinh lựa chọn và cài đặt chương trình tối ưu khi giải một số dạng bàitập về dãy con nhằm nâng cao chất lượng học sinh giỏi môn Tin học ở trườngTHPT”

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

Đề tài này nghiên cứu nhằm giúp học sinh giải quyết tốt các bài toán về dãy

Trang 3

con từ đó đổi mới cách tư duy lập trình, để khi đứng trước một bài toán cần giảiquyết ngoài việc tìm ra thuật toán để cài đặt chương trình thì học sinh sẽ biếtcách so sánh, đánh giá hiệu quả của thời gian thực hiện chương trình (hay còngọi là độ phức tạp của thuật toán) và lựa chọn được chương trình phù hợp nhằmnâng cao chất lượng học sinh giỏi.

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

Sáng kiến kinh nghiệm có đối tượng nghiên cứu là các bài toán về dãy con,được nghiên cứu ở nhiều cách làm, xét trên nhiều phương diện như: độ phức tạp,kết quả output, thời gian thực hiện chương trình

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

Để trình bày sáng kiến kinh nghiệm này, tôi đã sử dụng phối kết hợp nhiềuphương pháp như: nghiên cứu tài liệu, thuyết trình, quan sát, điều tra cơ bản,thực nghiệm so sánh, phân tích kết quả thực nghiệm, … phù hợp với môn họcthuộc lĩnh vực Tin học

Trang 4

2 NỘI DUNG NGHIÊN CỨU 2.1 Cơ sở lý luận

Nghị quyết hội nghị Trung ương VIII khóa XI chỉ đạo: “Giáo dục và đạotạo là Quốc sách hàng đầu, là sự nghiệp của Đảng và Nhà nước và của toàn dân.Đầu tư cho giáo dục là đầu tư phát triển, được ưu tiên đi trước cho các chươngtrình, kế hoạch phát triển KT-XH; phát triển giáo dục và đạo tạo là nâng cao dântrí, đạo tạo nhân lực, bồi dưỡng nhân tài Chuyển mạnh quá trình giáo dục từchủ yếu trang bị kiến thức sang phát triển toàn diện năng lực và phẩm chấtngười học Học đi đôi với hành, lý luận gắn với thực tiễn, giáo dục nhà trườngkết hợp với giáo dục gia đình và giáo dục xã hội”

Nghị quyết hội nghị Trung ương VIII khóa XI đề ra mục tiêu: “Đối với giáodục phổ thông tập trung phát triển trí tuệ, thể chất, hình thành phẩm chất, nănglực công dân, phát hiện và bồi dưỡng năng khiếu, định hướng nghề nghiệp chohọc sinh Nâng cao chất lượng giáo dục toàn diện, chú trọng giáo dục lý tưởngtruyền thống đạo đức, lối sống, ngoại ngữ, tin học, năng lực và kỹ năng thựchành, vận dụng kiến thức vào thực tiễn, phát triển khả năng sáng tạo và tự học,khuyến khích học tập suốt đời, hoàn thành đào tạo giáo dục phổ thông giai đoạnsau 2015”

Căn cứ vào mục tiêu của môn Tin học, là phải cung cấp những tri thức cơbản, làm nền tảng để học sinh có thể tiếp tục đi sâu vào tìm hiểu và xây dựngkhoa học Tin học hoặc tiếp thu những tri thức của các lĩnh vực kĩ thuật côngnghệ tiên tiến, nhất là các lĩnh vực của công nghệ thông tin

Môn Tin học, cũng như mọi môn học khác, căn cứ vào mục tiêu trên đểxác định ra nhiệm vụ cụ thể của môn học, tổ chức hoạt động đào tạo góp phầnthực hiện mục tiêu giáo dục mà Đảng và nhà nước đề ra

Nếu học sinh thực hiện tốt việc lựa chọn và cài đặt chương trình tối ưu khigiải các bài tập về dãy con nói riêng và các bài tập lập trình nói chung thì chất

lượng học sinh giỏi sẽ được nâng cao

2.2 Thực trạng

2.2.1 Giới thiệu khái quát về trường

Trường THPT Đặng Thai Mai được thành lập ngày: 20/08/2001, theo quyếtđịnh số: 2109/QĐ-UB của Chủ tịch UBND Tỉnh Thanh Hoá Trường nằm ngaytrên đường quốc lộ 1A, thuộc km 12 từ thành phố Thanh Hóa xuống phía Nam,thuộc địa bàn xã Quảng Bình, huyện Quảng Xương, tỉnh Thanh Hóa, nơi đa sốphụ huynh học sinh làm nông nghiệp, điều kiện kinh tế còn gặp nhiều khó khăn.Các em học sinh ít có điều kiện tiếp xúc với máy tính ở nhà Ban đầu trườnghoạt động theo mô hình trường bán công, chất lượng đầu vào của học sinh thấp,chủ yếu là học sinh trung bình, yếu Mặc dù ngày 31 tháng 5 năm 2010 chủ tịchtỉnh Thanh hóa có quyết định chuyển đổi trường THPT Đặng Thai Mai sanghình thức công lập nhưng chất lượng đầu vào của học sinh vẫn còn thấp so vớicác trường trong huyện

Trường hiện có 25 lớp, đã trang bị 2 phòng học thực hành Tin học, có lắpđặt máy chiếu, đảm bảo cơ sở vật chất đầy đủ cho việc học môn Tin học của nhà

Trang 5

Môn Tin học là môn học đặc thù có nhiều kiến thức khó như lập trìnhpascal ở lớp 11 (đây là kiến thức thi học sinh giỏi tỉnh môn Tin học) nhưngthường bị xem nhẹ, bị xem là “môn phụ” Học sinh – phụ huynh chưa mặn mà,chưa quan tâm đúng mực tới môn học nên việc lựa chọn và bồi dưỡng học sinhgiỏi là vô cùng khó khăn.

2.2.2 Thực trạng trước khi nghiên cứu

Năm 2013 – 2014 tôi có phối hợp cùng một giáo viên khác tham gia côngtác bồi dưỡng học sinh giỏi tỉnh môn Tin học, cũng là năm đầu tiên tôi tham giacông tác bồi dưỡng học sinh giỏi, việc dạy đội tuyển của tôi chủ yếu dựa trênnhững kiến thức cơ bản của sách giáo khoa, chưa chú trọng nhiều đến cải tiếnchương trình tối ưu hơn để chương trình chạy nhanh hơn và chủ yếu là địnhhướng cho học sinh tìm ra được thuật toán (cách làm) để chương trình cho rađược kết quả mà thôi

Chính vì vậy khi giải quyết các bài toán về dãy con nói riêng và các bài tậplập trình pascal khác nói chung, học sinh và ngay cả giáo viên thường chỉ làmviệc với các bộ input có dữ liệu nhỏ dễ nhìn thấy kết quả output và thườngkhông xét đến trường hợp input đặc biệt hay các input có dữ liệu lớn Dẫn đến bịmất điểm trong bài thi học sinh giỏi

Đối với thi học sinh giỏi, dù kết quả output của 2 thí sinh có giống hệt nhauvới cùng một bộ input, nhưng việc chênh lệch về thời gian quyết định thí sinh cóthể chiến thắng hay thất bại (yêu cầu thời gian xử lí chương trình không quá 1giây/1 test)

Trong các kì thi học sinh giỏi gần đây, với cấu trúc đề 3 câu tương ứng với

số điểm 6, 7, 7, trong đó chỉ có không quá 50% các dữ liệu input là nhỏ vừa tầmthì việc thí sinh dù có làm hết cả 3 câu trong đề thì nguy cơ thất bại vẫn rất cao.Bảng điểm các lần thi khảo sát chất lượng học sinh giỏi về chuyên đề dãycon (do tôi tự tổ chức) năm học 2013 – 2014 khi chưa thực hiện đề tài:

Họ tên Điểm lần 1 Điểm lần 2 Điểm lần 3 Điểm lần 4Phạm Hà Uyên 2/10 3/10 2/10 3/10

Lê Đình Miền 3/10 3/10 4/10 4/10

Do đó kết quả học sinh giỏi năm 2013- 2014 chưa được như mong muốn,có 2 em học sinh tham gia thi học sinh giỏi Tin của trường thất bại không có emnào đạt giải (mặc dù khi đi thi về các em rất phấn khởi vì nghỉ mình làm bài tốt,đúng vậy bài làm các em đều cho kết quả đúng trong khoảng thời gian cho phépnhỏ hơn 1 giây nhưng với bộ input có dữ liệu nhỏ còn bộ input có dữ liệu lớn thìbài làm vẫn cho kết quả đúng nhưng thời gian chạy chương trình quá 1giây,nghĩa là bộ test có dữ liệu lớn các em bị mất điểm)

Trang 6

Vấn đề đặt ra, là làm thế nào để lấy được điểm với các bộ input có dữ liệulớn Muốn vậy cần phải lựa chọn và cài đặt được chương trình hiệu quả (tối ưu).Chương trình hiệu quả là chương trình giải quyết được những bộ input có dữliệu lớn, chính xác, dung lượng sử dụng bộ nhớ nhỏ, thời gian thực chương trìnhngắn, Nhưng trong phạm vi sáng kiến kinh nghiệm của mình, tôi chỉ nghiêncứu về tiêu chí thời gian thực hiện chương trình để lựa chọn chương trình tối ưu,đây là tiêu chí quan trọng nhất và được người ta quan tâm nhiều Ngoài ra, tôicũng ưu tiên lựa chọn chương trình ngắn gọn, dễ hiểu phù hợp với năng lực họcsinh trường tôi.

Thời gian thực hiện chương trình không chỉ phụ thuộc vào thuật toán màcòn phụ thuộc vào cấu hình máy tính, kĩ xảo người lập trình, kích thước và tínhchất của dữ liệu vào, Để cụ thể và tường minh hơn tôi có sử dụng phần mềm

Themis để đo thời gian thực hiện của các chương trình với các bộ test cụ thể (có

file test kèm theo) Các kết quả được tôi thử nghiệm trên máy tính laptop ASUS,Ram 2GB, Processor AMDE-450 APU 1.65HZ

2.3 Các biện pháp sử dụng để giải quyết vấn đề

2.3.1 Cơ sở lý thuyết

2.3.1.1 Dãy con liên tiếp

Dãy con liên tiếp là dãy gồm các phần tử liên tiếp thuộc một dãy cho trước(dãy mẹ)

Ví dụ: Cho dãy A gồm 4 số nguyên {3,1,2,-6} Dãy số {2}; {1,2}; {3,1,2};

{3,1,2,-6}; … được gọi là các dãy con liên tiếp của dãy A

2.3.1.2 Dãy con có thể chọn không liên tiếp

Dãy con có thể chọn không liên tiếp là dãy thu được sau khi xóa một sốphần tử (có thể không xóa phần tử nào) của một dãy cho trước (dãy mẹ) và giữnguyên thứ tự các phần tử còn lại trong dãy

Ví dụ: Cho dãy B gồm 5 số nguyên {3,1,2,-6, 9} Dãy số {2}; {1,2}; {3,2};

{3,2,-6}; {3,1,2,-6,9}; … được gọi là các dãy con có thể chọn không liên tiếpcủa dãy A

2.3.1.3 Độ phức tạp của thuật toán

Giả sử ta có hai thuật toán P1 và P2 với thời gian thực hiện tương ứng là

T1(n) = 100n2 (với tỷ suất tăng là n2) và T2(n) = 5n3 (với tỷ suất tăng là n3) Khi n

> 20 thì T1 < T2 Sở dĩ như vậy là do tỷ suất tăng của T1 nhỏ hơn tỷ suất tăng của

T2 Như vậy một cách hợp lý là ta xét tỷ suất tăng của hàm thời gian thực hiệnchương trình thay vì xét chính bản thân thời gian thực hiện

Cho một hàm T(n), T(n) gọi là có độ phức tạp f(n) nếu tồn tại các hằng C,

N0 sao cho T(n) ≤ Cf(n) với mọi n ≥ N0 (tức là T(n) có tỷ suất tăng là f(n)) và kíhiệu T(n) là O(f(n)) (đọc là “ô của f(n)”)

Các hàm thể hiện độ phức tạp có các dạng thường gặp sau: log 2 n, n, nlog 2 n,

n 2 , n 3 , 2 n , n!, n n

Trong cách viết, ta thường dùng logn thay thế cho log2n cho gọn

Khi ta nói đến độ phức tạp của thuật toán là ta nói đến hiệu quả thời gianthực hiện chương trình nên có thể xem việc xác định thời gian thực hiện chương

Trang 7

trình chính là xác định độ phức tạp của thuật toán.

2.3.2 Biện pháp lựa chọn và cài đặt chương trình tối ưu khi giải một số dạng bài tập về dãy con

Đối với mỗi dạng bài tập về dãy con tôi đưa ra một bài toán ví dụ, mỗi bàitoán ví dụ tôi trình bày từ 2 hoặc 3 cách (cả cách làm của học sinh và cách làmtôi định hướng cho học sinh làm) Với phương châm của tôi “ mưa dầm thấmlâu” tôi ko hướng dẫn học sinh cách làm tối ưu ngay mà khi phát vấn một dạngbài tập mới mà tôi yêu cầu học sinh làm theo các trình tự sau:

Bước 1: Xác định bài toán

Bước 2: Suy nghĩ tìm ra thuật toán, viết chương trình (trên môi trường Free Pascal), tính độ phức tạp (Có thể nhiều cách).

Bước 3: Trao đổi cách làm của mình với bạn để tìm cái hay cái dở.

Bước 4: Sử dụng phần mềm Themis-chấm bài tự động để chấm cách làm

của mình (với 10 bộ test giáo viên đã xây dựng sẵn, mỗi bộ test cấu hình là 1điểm, thời gian chạy không quá 1 giây)

Bước 5: Nhận xét sự tối ưu của thuật toán.

Bước 6: Giáo viên định hướng cách làm tối ưu hơn (nếu có).

Bước 7: Sử dụng phần mềm Themis để chấm tất cả các cách đã viết chương

trình

Bước 8: Dựa vào kết quả, lựa chọn chương trình có độ phức tạp nhỏ nhất,

thời gian thực hiện mỗi test nhỏ nhất và chương trình ngắn gọn dễ hiểu nhất

Bước 9: Lập trình giải các bài tập tương tương với cách đã lựa chọn.

2.3.2.1 Bài tập về dãy con liên tiếp

2.3.2.1.1 Dạng 1: Các dãy con không chung nhau bất kỳ phần tử nào của dãy mẹ

Các dãy con không chung nhau bất kỳ phần tử nào của dãy mẹ nghĩa lànhững phần tử của dãy mẹ đã thuộc dãy con thỏa mãn này thì không thuộc cácdãy con thỏa mãn khác

Ví dụ: Dãy mẹ gồm 7 phần tử {2, 5, -9, -6, 0, -7, -5} Dãy con 9, -6};

{-7, -5} là các dãy con liên tiếp không chung nhau bất kỳ phần tử nào của dãy mẹ

Lưu ý: Dạng bài tập này áp dụng cho cả trường hợp một phần tử đầu của dãy

này trùng với một phần tử cuối của dãy kia

2.3.2.1.1.1 Bài toán cơ bản: Cho một dãy A gồm N số nguyên (hoặc số thực)

{a1, a2,…, aN} Dãy con ai, ai+1,…, aj (1≤i≤j≤N) là dãy được tạo từ các phần tửliên tiếp của dãy A bắt đầu từ phần tử i và kết thúc ở phần tử j Hãy tìm độ dàidãy con, số lượng dãy con, liệt kê chỉ số các dãy con, liệt kê giá trị các phần tửdãy con thõa mãn một điều kiện nào đó (Độ dài dãy con là số lượng phần tử dãycon)

Để giải dạng bài tập này ta có thể sử dụng nhiều thuật toán như: thuật toánvét cạn các dãy con hoặc duyệt qua các phần tử của dãy hoặc sử dụng phươngpháp quy hoạch động Đối với dạng bài tập này tôi định hướng cho học sinh lựachọn thuật toán duyệt qua các phần tử của dãy hoặc quy hoạch động

Mô hình thuật toán:

Trang 8

Cách 1 Sử dụng phương pháp duyệt qua các phần tử của dãy:

- Duyệt qua tất cả các phần tử của dãy nếu:

+ Thỏa mãn điều kiện, tăng độ dài thêm 1, ngược lại:

 Nếu dãy con đang xét cần lưu thì: lưu lại độ dài, chỉ số đầu của dãy,xác định lại độ dài, chỉ số đầu của dãy mới

 Nếu dãy con đang xét không cần lưu thì: lưu lại độ dài, chỉ số đầucủa dãy mới

Cách 2 Sử dụng phương pháp quy hoạch động (Đây là cách tôi định hướng cho học sinh làm)

- Gọi f[i] là độ dài dãy con thỏa mãn điều kiện có phần tử cuối là a[i], i=1 n

- Gán giá trị độ dài dãy con trong trường hợp đơn giản: f[0]:=0; f[1]:=1

- Tính f[i] nhờ các giá trị bài toán con đã tính từ trước như f[i-1], f[i-2],

- Kết quả bài toán là sự tổng hợp kết quả từ các bài toán con f[i] (i=1,2, ,n)

2.3.2.1.1.2 Bài toán ví dụ

Cho một dãy A gồm N số nguyên {a1, a2,…, aN} Dãy con ai, ai+1,…, aj

(1≤i≤j≤N) là dãy được tạo từ các phần tử liên tiếp của dãy A bắt đầu từ phần tử ivà kết thúc ở phần tử j

Yêu cầu: Hãy tìm độ dài và liệt kê giá trị mỗi phần tử của dãy con dài nhất tạo

thành cấp số cộng có công sai d

Dữ liệu vào: File văn bản dayconcsc.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áchnhau một dấu cách

Dữ liệu ra: File văn bản dayconcsc.out gồm

- Dòng đầu ghi độ dài dãy con và số dãy con thỏa mãn

- Dòng tiếp theo ghi giá trị các phần tử dãy con

(Chú ý: Nếu không có dãy con nào thỏa mãn thì ghi 0)

Ví dụ:

Cách 1: Khi gặp

bài toán nàythông thường họcsinh sẽ sử dụngphương pháp vét cạn các dãy con như sau:

 Mô hình thuật toán:

For i:=1 to n do

For j:=1 to n-i+1 do

Begin

{Xét tất cả các dãy con bắt đầu

từ vị trí i có độ dài j}

end;

hoặc For k:=1 to n do For j:=1 to n-k+1 do

begin j:=i+k-1;

{Xét tất cả các dãy con bắt đầu từ vị trí i đến vị trí j với độ dài k}

Trang 9

 Cài đặt chương trình:

Program c1_dayconcsc;

Type km=array[0 10001] of longint;

Const fi='dayconcsc.inp'; fo='dayconcsc.out';

Var a,cs:km; dmax,i,j,n,k,d:longint;

Begin for i:=m to m+l-2 do

if b[i+1]-b[i]<>d then exit(false); exit(true);

End;

BEGIN

assign(input,fi);reset(input); assign(output,fo);rewrite(output);

readln(n,d); for i:=1 to n do read(a[i]);

{tim do dai va chi so dau day con thoa man}

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('0')

else begin writeln(dmax,' ',k);

for i:=1 to k do inday(a,cs[i],dmax);

end; close(input); close(output);

Cách 2: Thuật toán duyệt qua các phần tử của dãy mẹ.

 Mô hình 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 mỗi dãy, biến k

Trang 10

lưu số lượng dãy con thỏa mãn}

- For i:=1 to n do

Nếu a[i+1]-a[i]=d thì tăng biến dem, ngược lại:

Nếu dem>dmax thì begin dmax=dem;k=1;dem=1;cs[k]=dau;dau=i+1;

end, ngược lại:

Nếu dem=dmax thì begin inc(k);cs[k]=dau;dau=i+1;dem=1;

end, ngược lai: begin dem=1; dau=i+1; end;

 Cài đặt chương trình:

Program c2_dayconcsc;

Const fi='dayconcsc.inp'; fo='dayconcsc.out';

Var a,cs:array[0 10001] of longint;dmax,dem,i,j,n,dau,k,d:longint;

BEGIN

assign(input,fi);reset(input);assign(output,fo);rewrite(output);

readln(n,d); for i:=1 to n do read(a[i]);

{tim do dai dmax va chi so dau cac day con thoa man}

begin if dem>dmax then

begin dmax:= dem; k:=1;cs[k]:=dau; dem:=1;dau:=i+1; end

{in ket qua}

if dmax=1 then write(0) else

Test02 (giây)

Test03 (giây)

Test04 (giây)

Test05 (giây)

Test06 (giây)

Test07 (giây)

Test08 (giây)

Test09 (giây)

Test10 (giây) 0(n) 0.0871 0.0887 0.0871 0.1116 0.0915 0.0919 0.114 0.1210 0.1335 0.1190

Với cách này có thể lấy được 100% số điểm câu này Tuy nhiên nếu dữ liệu

Trang 11

vào lớn như n=10 8 thì sẽ có một số test yếu nên không lấy được điểm tối đa.

Cách 3: Dùng quy hoạch động

 Mô hình thuật toán

- Gọi f[i] là độ dài dãy con tạo thành cấp số cộng công sai d có chỉ số cuốilà i

- Ta dễ dàng nhận thấy bài toán cơ sở : f[1]=1 ;

- Công thức quy hoạch động là :

- Công thức quy hoạch động :

Nếu a[i+1]-a[i]=d thì f[i+1]=f[i], ngược lại f[i+1]=1

- Kết quả bài toán: Max(f[i+1]) với i=1,2, ,n-1

 Cài đặt chương trình:

Program c3_dayconcsc;

Const fi='dayconcsc.inp'; fo='dayconcsc.out';

Var a,cs,f:array[0 10001] of longint; dmax,i,n,j:integer; k,d:longint;

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('0')

else begin writeln(dmax,' ',k);

Trang 12

gian chạy không quá 1 giây được 1 điểm):

Dễ dàng nhận thấy cách 3 là tối ưu hơn cả mà chương trình ngắn gọn dễcài đặt phù hợp với năng lực học sinh trường tôi Do vậy giải các bài tập dạng

này ta nên lựa chọn cách thứ 3 Cách này có thể lấy được điểm với dãy có số

phần tử lớn lên đến n=108 (Tuy nhiên học sinh có thể lựa chọn cách 2 để giải quyết bài toán thì cũng lấy được 100% số điểm nếu n<10 8 ).

2.3.2.1.1.3 Bài toán áp dụng

Bài 1: Cho một dãy A gồm N số nguyên {a1, a2,…, aN} Dãy con liên tiếp cácphần tử ai, ai+1,…, aj (1≤i≤j) thỏa mãn điều kiện ai<ai+1<…<aj được gọi là dãycon đơn điệu tăng của dãy A

Yêu cầu: Hãy tìm độ dài và chỉ số dãy con liên tiếp đơn điệu tăng dài nhất.

Dữ liệu vào: File văn bản daycontang.inp gồm:

- Dòng đầu ghi giá trị N (5≤N≤10000)

- Dòng sau gồm N số nguyên {a1, a2,…, aN} (-106≤ai≤106) mỗi số cáchnhau một dấu cách

Dữ liệu ra: File văn bản daycontang.out gồm

- Dòng đầu ghi độ dài và số lượng dãy con thỏa mãn

- Dòng tiếp theo ghi chỉ số các phần tử dãy con

(Chú ý: Nếu không có dãy con nào thỏa mãn thì ghi 0)

Ví dụ:

Thuật toán: Tương tự bài toán ví dụ (của dạng 1) chỉ thay điều kiện:

a[i+1]>a[i] Áp dụng cách 3 là tối ưu hơn cả

 Code tham khảo:

{Sử dụng phương pháp quy hoạch động}

Program Daycontang;

Const fi='daycontang.inp'; fo='daycontang.out';

Var a,cs,f:array[0 10001] of longint; dmax,i,n,j:integer; k:longint;

Ngày đăng: 17/10/2017, 09:30

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w