1. Trang chủ
  2. » Luận Văn - Báo Cáo

CÁC DẠNG BÀI VỀ DẠY CON VÀ HƯỚNG GIẢI QUYẾT

69 2,8K 46

Đ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 69
Dung lượng 613 KB

Nội dung

Để góp phần giúp các em vận dụng linh hoạt và nhiều hơn nữa các phương phápthiết kế thuật toán vào giải các bài tập cụ thể, phổ biến như các dạng bài tập về dãycon của học sinh chuyên ti

Trang 1

CÁC DẠNG BÀI VỀ DÃY CON

VÀ HƯỚNG GIẢI QUYẾT

Tác giả: TRẦN THỊ THANH HUYỀN Trình độ chuyên môn: Thạc sỹ Tin học Chức vụ: Giáo viên

Nơi công tác: Trường THPT chuyên Lê Hồng Phong

Nam Định, 6/6-2015

Trang 2

1 Tên sáng kiến: CÁC DẠNG BÀI VỀ DÃY CON VÀ HƯỚNG GIẢI QUYẾT

2 Lĩnh vực áp dụng: Giảng dạy trong môn Tin cho học sinh khối chuyên Tin, đội

tuyển HSG đồng bằng Bắc bộ khối 10, khối 11, bồi dưỡng đội tuyển HSG Quốc gia

Nơi thường trú: 2/24/131 TRẦN THÁI TÔNG- TP NAM ĐỊNH

Trình độ chuyên môn: Thạc sỹ Tin học

Chức vụ công tác: Giảng dạy bộ môn Tin học

Nơi làm việc: Trường THPT chuyên Lê Hồng Phong- Tp Nam Định

Trang 3

BÁO CÁO SÁNG KIẾN

I ĐIỀU KIỆN HOÀN CẢNH TẠO RA SÁNG KIẾN

Một công việc quen thuộc của giáo viên khi giảng dạy Tin trong các lớpchuyên đó là: bên cạnh việc thường xuyên phải hệ thống lại các dạng bài tập, lựachọn các dạng bài phù hợp để học sinh rèn kỹ năng cài đặt bài tập sau khi đã đượctrang bị về lý thuyết thì một mục tiêu tối quan trọng là phân loại và phát hiện năngkhiếu về môn chuyên của học sinh

Trong quá trình khai thác các dạng bài tập để dạy học và tự nghiên cứu, tôi gặp phảirất nhiều dạng bài tập liên quan đến “dãy con” và nhận thấy chúng rất đa dạng và ởnhiều mức độ khác nhau: từ dễ đến khó Để giải quyết các bài toán về “dãy con” này

có thể phải vận dụng linh hoạt các chiến lược thiết kế thuật toán như: quay lui - vétcạ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 Đây cũng là những phương phápthiết kế thuật toán mà học sinh chuyên cần phải được rèn luyện nhiều khi làm bàitập

II MÔ TẢ GIẢI PHÁP

1 Mô tả giải pháp trước khi tạo ra sáng kiến

Trước đây, khi ôn tập cho học sinh chuyên Tin và dạy các đội tuyển, tôi đãđưa ra một số bài tập nói trong tài liệu này song đưa ra một cách riêng lẻ, không có

hệ thống và theo từng chuyên đề thuật toán Ví dụ: Đa số các bài về dãy con thường

có cách giải bằng phương pháp Quy hoạch động nên chúng có trong phần ví dụ ápdụng của chuyên đề về Quy hoạch động Tuy nhiên các bài toán về ”dãy con” rất đadạng, nhiều thể loại, có thể có nhiều phương pháp giải khác nhau Vì vậy, tôi thiếtnghĩ: cần phải hệ thống hóa lại các bài tập liên quan đến xử lý “dãy con” và phânloại chúng thành các dạng cụ thể để qua đó học sinh có thể rút ra được phương phápgiải quyết phù hợp với từng dạng bài

2.Mô tả giải pháp sau khi có sáng kiến

Trang 4

