Tuyển tập các bài toán olympic lập trình doc

124 535 1
Tuyển tập các bài toán olympic lập trình doc

Đ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

VIETBOOK Trang 1 Olimpic lập trình I.1. Các bài toán Olimpic Trong Olimpic Tin học Mat-Xcơ-va, ngời ta ra cho học sinh phổ thông một số nhóm bài toán. Số các bài toán dao động từ 5 đến 11 bài. Các bài toán luôn luôn có mức điểm khác nhau, xếp theo trật tự dễ dần và khi tính điểm chỉ lấy 3 lời giải tốt nhất. Các thí sinh đợc báo trớc tất cả những điều này. Những bài đầu tiên có thể là khá khó, còn những bài cuối cùng mang tính chất khích lệ. Kỳ thi kéo dài 4 giờ, lời giải có thể viết trên bất kỳ ngôn ngữ nào. Trớc khi giải nhất thiết phải viết thuật giải bằng lời. Điều này làm cho việc đọc chơng trình dễ dàng. Tính rõ ràng của thuật toán, việc tiết kiệm số các thao tác, tính ngắn gọn của chơng trình đợc cho thêm điểm, còn việc lập trình sử dụng mảng thừa và có lỗi bị hạ thấp điểm. Trong phát biểu các bài toán và trình bày thuật toán qui ớc dùng các ký hiệu sau đây: Các mảng A 1 , A 2 , A n đợc ký hiệu là A[1:n] với A[i] là các phần tử của nó. Cũng nh vậy kí hiệu A[1:m,1:n] và A[i,j] cho mảng hai chiều v.v Số lợng các phần tử của mảng và chỉ số các phần tử của mảng là các số tự nhiên, còn lại là các số thực ( nghĩa là số với dấu phẩy động), nếu không có ớc định nào khác. Nếu ở đầu bài nói rằng Cho mảng A[1:n] thì học sinh cần viết chơng trình tự nhập số n, tạo mảng n phần tử và nhập giá trị của các phần tử này. Nếu trong ngôn ngữ ( Ví dụ ngôn ngữ Pascal ) không có mảng động, thì cần chấp nhận n<100 và lập mảng 100 phần tử, nhng chỉ nhập giá trị cho n phần tử cho trớc. Cũng nh thế đối với mảng 2 chiều và nhiều chiều hơn. Tuy nhiên thí sinh đợc phép giả thiết phần chơng trình đợc viết là một phần của chơng trình bao nó trong đó mảng đã đợc tạo lập và các phần tử của mảng đã đợc nạp từ trớc. Nhng thí sinh cần nói rõ điều này. Tất cả các câu trả lời đều phải đợc đa ra màn hình hoặc máy in. Một lần nữa cần nhấn mạnh rằng lời giải phải là chơng trình, không thể thay chơng trình bằng bất cứ lập luận nào. Olimpic 80 Các thí sinh đợc giao 11 bài chia làm 3 nhóm. Các nhóm đợc sắp xếp theo thứ tự dễ dần, trong một nhóm các bài toán đợc tính điểm nh nhau. Từ mỗi nhóm lấy không quá một bài để tính điểm thi. 80.1.1 . Các số nguyên tố không vợt quá M Hãy in ra tất cả các số nguyên tố không vợt quá số M cho trớc. 80.1.2. Hoán vị : Cho trớc mảng A[1:n], chứa các số khác nhau từng đôi một. Hãy in ra toàn thể các hoán vị của các số đó. 80.1.3 . Nâng lên luỹ thừa nhanh : Nạp số thực A và số tự nhiên k. Hãy tính và in ra A k với điều kiện sau đây: Không đợc sử dụng phép tính nâng lên luỹ thừa, k đủ lớn để không thể thực hiện k phép nhân. 80.1.4. Các phép tính số học : Trong biểu thức (((( 1 ? 2 ) ? 3 ) ? 4 ) ? 5 ) ? 6 . Hãy thay các dấu ? bằng một trong các phép tính số học +, -, *, / sao cho kết quả tính đợc là 35( khi chia phần d đợc bỏ đi) Chỉ cần tìm một lời giải. 80.2.1 . Tìm kiếm các phần tử bằng nhau : Cho mảng A[1:2,1:15], có chứa đúng hai phần tử bằng nhau. Hãy in ra chỉ số của hai phần tử đó. tungvn40@yahoo.com tungvn40@yahoo.com PDF processed with CutePDF evaluation edition www.CutePDF.comPDF processed with CutePDF evaluation edition www.CutePDF.com CM Soft 70 NCT F2 Q10 CM Soft 70 NCT F2 Q10 PDF processed with CutePDF evaluation edition www.CutePDF.comPDF processed with CutePDF evaluation edition www.CutePDF.com VIETBOOK Trang 2 80.2.2 Tổng bình phơng Có thể viết số tự nhiên M cho trớc dới dạng tổng các bình phơng của hai số tự nhiên hay không ? Hãy viết chơng trình giải bài toán này. 80.2.3 Các số khác nhau Cho trớc mảng số A[1:m]. Tìm và in ra số các số khác nhau trong mảng này. Ví dụ trong mảng 5,7,5 có hai số khác nhau ( 5 và 7 ). 80.3.1 Số có tổng các chữ số cho trớc Viết chơng trình in ra tất cả các số ở hệ cơ số 10 có ba chữ số mà tổng các chữ số bằng một số tự nhiên cho trớc. 80.3.2 M + 1 ở hệ nhị phân Số nguyên không âm M đợc cho bởi mảng các chữ số nhị phân là a 0 , a 1 , a 2 , a n-1 : M = a n- 1 .2 n-1 + + a 1 .2 + a 0 Trong đó a i bằng 0 hoặc 1 ( i = 0,1,2, n-1 ) Hãy viết mảng các chữ số nhị phân của M+1. 80.3.3 Cực đại của các cực tiểu : Trong mảng X[1:m,1:n] tất cả các số khác nhau. ở mỗi dòng tìm một phần tử nhỏ nhất, sau đó trong số này chọn ra số lớn nhất. Hãy in ra chỉ số của dòng của mảng X chứa số đã đợc chọn. 80.3.4. Hoán vị 0, 1, 2. Trong mảng X[1:n] mỗi phần tử bằng 0, 1 hoặc 2. Hoán vị các phần tử của mảng, sao cho đầu mảng chứa các số 0, sau đó là các số 1 và cuối mảng là các số 2 ( không đợc dùng mảng phụ ). Olimpic 81 Các thí sinh đợc giao 5 bài toán sắp xếp theo thứ tự dễ dần. Chỉ đợc tính điểm 3 bài. 81.1 Hàm số : Hàm số f(n) với các số n nguyên không âm đợc xác định nh sau : f(0) = 0 , f(1) = 1 , f(2n) = f(n) , f(2n+1) = f(n) + f(n+1). Với N cho trớc xác định và in ra f(N). Điều kiện bắt buộc : N đủ lớn để không thể mảng gồm N phần tử ( hoặc khai báo mảng có chiều dài tăng theo N ). 81.2. Cặp bốn số . Hãy nạp số n và lấp đầy mảng hai chiều kích thớc n 2 bằng các số 1, 2, 3, theo hình xoắn ốc ( hình vẽ ). 81.3. Các số lập từ các chữ số khác nhau: In ra tất cả các số tự nhiên có 4 chữ số mà biểu diễn ở hệ thập phân của chúng không có hai chữ số nào giống nhau. 81.5 Loạt các số không. tungvn40@yahoo.com tungvn40@yahoo.com CM Soft 70 NCT F2 Q10 CM Soft 70 NCT F2 Q10 VIETBOOK Trang 3 Cho mảng số A[1:n] . Hãy tìm độ dài của dãy con lớn nhất gồm các phần tử liên tiếp toàn số không. Olimpic 82 Các thí sinh đợc giao 6 bài toán theo trật tự dễ dần. Chỉ tính điểm 3 bài. 82.1 Hình chữ nhật . Trên giấy kẻ ô khổ 100 x 100 ô, có vẽ một số hình chữ nhật. Mỗi hình chữ nhật đợc tạo từ các ô nguyên vẹn, các hình khác nhau không chồng lên nhau và không tiếp xúc nhau. ( hình 1.2 ) Cho mảng kích thớc 100 x 100, trong đó phần tử A[i,j] = 1 nếu ô [i,j] thuộc một hình chữ nhật nào đó, còn A[i,j] = 0 trong trờng hợp ngợc lại. Hãy viết chơng trình tính và in ra số các hình chữ nhật. 82.2 Các phân số đợc sắp thứ tự In theo trật tự tăng dần tất cả các phân số tối giản trong khoảng (0, 1) có các mẫu số không vợt quá 7. 82.3 Tổng theo tập con : Cho trớc mảng số nguyên A[1: n] và số M . Tìm tập hợp các phần tử A[i 1 ], A[i 2 ], A[i k ] 1<=i 1 <=i 2 <= <=i k <= <=i n sao cho A[i 1 ] + A[i 2 ] + +A[i k ] = M Giả thiết rằng tập hợp này tồn tại. 82.4 Những chữ số không ở cuối . Cho trớc mảng một chiều. Hãy viết lại mảng sao cho tất cả các phần tử khác không nằm ở đầu mảng, các phẩn tử bằng không ở cuối mảng và vẫn giữ nguyên trật tự trớc sau của các phần tử, không đợc thiết lập một mảng mới 82.5 Điểm yên ngựa : Cho trớc mảng số A[1:m,1:n]. Ta gọi một phần tử của mảng này là điểm yên ngựa nếu nó đồng thời là phần tử nhỏ nhất trên dòng chứa nó và lớn nhất trên cột chứa nó. Hãy in số thứ tự của dòng và cột của một điểm yên ngựa nào đó và in ra số không nếu không có điểm nh vậy. 82.6 Từ trong một văn bản : Cho trớc hai mảng số nguyên X[1:n], Y[1:k]. Có thể lựa chọn đợc hay không trong mảng thứ nhất k phần tử liền nhau X[i+1], X[i+2], X[i+k] , sao cho X[i+1] = Y[1], X[i+2] = Y[2], , X[i+k] = Y[k]. ? Hãy viết chơng trình giải bài toán này và in ra câu trả lời Có hay Không. tungvn40@yahoo.com tungvn40@yahoo.com CM Soft 70 NCT F2 Q10 CM Soft 70 NCT F2 Q10 VIETBOOK Trang 4 Olimpic 83 Các thí sinh đợc giao 5 bài theo trật tự dễ dần. Chỉ có 3 bài đợc tính điểm. 83.1. Đảo bit : Số nguyên m đợc viết trong hệ cơ số 2 theo trật tự ngợc lại. Số nhận đợc viết trong hệ thập phân, đợc coi là giá trị của hàm B(m). Hãy in giá trị B(m) với m=512,513,514, 1023. Thí dụ, ba giá trị đầu tiên cần in là : 1; 513; 257; 83.2. Hình tam giác và điểm : Cho trớc trong hệ toạ độ vuông góc các điểm (X 1 ,Y 1 ), (X 2 ,Y 2 ),(X 3 ,Y 3 ) là đỉnh của một tam giác và X,Y là toạ độ của một điểm. Hãy xác định xem điểm đó có nằm trong tam giác hay không ( bỏ qua sai số của phép tính) 83.3. Mê cung : Du khách có thể ra khỏi mê cung đợc hay không ? Nếu có thể hãy in đờng đi từ lối ra đến vị trí ban đầu của du khách. Mê cung đợc cho bởi mảng A kích thớc 40 x 40, trong đó : A[k,m] = 0 , nếu ô [k,m] đi qua đợc (ô thông) A[k,m] = 1 , nếu ô [k,m] không đi qua đợc (ô cấm). Vị trí ban đầu của du khách đợc cho ở ô thông [i,j]. Du khách có thể chuyển từ một ô thông này đến ô thông khác nếu chúng có chung cạnh. Du khách đi ra khỏi mê cung nếu rơi vào ô biên giới ( tức là ô [k,m], trong đó k hoặc m bằng 1 hoặc 40 ). 83.4. Cái ca : Cho trớc mảng X[1:m]. Hãy tìm độ dài lớn nhất của dãy liên tiếp các số hình ca (có răng hớng lên trên ) X[p+1] < X[p+2] > X[p+3]< >X[p+k]. 83.5. Rút gọn phân số : Cho trớc các số tự nhiên m và n . Hãy tìm các số m1, n1 nguyên tố cùng nhau và m/n = m1/n1. Olimpic 84 Các thí sinh đợc giao 7 bài theo trật tự dễ dần. Chỉ tính điểm 3 bài. 84.1 Nghịch thế. Giả sử P = (p 1 , ,p n ) là một hoán vị của các số 1,2, ,n. Ngời ta gọi dãy T = (t 1 t n ) là bảng nghịch thế của phép hoán vị P, nếu t i là số lợng các phần tử của phép hoán vị P, nằm ở phía trái i và lớn hơn i. Ví dụ, đối với phép hoán vị P = (5,9,1,8,2,6,4,7,3) của các số 1,2, ,9 thì bảng nghịch thế sẽ là T = (2,3,6,4,0,2,2,1,0). Hãy viết chơng trình sao cho theo bảng nghịch thế cho trớc phục hồi đợc hoán vị ban đầu. 84.2 Con đờng: Cho trớc các số tự nhiên n>=2 và mảng các số thực A[1 : m,1: m,1: n-1]. Hãy tìm giá trị nhỏ nhất của tổng [ R= A]i 1 ,i 2 ,1]+ A[i 2 ,i 3 ,2] + + A[i n-1 ,i n ,i n-1 ] với các bộ số nguyên tố có thể có 1<= i 1 , i 2 in<=m. tungvn40@yahoo.com tungvn40@yahoo.com CM Soft 70 NCT F2 Q10 CM Soft 70 NCT F2 Q10 VIETBOOK Trang 5 Chú ý : Giá trị các số m, n khoảng vài chục, vì thế không chấp nhận lời giải với số thao tác m n 84.3. Những số hoàn thiện. Số tự nhiên đợc gọi là hoàn thiện, nếu nó bằng tổng tất cả các ớc số của nó, kể cả 1. Hãy in tất cả các số hoàn thiện nhỏ hơn số N cho trớc. 84.4 Chu kì của phân số : Nạp các số tự nhiên m và n rồi in chu kì của phân số m/n. Ví dụ : đối với phân số 1/7 sẽ có chu kì ( 142857 ). Nếu phân số hữu hạn thì chu kì bằng 0. 84.5 Trộn các mảng : Cho trớc hai số m, n và hai mảng đã đợc sắp A[1]<=A[2]<= <=A[m] ; B[1]<=B[2]<= <=B[n]. Hãy trộn hai mảng trên để có mảng cũng đợc sắp thứ tự C[1]<=C[2]<= <=C[m+n]. Chỉ dẫn : Chú ý đến số phép tính của chơng trình khi m và n khá lớn. 84.6 Lịch : Cho trớc 3 số A, B, C biểu thị ngày, tháng, năm. Hãy tìm số thứ tự N của ngày trong năm tính từ ngày đầu của năm ấy. Chỉ dẫn : Năm nhuận là năm chia hết cho 400 và những năm chia hết cho 4 nhng không chia hết cho 100. 84.7 . Những hình vuông : Cho trớc mảng A[1:m,1:n] mỗi phần tử của nó bằng 0, 1,5 hoặc 11. Hãy tính số lợng các bộ bốn A[i,j], A[i+1,j], A[i,j+1], A[i+1,j+1] trong đó các phần tử đều khác nhau. Olimpic 85 Các thí sinh đợc giao 7 bài, theo trật tự dễ dần. Chỉ tính vào kết quả 3 bài. 85.1 Dạng tổng : In tất cả các cách viết số tự nhiên N dới dạng tổng các số tự nhiên. Việc đổi chỗ các số hạng không đợc coi là một cách mới. 85.2. Các phần tử bằng nhau : Cho trớc mảng số nguyên A[1:m, 1:n]. Mỗi dòng của mảng đợc xếp theo thứ tự tăng dần, nghĩa là A[i,1] <= A[i,2] với tất cả các i = 1,2,3, ,m. Hãy tìm và in số có mặt ở tất cả các dòng và in ra " Không" nếu số nh vậy không có. 85.3. Số không thể tách đợc . Cho trớc mảng số tự nhiên P[1:n]. Hãy tìm số tự nhiên nhỏ nhất không thể viết dới dạng tổng các phần tử thuộc mảng P. Tổng có thể chỉ gồm một số hạng, nhng mỗi phần tử của mảng chỉ đợc tham gia vào đó một lần. 85.4. Tứ diện. Trên các mặt của hai tứ diện đều bằng nhau M và N có viết các số M 1 , M 2 , M 3 , M 4 và N 1 , N 2 , N 3 , N 4 theo trật tự đã chỉ ra trên hình 1.3 hình 1.3 tungvn40@yahoo.com tungvn40@yahoo.com CM Soft 70 NCT F2 Q10 CM Soft 70 NCT F2 Q10 VIETBOOK Trang 6 Có thể đặt khít các tứ diện sao cho trên các mặt trùng nhau có các số nh nhau hay không ? Hãy in Có hoặc Không tơng ứng với các trả lời tìm đợc. 85.5. Mốt. Tìm số xuất hiện nhiều lần nhất trong mảng số nguyên A[1:n]. Nếu có vài số nh vậy thì lấy một số. 85.6. Hệ đếm. Trong mảng M[1:9] có viết các chữ số của một số tự nhiên trong hệ đếm I. ( M[1] là số hàng đơn vị, v.v). In các chữ số này trong hệ đếm J, bắt đầu từ hàng đơn vị. Các số I, J không vợt quá 10. 85.7. Đờng chéo phụ. Tìm tổng các phần tử A(i,j) của mảng A[1:m,1:n], có hiệu các chỉ số là i-j=k. Chú ý : k có thể là số âm. Olimpic 86 Thí sinh đợc giao 5 bài theo trật tự dễ dần. Chỉ tính điểm 3 bài. 86.1. Không lặp 3 lần . Hãy tìm dãy 50 số 0 và số 1, trong đó không có dãy con lặp lại 3 lần liên tục. Hãy in Không nếu dãy nh không tồn tại. Vĩ dụ : trong dãy tìm đợc không chứa các đoạn 000 hoặc 101010, hoặc 101101101. 86.2. Bài Pô-Cơ. Cho mảng gồm 5 số, trong đó : - Nếu 5 số giống nhau, thì in số 1, nếu không - Nếu có 4 số giống nhau, thì in số 2, nếu không - Nếu có 3 số giống nhau và còn 2 số còn lại cũng giống nhau, thì in số 3, nếu không - Nếu chỉ có 3 số giống nhau, thì in số 4, nếu không - Nếu có 1 cặp số giống nhau thì in số 6, nếu không thì in số 7. 86.3. Cái trống. Theo hình tròn viết 12 số a 1 , , a 12 . Nếu viết chúng từ số hiệu k, thì nhận đợc vec tơ x k = (a k , a k+1 , , a k+11 ) Trong đó a 13 đợc hiểu là a 1 , a 14 đợc hiểu là a 2 Vec tơ x k đợc coi là nhỏ hơn x p , nếu cặp số đầu tiên không bằng nhau sẽ là a k+i < a p+i 86.4. Tính đơn điệu kép. Mảng số A[1:m,1:n] đợc sắp theo dòng nh sau : A[i,1]<=A[i,2]<= với mọi i =1,2,3 m A[1,j]<=A[2,j]<= với mọi j =1,2,3 n Tìm phần tử của mảng bằng số x cho trớc và in ra chỉ số của nó. In Không nếu phần tử nh vậy không có. Điều kiện bắt buộc : lời giải cần có độ phức tạp m+n ( chứ không phải m*n). tungvn40@yahoo.com tungvn40@yahoo.com CM Soft 70 NCT F2 Q10 CM Soft 70 NCT F2 Q10 VIETBOOK Trang 7 86.5. Làng trung tâm . Có k làng. Nếu ở làng i đặt trạm cấp cứu, thì xe cấp cứu đi đến làng j theo tín hiệu gọi cần thời gian : A[i,i] + A[i,j] [ 1<=i, j<=k, i = j ] Tìm số hiệu làng i để đặt trạm cấp cứu sao cho từ đó đi tới làng xa nhất ( về thời gian ) sẽ mất thời gian ngắn nhất. Mảng A[1:k,1:k] cho trớc, trong đó tất cả phần tử A[i,j]>0 và phần tử A[i,j] có thể không bằng phần tử A[j,i]. Olimpic 87 Thí sinh đợc giao 5 bài theo trật tự dễ dần. Chỉ tính điểm 3 bài. 87.1. Ba lô : Từ n vật chọn ra các vật sao cho tổng khối lợng của chúng nhỏ hơn 30 kg, còn giá trị còn lại là lớn nhất. In tổng giá trị của các vật thể đã đợc chọn. Cụ thể là cho 2 mảng số dơng A[1:n] và B[1;n]. Chọn các chỉ số khác nhau đôi một i 1 ,i 2 , i k sao cho A[i 1 ] + A[i 2 ] + + A[i k ] <30 B[i 1 ] + B[i 2 ] + + B[i k ] = m là lớn nhất. Chỉ cần in giá trị m Chú ý : Có thể giả thiết rằng các vật thể đã đợc sắp xếp theo trật tự tăng dần hoặc giảm dần theo khối lợng A[i], theo giá trị B[i], theo giá trị A[i]/B[i] hoặc một dấu hiệu bất kỳ nào khác. 87.2 Nửa bội. Tập hợp số A cho trớc với điều kiện : a) a A b) Nếu k A, thì 2*k +1 A và 3*k +1 A và ngoài ra tập hợp A không chứa các số nào khác. In n số đầu tiên ( n<100 ) của tập hợp A theo trật tự tăng dần. Ví dụ : Các phần tử đầu của dãy cần in : 1,3,4,7,9,10,13,15,19 87.3. Tổng các lập phơng. Có bao nhiêu phơng pháp viết số tự nhiên N cho trớc thành tổng các lập phơng của hai số tự nhiên : N = i 3 + j 3 Sự hoán vị các số hạng không đợc tính, không đợc sử dụng phép tính nâng lên luỹ thừa 1/3. 87.4. Lật ngợc. Cho trớc mảng số A[1:n]. Tìm đoạn đối xứng dài nhất của mảng A đó ( số đầu tiên bằng số cuối cùng, số thứ hai bằng số đứng trớc số cuối cùng ). Hãy in độ dài của đoạn này. 87.5. Chỉ số thứ tự. Cho trớc mảng số A[1:n]. Hãy tìm và in hoán vị i 1 , i 2 , ,in của số 1, 2, 3, ,n sao cho A[i 1 ]<=A[i 2 ]<= <=A[i n ]. Olimpic 88 Thí sinh đợc giao 5 bài theo trật tự dễ dần. Chỉ tính điểm 3 bài. tungvn40@yahoo.com tungvn40@yahoo.com CM Soft 70 NCT F2 Q10 CM Soft 70 NCT F2 Q10 VIETBOOK Trang 8 88.1. Lớn bên phải. Cho trớc mảng số dơng A[1:n]. Đối với mọi phần tử A[i] hãy chọn trong số các phần tử về bên phải A[i] và lớn hơn A[i] chỉ số nhỏ nhất j rồi thay giá trị A[i] bằng A[j]. Nếu không tìm đợc phần tử A[j] nh vậy thì thay thế A[i] bằng 0. In lại mảng đã nhận đợc. Điều kiện bắt buộc : số phép tính ở lời giải cần phải là O(n) chứ không phải là O(n 2 ). Có thể sử dụng mảng phụ. Giải thích : Ví dụ mảng 2,9,8,5,9,3,4,5,2, sai khi thay trở thành mảng 9,0,9,9,0,4,5,0,0. 88.2. Đa thức. Tính các hệ số a[0], a[1], , a[n-1] của đa thức P(x) = a[0] + a[1]*x + a[2]*x 2 + + a[n-1]*x n-1 + x n Với các nghiệm thực cho trớc x[1], x[2], x[n]. Gợi ý : Theo định lý Bơ Du : P(x) = (x - x[1]) * (x - x[2]) * * (x - x[n]). 88.3. Ước số nguyên tố : Cho trớc số tự nhiên N. Hãy tìm tất cả các ớc số nguyên tố của nó. 88.4. Hàng mua buôn. Một đôi tất ngắn giá 1,05 rúp, một bó tất ( 12 đôi ) giá 10,25 rúp, còn 1 hộp ( 12 bó ) giá 114 rúp. Lập chơng trình sao cho ứng với n đôi tất cần mua, tính số n 1 hộp tất, n 2 bó tất, n 3 đôi tất mà ngời đó cần mua cho đỡ tốn tiền nhất . Giải thích : Thay việc mua 11 đôi tất cần mua bằng mua một bó tất đỡ tốn tiền hơn. 88.5 Đa về bằng 0 : Trong một mảng 2 chiều cho trớc A[1:n, 1:n], hãy thay thế tất cả các phần tử ở hàng hoặc cột có chữ số 0 bằng 0. Điều kiện : Có thể đa vào mảng phụ một chiều nhng không đợc dùng mảng phụ 2 chiều. tungvn40@yahoo.com tungvn40@yahoo.com CM Soft 70 NCT F2 Q10 CM Soft 70 NCT F2 Q10 VIETBOOK Trang 9 Phần hai - Thuật toán Trong phần này trình bày các thuật giải. Với một số bài thuật giải đợc trình bày có thể dễ dàng chuyển sang chơng trình, với một số bài khác đó mới chỉ là ý tởng giải, có lúc là chú giải, giải thích chơng trình. Nhng trong mọi trờng hợp chúng tôi cố gắng làm cho việc đọc chơng trình đợc dễ dàng, trình bày phơng pháp lập trình đúng đợc ghi nhớ. Số lợng các phép toán của thuật giải chính xác đến một bội hằng. ôlimpic 80 80.1.1. Những số nguyên tố đến M : Để tăng tốc độ tính toán ta nên dùng một mảng chứa những số nguyên tố thu đợc và kiểm tra xem số đang xét chia hết của phần tử đã nạp trong bảng hay cha. Số chẵn hiển nhiên không phải xét. Bảng cần có kích thớc tối đa là phần tử. Vì thế những bảng 1000 phần tử sẽ đủ để chứa những số nguyên tố đến 4.000.000. 80.1.2. Hoán vị : Đặc trng của bài toán bài là ở chỗ, cần thu đợc tất cả các hoán vị. Điều này sẽ làm giảm đáng kể số lợng thao tác so với bài toán chọn toàn bộ. Tuy nhiên thử tởng tợng là toàn bộ các hoán vị của các số 1,2,3, m đợc sắp xếp theo trật tự từ điển để tìm cách đa vào một hoán vị xây dựng các hoán vị tiếp theo bằng cách, xuất phát từ hoán vị đầu tiên xây dựng các hoán vị tiếp theo. Cụ thể là với mỗi hoán vị P = ( p1,p2, ,pm ) của các số 1,2, ,m, chúng ta cũng làm phép đổi chỗ nh vậy (A(p1),A(p2), ,A(pm)) của những số A cho trớc. Để xây dựng trực tiếp hoán vị tiếp theo hoán vị cho trớc P = ( p 1 , p 2 , ,p m ) chúng ta duyệt các số p 1 , p 2 , ,p m từ phía cuối và dừng lại khi gặp đợc thành phần p 1 đầu tiên nhỏ hơn thành phần thành phần đứng bên phải nó ( p 1 < p i+1 ). Nếu không có thành phần nh vậy, thì hoán vị P có dạng (m,m-1, ,1) nghĩa là hoán vị cuối cùng. Rõ ràng rằng các thành phần p i+1 > p i+2 > > p m tạo các dãy giảm dần. Chúng ta tìm trong số đó thành phần đầu tiên p j ( tính từ cuối ), lớn hơn p i , và đổi chỗ chúng cho nhau. Việc còn lại là sắp xếp các phần tử p i+1 , p i+2 , , p m theo trật tự tăng dần, hoán vị tìm đợc Q = (q 1 , q 2 , , q m ) sẽ là hoán vị cần tìm đợc. Hình vẽ 1.4 Thật vậy, P < Q bởi vì (i-1) thành phần đầu tiên của chúng trùng nhau và p 1 <q 1 ( bởi vì theo cách chọn lựa của mình q i = p j >p i ). Trong i thành phần đầu tiên P là lớn nhất, còn Q nhỏ nhất, bởi vì trong P các thành phần giảm dần , còn Q - tăng dần. Cuối cùng nếu hoán vị R nằm giữa P và Q, thì i -1 thành phần đầu tiên của nó trùng với các thành phần P và Q, còn thành phần r i = p 1 hay q i , bởi vì trong i-1 thành phần đầu tiên đã chiếm chỗ không có những số nằm giữa p i và q i . Nếu p i = r i và P nhỏ hơn hoặc bằng R thì P=R (bởi vì P lớn nhất với các phần tử p 1 , p 2 , ,p i cho trớc ) và nếu r i =q i thì tơng tự ta có R = Q. tungvn40@yahoo.com tungvn40@yahoo.com CM Soft 70 NCT F2 Q10 CM Soft 70 NCT F2 Q10 VIETBOOK Trang 10 Trong chơng trình điều này đợc thực hiện nh sau : Ta dùng mảng P chứa các hoán vị hiện tại. Trớc tiên lấp dần bởi hoán vị đầu tiên của chúng P=(1,2, ,m) và gắn hoán vị đồng nhất (a 1 , a 2 , ,a m ) của các thành phần của mảng A cho trớc. Giả sử hoán vị P nhận đợc và hoán vị đáp ứng nó A đợc in. Trong phần tơng ứng của chơng trình sẽ tìm phần tử p i < p i+1 với chỉ số lớn nhất i. Nếu không có i đó, thì hoán vị P là cuối cùng. Nếu có i ta sẽ tìm chỉ số lớn nhất j > i mà p i < p j , rồi đổi chỗ pi và p j , sau đó dãy p i+1 , p i+2 , , p m trật tự thay đổi theo chiều ngợc lại: để có trật tự này ngời ta đổi chỗ P i+1 và P m , P i+2 và P m-1 , Tới đây việc nhận đợc hoán vị P tiếp theo đợc kết thúc và hoán vị đáp ứng của nó của mảng A đợc in ra. Bài toán về hoán vị trở nên khó hơn nếu đòi hỏi hoán vị tiếp theo nhận đợc từ hoán vị trớc đó bằng cách đổi chỗ hai phần tử cạnh nhau. Bài toán nh trên đợc giải ở chơng trình 80.1.2-2. Chơng trình ngắn nhng phức tạp. Bạn đọc hãy tự tìm hiểu theo bảng hoán vị, mà chơng trình in ra với m = 4. 1 2 3 4 1 3 4 2 1 4 2 3 2 1 3 4 3 1 4 2 4 1 2 3 2 3 1 4 3 4 1 2 4 2 1 3 2 3 4 1 3 4 2 1 4 2 3 1 3 2 1 4 4 3 2 1 2 4 3 1 3 1 2 4 4 1 3 2 2 1 4 3 1 3 2 4 1 4 3 2 1 2 3 4 80.1.3. Nâng luỹ thừa nhanh Bình thờng để tính a k ngời ta đa vào biến số b, ban đầu gán b:=1 rồi thực hiện nhiều lần các phép toán : k:=k-1; B:=b*a . tungvn40@yahoo.com tungvn40@yahoo.com CM Soft 70 NCT F2 Q10 CM Soft 70 NCT F2 Q10 [...]... 82.3 Tổng theo tập con Đây là bài toán liệt kê tất cả các tập con của một tập hợp Bề ngoài nó giống sự liệt kê tất cả các khả năng nh ng đơn giản hơn Cho b là một số tự nhiên và bi là chữ số biểu diễn theo hệ đếm cơ số 2 B = b1 + 2b2 + + 2n-1bn ( b1=0 hay b1=1) Khi b lần l ợt nhận giá trị b=1, 2, , 2n 1 theo các bộ chỉ số i của các phần tử bi =1 lần l ợt là các tập con ( không rỗng ) của tập hợp ( 1,... k-1 Ô nh vậy là có và duy nhất Lời giải trình bày ở ch ơng trình 83.3 ở đó dễ dàng nhận ra sơ đồ chung của sự lựa chọn các tình huống Có thể làm gọn hơn nữa ch ơng trình để giải bài toán Mê cung, nếu ta dùng kỹ thuật đệ qui Điều này đ ợc thực hiện ở ch ơng trình 83.3-2 Tuy nhiên viết ch ơng trình nh thế dễ hơn là đọc nó Các thuật toán đã trình bày (ngoài thuật toán đầu tiên) có thể tìm ra con đ ờng... VIETBOOK Bài toán này có thể giải không phải nhờ đến hàm lấy căn bậc hai Giải dựa trên ý t ởng chỉ ra trong ch ơng trình 87.3 Bạn đọc tự tìm hiểu ch ơng trình này, có thể xem lại bài 80.2.2 và dễ dàng khôi phục các chi tiết 80.2.3 Các số khác nhau : Ch ơng trình 80.2.3 dễ đọc Nh ng có thể đẩy nhanh tốc độ thực hiện nó, khi so sánh các phần tử thử nghiệm không phải với các phần tử tr ớc đó mà với các phần... ợc điều đó 88.4 Hàng mua buôn Bài toán này th ờng bị giải sai Chúng tôi sẽ đ a ra cách giải đúng và một số ví dụ để phát hiện các lỗi trong các cách giải sai Cách mua tối u không bị thừa đ ợc tìm theo cách sau : n1 = n/144 ; m=n-n1*144 n2 = m/12 ; n3=m-n2*12 Để hạ giá mua đó chỉ có 2 cách ; hoặc mua thêm cả tá chứ không mua các đôi lẻ, hoặc mua thêm cả hộp chứ không mua các tá lẻ, đôi lẻ Nếu n3 * 1.05... khi xét các phần tử cùng mảng A, ta đánh dấu trong các mảng B và C các dòng và các cột có chứa các số 0, tức là làm If A[i,j]=0 then B[i]=1 ; C[j]=1 Bây giờ khi duyệt lại bảng A ta thêm bằng các số 0 Các phần tử đứng ở các dòng và cột đã đ ợc đánh dấu trong các mảng B hoặc C , tức là : If B[i]=1 or C[j]=1 then A[i,j]=0 Có thể đề xuất cách giải khác chỉ cần sử dụng một mảng phụ C[1:n] Trong các tr ờng... nhiệm 80.2.1 Tìm các phần tử bằng nhau Để có lời giải chấp nhận đ ợc cho bài toán này cần phải tránh không chọn các cặp phần tử A[i,j] và A[p,q] hai lần và không đ ợc lẫn lộn trong các tr ờng hợp khi i = p và j = q Trong ch ơng trình Fotran các khó khăn nói trên này đ ợc khắc phục qua việc chuyển đến mảng một chiều với sự giúp đỡ của toán tử EQUIALENCE 80.2.2 Tổng các bình ph ơng Ch ơng trình khá dễ... tử cuối cùng k= n*n 81.4 Các số lập từ các chữ số khác nhau Ch ơng trình 81.4 khá rõ ràng 81.5 Ch ơng trình 81.5 đơn giản olimpic 82 82.1.Hình chữ nhật Ta nhận thấy số l ợng hình chữ nhật chính là số l ợng các góc tây bắc tức là góc trái trên của chúng Chỉ cần không nhầm lẫn trong tr ờng hợp góc ở trên biên Các ch ơng trình 82.1 và 82.1-2 khắc phục khó khăn trên theo hai cách khác nhau L u ý bạn... số n0 các phần tử còn lại ở dòng io nhận giá trị mới Nếu n0 ở b ớc nào đó bằng không, thì không có các phần tử bằng nhau, còn nếu không io[1] sẽ là phần tử cần tìm kiếmThuật toán này đ ợc thực hiện ở ch ơng trình 85.2-2 ở đây trong ngôn ngữ Basic hay Pascal thay thế các phần tử io[j] bằng các phần tử A(0,j) (t ơng ứng với A[0,j]) 85.3 Số không tách đ ợc Bài toán này hay hơn việc có thể chỉ ra từ cách... ,1 A[0] = - A[0]*x[m] Điều này cũng đ ợc thực hiện trong ch ơng trình 88.2 Nó chứa một chu trình kép vòng ngoài theo m từ 1 đến n và vòng trong treo i từ m-1 đến 0, với việc điều chỉnh đối với các giá trị ban đầu và các giá trị cuối cùng Cũng có thể trình bày ch ơng trình theo cách khác : với chu trình ngoài theo i từ n - 1 đến 0 và chu trình trong theo m từ n -1 đến n 88.3 Ước nguyên tố Ta sẽ thay... nghĩa là b = w Vậy b là giá trị cần tìm 80.1.4 Các phép tính số học : Bài toán này cũng là sự thành lập tất cả các hoán vị Điểm khác biệt ở đây là có sự lặp lại Ta viết biểu thức cho tr ớc ở dạng : w = ((((( 1 a2 2) a3 3) a4 4) a5 5 ) a6 6 Trong đó các phần tử của mảng a[2:6] biểu thị dấu các phép tính số học Ta qui ớc các dấu +, -, *, / đ ợc biểu thị qua các giá trị 1, 2, 3, 4 Vì có thể có nhiều khả . Olimpic lập trình I.1. Các bài toán Olimpic Trong Olimpic Tin học Mat-Xcơ-va, ngời ta ra cho học sinh phổ thông một số nhóm bài toán. Số các bài toán dao động từ 5 đến 11 bài. Các bài toán. chơng trình, không thể thay chơng trình bằng bất cứ lập luận nào. Olimpic 80 Các thí sinh đợc giao 11 bài chia làm 3 nhóm. Các nhóm đợc sắp xếp theo thứ tự dễ dần, trong một nhóm các bài toán. hạ thấp điểm. Trong phát biểu các bài toán và trình bày thuật toán qui ớc dùng các ký hiệu sau đây: Các mảng A 1 , A 2 , A n đợc ký hiệu là A[1:n] với A[i] là các phần tử của nó. Cũng nh vậy

Ngày đăng: 02/08/2014, 02:21

Từ khóa liên quan

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

Tài liệu liên quan