Đề thi Tin học Oympic Macscova
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ử đó. 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. 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. 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. 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 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). 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. 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. 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. 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 . [...]... khả năng (lựa chọn ik ) Đối với k cố định và tất cả các B[k,ik+1] số các khả năng là m2, còn toàn bộ bài toán đòi hỏi xem xét ít hơn m2 * n khả năng 84.3 Số hoàn thi n Trang 17 VIETBOOK Để giải quyết vấn đề có hay không có số tự nhiên i hoàn thi n có thể xem xét tất cả các số j = 1, 2, , i-1 xem các số nào là ớc số của số 1, cộng những ớc số này Nh thế chúng ta sẽ có ch ơng trình 84.3 Có thể đẩy nhanh... cũng không phá vỡ, 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ó... có hai ph ơng án j của b ớc i : j =0, nghĩa là lấy vật, còn j = 1 là không lấy vật đó ( xem 2.1 về việc đ a ra các thuật ngữ ) L u ý rằng sẽ nhận đ ợc cây nhị phân có tất cả các nhánh đều có độ dài n ( nh ng không nhất thi t phải hiểu điều này ) Ngoài những mảng cho tr ớc A[1:n] và B[1:n] ta đ ợc thêm mảng T[1:n] và một số biến nữa : I: S: Chỉ số của vật tiếp theo Khối l ợng của các vật trong ba lô... j3 Nếu K A[i] Trang 25 VIETBOOK Nếu chỉ số j đó đã tìm đ ợc, thì làm K=j-1 ; B[k]=A[i] ; A[i] = B[j] Còn nếu chỉ số j đó không có,... xem xét tiếp tục các phần tử đã đ a về bằng 0 đ ợc coi là bằng 0 từ đầu và dẫn đến các b ớc đ a về 0 không cần thi t 2 Xem xét mảng A, và nếu A[i,j]=0, thì đ a j vào phần tử C[k] tiếp theo Từ đó cùng với các chỉ số j có thể đ ợc đ a đi nhiều lần, và mảng C có thể cần độ dài m*n trái với giả thi t Trang 28 VIETBOOK lời giải bằng ngôn ngữ pascal olimpic 80.1.1 ( In ra các số nguyên tố nhỏ hơn n) program... số Mod(m,n) tìm số d của phép chia m cho n hoặc t ơng tự nó 84.7 Hình vuông Trang 18 VIETBOOK Nếu tất cả các số đứng ở các góc của hình vuông khác nhau, thì tổng của chúng 0+1+5+11=17 Chú ý rằng mệnh đề đảo cũng đúng Điều này làm đơn giản ch ơng trình Olimpic 85 85.1 Phân tích ra n số hạng Để tránh việc lặp lại sự phân tích trong việc sắp xếp lại các số hạng, chúng ta sẽ chỉ xét những phép phân tích... một lần nữa tìm kiếm, tìm thấy hay không phần tử trong số còn lại không v ợt quá giá trị mới của S và cứ nh thế Có thể chứng minh bằng qui nạp ( bạn hãy tự làm điều này ) sẽ tìm thấy nh ng số không đ ợc thi t lập đầu tiên Thực tế lần l ợt ở các b ớc i=1, 2, cần phải xem xét phần tử của mảng P bắt đầu từ P[i], còn phần tử tìm thấy P[j] thay thành P[i] Để tiết kiệm số các phép toán (trong tr ờng hợp các... khác nhau Nh ng nếu các phần tử khác nhau thì nó đòi hỏi n*n phép tính ( xem ch ơng trình 85.5-2) 85.6 Hệ đếm: Cần tính giá trị số cho tr ớc theo l ợc đồ Hóc ne N=(( (M[9]*i + M[8]i + + M[2]*i +M[1] Giả thi t rằng n không v ợt quá giá trị lớn nhất cho phép đối với số nguyên Chỉ số của số N ở hệ đếm j nhận đ ợc nh các số d của phép chia nguyên N/j K = N/j ; M = N k*j ; N = k ; Những giá trị của số d M... tính số cặp bằng nhau, chúng ta làm bằng 0 bộ ghi S Chúng ta so sánh mọi phần tử A[i] với tất cả các phần tử tiếp theo A[i] đối với j = i+1, i+2, và thêm vào S số 1 trong tr ờng hợp A[i] = A[j] Điều cần thi t để in câu trả lời p nhận đ ợc theo giá trị của bộ ghi S trong bảng P 4+3+2+1 S S P 10 1 1+1 2 5 3+2+1 6 2 1 1 6 2+1+1 4 3 0 0 7 2+1 3 4 Ngoài hai tr ờng hợp đầu tiên , p = 7 - s 86.3 Cái trống Lời . 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. 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. hỏi xem xét ít hơn m 2 * n khả năng. 84.3. Số hoàn thi n. VIETBOOK Trang 18 Để giải quyết vấn đề có hay không có số tự nhiên i hoàn thi n có thể xem xét tất cả các số j = 1, 2, , i-1 xem