Để góp phần giúp các em vận dụng linh hoạt và nhiều hơn nữa các phương phápthiết kế thuật toán vào giải các bài tập cụ thể, phổ biến như các dạng bài tập về dãycon của học sinh chuyên tin cũng như góp phần xây dựng kho bài tập bồi dưỡng

HSG các cấp, trong tài liệu này tôi xin được trình bày vấn đề “ Các dạng bài toán

về dãy con và hướng giải quyết”

NỘI DUNG A.Một số khái niệm

Cho một dãy N số nguyên A=(A1, A2, …, AN)

Ví dụ: A= (8 6 5 2 6 4 9) với N=7

+ Dãy con của một dãy A cho trước là một dãy thu được bằng cách xóa đi một số

phần tử của dãy A, các phần tử còn lại vẫn giữ đúng thứ tự Mỗi dãy số là dãy concủa chính nó Dãy rỗng là dãy con của mọi dãy bất kỳ

Ví dụ: Dãy ( 6 5 4 9) là dãy con của A

+ Đoạn con (dãy đoạn con) của một dãy A cho trước là một dãy các phần tử liên

- Các thuật toán nâng cao: tìm kiếm nhị phân, sắp xếp nhanh, trộn mảng, thuật toánsinh hoán vị, thuật toán loang, xử lý bit

- Các phương pháp thiết kế thuật toán: duyệt-vét cạn, quay lui, quy hoạch động

B Các dạng bài tập

Dạng 1: Dãy con tăng dần (giảm dần) dài nhất (ngắn nhất)

Trang 5

Bài 1 Đoạn con tăng dần dài nhất

Cho dãy gồm N số nguyên Tìm đoạn con tăng dần có chiều dài lớn nhất

Dữ liệu vào: tệp văn bản DAYCON.INP

Dòng thứ nhất: số tự nhiên N, 1 ≤ N ≤ 20000

Từ dòng thứ hai trở đi: các phần tử của dãy

Dữ liệu ra: tệp văn bản DAYCON.OUT

Chứa một dòng duy nhất gồm hai số tự nhiên

d – chỉ số đầu đoạn và L – số phần tử trong

đoạn (chiều dài đoạn)

Trong các tệp, dữ liệu trên cùng dòng cách

nhau qua dấu cách

Giải thích : Đó là dãy con 1 3 3 3 5 7 9

Trang 6

if (MaxLen < i - iLeft) then

Bài 2 Đoạn đơn điệu dài nhất

Cho dãy gồm N số nguyên Tìm đoạn đơn điệu (không giảm hoặc không tăng)

có chiều dài lớn nhất

Trang 7

Dữ liệu vào: tệp DONDIEU.INP

Dòng thứ nhất: số tự nhiên N,

1≤N≤ 20000

Từ dòng thứ hai trở đi: các phần tử của dãy

Dữ liệu ra:tệp văn bản DONDIEU.OUT

Chứa một dòng duy nhất gồm hai số tự

nhiên d là chỉ số đầu đoạn và L là số

phần tử trong đoạn (chiều dài đoạn)

Thuật toán

Nhận xét:

Đoạn có 1 phần tử là đoạn đơn điệu (tăng, giảm),

Đoạn gồm một dãy liên tiếp các phần tử bằng nhau là đoạn đơn điệu (tăng, giảm)

Ta dùng hai biến đếm các phần tử tăng hoặc bằng nhau liên tiếp: dt và đếm các phần

tử giảm hoặc bằng nhau liên tiếp: dg

- Nếu ai = ai − 1 ta tăng đồng thời dt và dg 1 đơn vị Nếu ai > ai − 1 ta tăng dt thêm 1đơn vị và đặt lại dg = 1

- Nếu ai < ai − 1 ta tăng dg thêm 1 đơn vị và chỉnh lại dt = 1 Sau mỗi bước ta cậpnhật đoạn đơn điệu dài nhất tìm được

iMax, MaxLen: longint;

function Max(a,b,c: longint): longint;

Trang 9

Bài 3 Chuỗi ốc

Biển Đà Nẵng được nhiều du khách biết đến như một trong những điểm nghỉ ngơi lýtưởng và được tạp chí Forbes (Mỹ) bình chọn là một trong những bãi biển đẹp nhấtthế giới Các bãi tắm có độ dốc lớn, nước trong xanh thích hợp cho những du kháchmuốn thưởng thức các loại hình dịch vụ giải trí nghỉ dưỡng,

câu cá, lướt ván, lặn ngắm san hô, du thuyền, Trong một đợt đi du lịch ở Đà Nẵng,sáng sớm DONG3D thường đi dạo dọc bờ biển và nhặt những vỏ ốc rồi xâu chúnglại thành một chuỗi Nguyên tắc tạo chuỗi ốc của DONG3D như sau: Ban đầu từchuỗi rỗng, không có vỏ ốc; khi gặp một vỏ ốc mới, có thể lấy để xâu vào một tronghai đầu của chuỗi hoặc hoặc bỏ đi không lấy; cuối cùng nhận được một chuỗi vỏ ốc

mà tính từ đầu chuỗi đến cuối chuỗi, các vỏ ốc có kích thước tăng dần và gồm càngnhiều vỏ ốc càng tốt

lượt gặp khi đi dọc bờ biển, hãy tìm cách nhặt và xâu chuỗi để được chuỗi gồmnhiều vỏ ốc nhất

Dữ liệu: Vào từ file BEADS.INP

Dòng 1 chứa số nguyên dương N ≤ 105

Dòng 2 chứa N số nguyên dương a1, a2,…, an

(∀i: ai≤ 109) cách nhau bởi dấu cách

Kết quả: Ghi ra file BEADS.OUT một số nguyên duy nhất là số lượng vỏ ốc trong

chuỗi tạo được

Thuật toán:

- Tìm dãy con tăng dài nhất F[i] với i là phần tử đầu tiên

- Tìm dãy con giảm dài nhất F2[i] với i là phần tử đầu tiên

- Kết quả cần tìm của bài toán chính là max(F[i]+F2[i]-1);

Trang 11

Bài 4 Chỉnh dãy số

Cho một dãy N số nguyên dương không quá 109 Có thể giữ nguyên hoặc bỏ khôngquá một đoạn liên tiếp các số trong dãy Hãy thực hiện một trong hai cách trên saocho dãy số thu được có độ dài đoạn liên tiếp tăng dần là lớn nhất

Ví dụ : - Với dãy 1 2 3 1 4 5 sẽ chỉ có cách bỏ số 1 thứ hai trong dãy đi để thu đượcdãy mới có độ dài đoạn con liên tiếp tăng dần là 5

- Với dãy 1 3 4 6 ta không cần bỏ số nào đi

Dữ liệu vào từ file CDS.INP

- Dòng 1 : số nguyên T≤25 là số bộ

test

- T nhóm dòng sau: mỗi nhóm gồm 2

dòng Dòng đầu ghi số nguyên N,

dòng sau ghi N số nguyên là các số

trong dãy theo thứ tự từ trái qua phải

Kết quả ghi ra flie CDS.OUT chứa độ dài đoạn con liên tiếp tăng dần lớn nhất cóthể thu được

Thuật toán :

Gọi L[i] là độ dài dãy dài nhất các số liên tiếp tăng dần kết thúc tại A[i]

R[i] là độ dài dãy dài nhất các số liên tiếp tăng dần bắt đầu tại A[i]

R và L tính được nhờ thuật toán quy hoạch động Ta phải tìm giá trị cực đại của tổngL[i]+R[j] sao cho i ≤ j và A[i]<A[j]

Xét hàm Find(L,R) để tìm giá trị Max của L[i]+R[j] với A[i]<A[j] và L≤ i <j≤ R

Ta chia đoạn [L,R] thành hai đoạn con [L,m] và [m+1,R] với m=(L+R) div 2

Xét trường hợp :

+ Nếu i và j cùng thuộc một trong hai đoạn con này, giá trị max của L[i]+R[j] có thểtính được nhờ thủ tục find(L,m) và find(m+1,R)

+ Nếu i thuộc đoạn con thứ nhất và j thuộc đoạn con còn lại, ta áp dụng Merge sort

để sắp xếp lại các A trong đoạn từ [L,R] tăng dần sau mỗi lần gọi find(L,R)

29

5 3 4 9 2 8 6 7 17

1 2 3 10 4 5 6

46

Trang 12

Từ đó với mỗi i∈[L,m] ta có thể tìm kiếm nhị phân ra j∈[m+1,R] tương ứng sao choA[j] nhỏ nhất lớn hơn A[i] và tìm ra được giá trị lớn nhất của tổng L[i]+R[i]

for i:=y- 1 downto m+1 do

f[i]:= max(r[c[i]], f[i+1]) ;

v:= m+1 ;

for i:=x to m do

Begin

While (v<y) and a[c[v]]<=a[c[i]] do inc (v) ;

If a[c[v]]>a[c[i]] then res:=max(res,l[c[i]]+f[v]) ; End ;

//tron 2 doan da sap xep

Trang 13

d[i] :=c[v] ; inc(v) ; end ;

for i := x to y do c[i] :=d[i] ;

//sap xep c theo chieu tang dan cua a[c[i]]

//ket hop tinh gia tri cuc dai cua res

Trang 14

Từ dòng thứ hai trở đi: các phần tử của dãy.

Dữ liệu ra: tệp văn bản TDOAN.OUT

Chứa một dòng duy nhất gồm hai số tự nhiên d – chỉ số đầu đoạn và L – sốphần tử trong đoạn (chiều dài đoạn) Nếu vô nghiệm thì ghi 0 0

Trong các tệp, dữ liệu trên cùng dòng cách nhau qua dấu cách

Thu ật toán

a[i j] với tồng S = a[i] + a[i+1] + … + a[j], i ≤ j Ta cho đoạn này dịch dần sang phải

và xét ba tình huống sau đây

dài LMin thì ta cập nhật lại các giá trị iMin và Lmin (thủ tục Update) Rồi tiếp tụcxét đoạn con mới là a[i+1 j]

+ S < K: Ta dịch từ j sang j+1, giữ nguyên đầu i (thủ tục Right)

21 17

0 2 3 2 10 1 5 5 6 12 20 30 14 8 0 11 0 6 0 0 5

16 3

Trang 15

sum := sum - a[iLeft]; iLeft := iLeft + 1;

if (iLeft > iRight) then

begin iRight := iLeft; sum := a[iLeft]; end;

Trang 16

begin iMin := iLeft; LMin := iRight - iLeft + 1; end;

Left;

end;

procedure XuLi;

begin

iLeft := 1; iRight := iLeft;

LMin := n + 1; sum := a[1];

repeat

if (sum = k) then Update

else if (sum < k) then Right

else { sum > k } Left;

Bài 6 Dãy con dài nhất tổng chia hết cho k

Cho một dãy số nguyên gồm N phần tử a1 , a2, , aN và một số nguyên k Giảthiết dãy cho luôn luôn tồn tại một dãy con có tổng các phần tử chia hết cho k

Yêu cầu : Hãy tìm dãy con có nhiều phần tử nhất có tổng các phần tử chia hết cho k.

Dữ liệu vào: Ghi trong file text, tên file là CK.INP gồm 2 dòng:

- Dòng đầu ghi 2 số nguyên N và k ( 0<N< 1000; 0< k <1000)

- Dòng tiếp theo ghi N số nguyên ai (0<ai ≤ 5000, i =1, ,N)

Dữ liệu ra : Ghi ra file text, tên file là CK.INP , gồm:

- Dòng đầu ghi độ dài dãy con tìm được

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

- Dòng cuối cùng ghi tổng các phần tử của dãy con đó

Trang 17

Thuật toán tương tự bài 5 (tình huống 1) ở trên

Bài 7 SUBSEQ

Cho dãy N số nguyên a1, a2, , aN và số nguyên dương K

Yêu cầu: Tìm đoạn con liên tiếp không ít hơn K số nguyên trong dãy sao cho tổng

các số nguyên thuộc đoạn là lớn nhất

Dữ liệu: Cho trong tệp SUBSEQ.INP, gồm có:

- Dòng đầu chứa hai số nguyên N và K, trong đó N là số lượng các số nguyên trongdãy và K là số lượng tối thiểu các số nguyên liên tiếp của một đoạn con

Kết quả: Ghi ra tệp SUBSEQ.OUT một số nguyên P, cho biết tổng các giá trị đoạn

con tìm được theo yêu cầu

125

120

Trang 18

+ Ý tưởng Quy hoạch động:

Trang 20

≤10) Khi dừng lại ở 1 ô nào đó thì giá trị của ô đó sẽ được cộng vào tổng điểm.Bạn có thể dừng cuộc chơi bất cứ lúc nào Hãy tìm cách chơi sao cho tổng điểmnhận được là nhiều nhất.

Dữ liệu : vào từ file AMMSEQ.INP

- Dòng đầu tiên chứa 2 số N, K Với N ≤ 10000; K ≤ 10

- Dòng thứ 2 chứa N số của dãy, mỗi số cách

nhau 1 dấu cách Mỗi số nằm trong khoảng

[-1000, 1000]

Kết quả: Ghi ra file AMMSEQ.OUT

Gồm một dòng duy nhất là Số điểm lớn nhất có thể đạt được

Giải thích:

- Ta có thể đi theo thứ tự 0 -> 2 -> 4 -> 5 Số điểm đạt được là 0 + 3 – 4 + 5 = 4

Thuật toán:

- Sử dụng phương pháp Quy hoạch động

- Gọi F[i] là giá trị lớn nhất đạt được khi đến vị trí i

Khởi tạo: F[1]=max(0,a[1]);

Ta có công thức tổng quát F[i]=max(F[i], F[i-j]+a[i]) với i:2 n, j: 1k

4

Trang 21

Cho dãy N số nguyên a1, a2, , aN

Yêu cầu: Hãy tìm ra k số nguyên trong dãy sao cho tích các số nguyên đó là lớn

nhất

Dữ liệu: Cho trong tệp TLN.INP, gồm có:

- Dòng đầu chứa hai số nguyên N và K, trong đó N là số lượng các số nguyên trongdãy và K là số lượng các số nguyên thỏa đầu bài

- dòng tiếp theo chứa N số nguyên ai

Kết quả: Ghi ra tệp TLN.OUT k số nguyên tìm

được theo yêu cầu

Thuật toán:

- Sắp xếp giá trị tuyệt đối của các số theo thứ tự lớn đến bé

- Xét thấy nếu có 2 số âm thì cho 2 số âm đó thành dương

Trang 23

Bài 10 Trò chơi băng số

Trò chơi với băng số là trò chơi tham gia trúng thưởng được mô tả như sau: Có một

băng hình chữ nhật được chia ra làm n ô vuông, đánh số từ trái qua phải bắt đầu từ 1.

chơi, người tham gia trò chơi được quyền lựa chọn một số lượng tùy ý các ô trên

băng số Giả sử theo thứ tự từ trái qua phải, người chơi lựa chọn các ô i 1 , i 2 , , i k.Khi đó điểm số mà người chơi đạt được sẽ là:

• ai1 - ai2 + + (-1)k-1aik

Yêu cầu: Hãy tính số điểm lớn nhất có thể đạt được từ một lượt chơi.

Dữ liệu:BANGSO.INP

• Dòng thứ hai chứa n số nguyên dương a1, a2, , an ( ai ≤ 104, i = 1, 2, , n )ghi trên băng số Các số liên tiếp trên cùng dòng được ghi cách nhau bởi ítnhất một dấu cách

Gọi F[i] là giá trị lớn nhất khi xét tới số thứ i, và có thể đặt dấu + trước số đó

Gọi G[i] là giá trị lớn nhất khi xét tới số thứ i, và có thể đặt dấu - trước số đó

Ta có F[i] = max(F[i-1], G[i-1] + a[i]);

G[i] = max(G[i-1], F[i-1] - a[i]) với i:1n

Kết quả bài toán chính là max(f[n],g[n]);

BANGSO.INP BANGSO.OUT

7

4 9 2 4 1 3 7

17

Trang 24

Bài 11 Dãy con Fibonacci

một đoạn con tạo thành dãy Fibonacci dài nhất.

Dữ liệu vào: Cho trong file văn bản DAYF.INP có cấu trúc:

Trang 25

- Sử dụng phương pháp duyệt toàn bộ

- Xây dựng chương trình con kiểm tra một dãy đảm bảo tính chất là dãy Fibonacci,

nghĩa là nếu một dãy d có y phần tử thì dãy đó có đặc điểm :

Trang 26

Bài 12 Dãy biến động

Dãy b1, b2, b3,…bm gọi là dãy biến động nếu các xét 3 phần tử liền nhau bất kì trongdãy bi,bj,bk (k=j+1, j=i+1,i≥1,k≤m) ta luôn có bi <bj >bk hoặc bi > bj <bk

Ví dụ: dãy 1,5,2,8,3 là dãy biến động; dãy 6,2,7,1,9 là dãy biến động

Cho dãy số gồm n phần tử Tìm đoạn con trong dãy a là dãy biến động có độ dài

lớn nhất

Dữ liệu vào: nhập vào tệp BD.INP:

- Dòng đầu tiên là số nguyên n (3<=n<=100000);

- Dòng tiếp theo nhập n số nguyên a[i] (i:1n, 0<=a[i]<=1000000)

Nếu không tìm được dãy cần tìm thì in ra số 0

Kết quả: xuất ra tệp BD.OUT:

Dòng đầu tiên là số nguyên d là số lượng phần

tử của dãy biến động tìm được

6

6 6 2 7 1 9

5

Trang 27

Thuật toán:

- Phương pháp Duyệt vét cạn

Ta sẽ xét lần lượt các đoạn con thỏa điều kiện dãy biến động rồi so sánh độ dài

- Sử dụng biến ‘dau’ để lưu cách xét: dau=0 thì a[i]>a[i+1]; dau=1 thì a[i]<a[i+1]

- Xét với từng đoạn bắt đầu tại vị trí i (với i chạy từ 1 đến N-1) và kết thúc là vị trí

mà khi thêm phần tử đó vào làm đoạn con không còn là dãy biến động nữa

- So sánh độ dài các đoạn con đó và tìm ra max

if a[i]>a[i+1] then dau:=1

else if a[i]=a[i+1] then dau:=-1;

k:=i; kt:=true;

if dau<>-1 then

while (kt) and (k<n) do

begin

if (dau=0) and (a[k]<a[k+1]) then dau:=1

else if (dau=1) and (a[k]>a[k+1]) then dau:=0

else kt:=false;

k:=k+1;

end;

Trang 28

if k-i+1>max then max:=k-i+1;

end;

writeln(g,max);

close(f); close(g);

end.

Bài 13 Dãy con nguyên tố

Cho một dãy N số nguyên a[1], a[2], , a[N] (N<=5000; a<= a[i] <= 5000).Hãy tìm một dãy con gồm nhiều nhất các phần tử của dãy đã cho mà tổng hai phần

tử liên tiếp là số nguyên tố

Dữ liệu vào từ tệp văn bản

NGTO.INT có cấu trúc:

- Dòng đầu là số N

- Các dòng còn lại chứa các phần tử của dãy, mỗi phần tử các nhau một khoảngtrắng Mỗi dòng chứa 100 phần tử ( dòng cuối có thể ít hơn) theo trình tự từ trái qua phải,

từ trên xuống dưới

Kết quả đưa ra tệp văn bản NGTO.OUT, dòng đầu chứa số lượng của dãy condài nhất, các dòng còn lại chứa chỉ số của phần tử dãy con dài nhất theo trình tự.Mỗi dòng chứa 100 phần tử (dòng cuối có thể ít hơn) theo trình tự từ trái qua phải, từtrên xuống dưới (Nếu không có dãy con thỏa mãn yêu cầu thì xuất ra câu “Khong coday con”

Thuật toán:

- Tạo chuơng trình con kiểm tra 1 số có phải là số nguyên tố hay không

- Dùng phuơng pháp quy hoạch động để tìm dãy thỏa mãn yêu cầu đề bài có độ dàidài nhất

- Dùng phương pháp đệ quy để truy vết chỉ số của các phần tử trong dãy và in ratheo yêu cầu đề bài

Trang 29

function snt(x:longint):boolean;

var k:longint;

begin

if x<2 then exit(false)

else for k:=2 to round(sqrt(x)) do

if x mod k=0 then exit(false);

Trang 30

Bài 14 Dãy con tăng nguyên tố

Cho 1 dãy N số nguyên dương Dãy con tăng nguyên tố M phần tử là 1 dãy số códạng Ai1; Ai2; Ai3; …; Aim và thỏa điều kiện:

i) 1 <= i1 < i2 < i3 < … < im <= n

ii) Ai1 <= Ai2 <= Ai3 <= … <= Aim

iii) Ai là số nguyên tố

Yêu cầu: Cho trước một dãy số, hãy tìm độ dài của dãy con tăng nguyên tố dài nhất.

Dữ liệu nhập: vào từ file DTNT.INP với định dạng như sau:

- Dòng đầu tiên là số N <= 1000 (tức là số phần tử của dãy số ban đầu)

- Các dòng tiếp theo chứa N số nguyên là giá trị các phần tử của dãy số(0<=A[i]<=100000)

Dữ liệu xuất: xuất ra file

DTNT.OUT:

- Số đầu tiên là số M tức phần tử của dãy con tăng nguyên tố dài nhất

- M dòng sau ghi ra giá trị các phần tử của dãy con tăng dài nhất

Thuật toán:

Thuật toán tương tự bài trên nhưng kết hợp thêm phần tìm dãy con tăng dài nhất Bài này trình bày phương pháp khác để kiểm tra tính nguyên tố của một số - phươngpháp sàng ( thêm phần phong phú)

Trang 32

if (nto[a[i]]) and (nto[a[j]]) and (a[i]>=a[j]) and (b[i]<=b[j]+1) then

Bài 15 Dãy con nguyên tố cùng nhau

dãy con gọi là “dãy con nguyên tố” nếu hai phần tử bất kì nằm cạnh nhau trong dãycon đó đều nguyên tố cùng nhau (Hai số nguyên tố cùng nhau là hai số có ƯCLNbằng 1)

Viết chương trình tìm một dãy con nguyên tố dài nhất

Dữ liệu vào: được ghi lên file có tên là DNTCN.INP có dạng

- Dòng đầu tiên ghi số N

một dấu cách và nhỏ hơn hoặc bằng 32000

Dữ liệu ra: được ghi lên file có tên là DNTCN.OUT gồm hai dòng:

- Dòng đầu ghi số phần tử của dãy con nguyên tố dài nhất

- Dòng thứ hai ghi dãy con tìm được hoặc để trống nếu dãy có độ dài bằng 0

Trang 33

Thuật toán:

- Gọi B[i] là độ dài dãy con nguyên tố dài nhất kết thúc tại a[i]

+ B[1]:=1;

+ B[i]:=max(b[j])+1 (nếu ucln(a[i],a[j])=1) với j:1i-1

 Kết quả bài toán: max(b[i]) với i:1n

if x mod y=0 then ucln:=y

else ucln:=ucln(y,x mod y);

Trang 34

Bài 16 Dãy con chia hết hoàn toàn

Ta gọi một dãy chia hết hoàn toàn là dãy a[1], a[2], , a[N] với a[j] chia hết cho a[i]với i < j Ví dụ: 3, 15, 60, 720 là một dãy chia hết hoàn toàn; 3, 7, 11, 3 là một dãycon của dãy 6, 3, 11, 5, 7, 4, 3, 11, 5, 3 nhưng 3, 3, 7 không phải là một dãy con củadãy 6, 3, 11, 5, 7, 4, 3, 11, 5, 3

Yêu cầu: Cho một dãy các số nguyên, tìm dãy con chia hết hoàn toàn có độ dàilớn nhất trong dãy đã cho

Dữ liệu vào: Cho trong file văn bản DCHHT.INP có cấu trúc:

- Dòng đầu chứa số N là độ dài của dãy (0 < N ≤ 10000)

Ngày đăng: 13/03/2016, 00:55

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

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

TÀI LIỆU LIÊN QUAN

w