134
Tin hoïc & Nhaø tröôøng 1 Bài 101/2002 - Bảng con 5x5 (Dành cho học sinh Tiểu học) Cho một bảng gồm có 23 hàng và 15 cột, chỉ chứa các kí tự 0 và 1 như sau: Bạn hãy đưa ra cách tìm nhanh bảng trên xem có chính xác bao nhiêu bảng con kích thước 5 x 5 (5 hàng và 5 cột) dạng: 11111 10001 10101 10001 11111 Bài 102/2002 - Số nguyên tố đặc biệt (Dành cho học sinh THCS và THPT) Một người rất quan tâm đến các con số, sau một lần lấy một số ngẫu nhiên 86311 và một điều thú vị anh ta phát hiện ra được là con số trên rất đặc biệt vì: 86311, 6311, 311 và 11 đều là số nguyên tố. Hãy tính xem có bao nhiêu số có N (N<=9) chữ số ở dạng trên. Ví dụ : (Đề ra của bạn Vũ Anh Quân) Bài 103/2002 - Trò chơi với ô chữ (Dành cho học sinh THPT)

Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

  • Upload
    lykien

  • View
    219

  • Download
    2

Embed Size (px)

Citation preview

Page 1: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 1

Bài 101/2002 - Bảng con 5x5(Dành cho học sinh Tiểu học)Cho một bảng gồm có 23 hàng và 15 cột, chỉ chứa các kí tự 0 và 1 như sau:

Bạn hãy đưa ra cách tìm nhanh bảng trên xem có chính xác bao nhiêu bảng con kích thước 5 x 5 (5 hàng và 5 cột) dạng:1111110001101011000111111

Bài 102/2002 - Số nguyên tố đặc biệt(Dành cho học sinh THCS và THPT) Một người rất quan tâm đến các con số, sau một lần lấy một số ngẫu nhiên 86311 và một điều thú vị anh ta phát hiện ra được là con số trên rất đặc biệt vì: 86311, 6311, 311 và 11 đều là số nguyên tố. Hãy tính xem có bao nhiêu số có N (N<=9) chữ số ở dạng trên.Ví dụ:

(Đề ra của bạn Vũ Anh Quân)

Bài 103/2002 - Trò chơi với ô chữ(Dành cho học sinh THPT)Tiếp tục phát triển các trò chơi với ô chữ, người ta đã đánh số cho các từ có độ dài từ 1 đến 26 theo qui tắc là ưu tiên độ dài từ, sau đó là theo vần Alphabetically.

Page 2: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

2 Tin hoïc & Nhaø tröôøng

Như vậy, mỗi một số ta có tương ứng là một từ gồm các chữ cái thường và ngược lại ứng với mỗi từ ta có một số tương ứng. Công việc đặt ra là: giả sử ta có một số hãy tìm từ tương ứng với nó, và cho một từ hãy cho biết từ đó ứng với số bao nhiêu?Dữ liệu vào: từ file GAME.INP gồm hai dòng. Dòng thứ nhất là một số nguyên, dòng thứ hai là một xâu kí tự có không quá 26 chữ cái thường.Kết quả: ra file GAME.OUT cũng gồm hai dòng. Dòng thứ nhất là một từ tương ứng với số trong file input, dòng thứ hai là một số tương ứng với từ trong file input.Ví dụ:

(Đề ra của bạn Đinh Quang Huy - ĐHQG Hà Nội)

Bài 104/2002 - Dấu phép tính(Dành cho học sinh Tiểu học)Cho 3 phép tính như sau:9 A 3 B 6 C 9 = 98 A 4 B 3 C 2 = 9? A 6 B 9 C 4 = 9Bạn cần thay thế các chữ cái A, B, C trong các phép tính trên bởi các dấu phép toán (+, -, x, :) để thực hiện các phép tính đúng và thoả mãn: các chữ cái trong các phép tính như nhau phải được thay thế bởi cùng dấu phép toán (ví dụ: nếu trong phép tính thứ nhất A được thay bởi phép cộng (+) thì trong hai phép tính sau A cũng là phép cộng,...). Và bạn sẽ tìm được con số nào để thay cho dấu hỏi chấm (?) trong phép tính cuối cùng?

Bài 105/2002 - Dãy con dài nhất (Dành cho học sinh THCS và THPT) Cho một dãy số gồm N số nguyên và một số nguyên dương k. Hãy tìm một dãy con dài nhất liên tiếp nhau sao cho tổng chia hết cho k.Dữ liệu vào: từ file DAYSO.INP có dạng:- Dòng đầu tiên là hai số N và k (N<=500000; k<=10000);- Các dòng tiếp theo là N số nguyên của dãy (các số kiểu Longint), mỗi số trên một dòng.Kết quả: ra file DAYSO.OUT gồm một dòng duy nhất chứa hai số m và s, trong đó m là độ dài lớn nhất tìm được và s là vị trí bắt đầu của dãy đó.Ví dụ:

(Đề ra của bạn Vũ Anh Quân)

Page 3: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 3

Bài 106/2002 - Tổng trở của mạch điện(Dành cho học sinh THPT) Một mạch điện gồm N điện trở được mắc với nhau theo kiểu song song hoặc nối tiếp hoặc hỗn hợp cả hai kiểu. Người ta biểu diễn các mạch đó bằng một biểu thức cho dưới dạng một xâu ký tự với cú pháp và ngữ nghĩa được xác định thích như sau:+ Nếu Rx, Ry là hai điện trở mắc nối tiếp với nhau thì được biểu diễn là: Rx+Ry. Khi đó, điện trở của đoạn mạch mắc nối tiếp này được tính theo công thức: R = Rx + Ry;+ Nếu Rx, Ry là hai điện trở mắc song song với nhau thì được biểu diễn là: Rx*Ry. Khi đó, điện trở của đoạn mạch mắc song song này được tính theo công thức: 1/R = 1/Rx + 1/Ry.Ví dụ, mạch điện sau đây sẽ được biểu diễn dưới dạng biểu thức là: (B+((A+(C*(D+G)))*(E+F)))

Yêu cầu Cho một mạch điện thể hiện bằng một xâu ký tự theo cú pháp đã nêu ở trên, trong đó mỗi điện trở có tên là một ký tự khác nhau, cùng với trị số điện trở tuơng ứng của chúng. Lập trình kiểm tra tính đúng đắn của biểu thức mạch, nếu đúng thì tính điện trở của mạch. Dữ liệu vào lấy từ tệp văn bản tên là MACH.INP có cấu trúc như sau:+ Dòng đầu tiên là số N - số các điện trở trên mạch điện;+ Dòng thứ hai cho một xâu ký tự là biểu thức mạch tuân theo cú pháp mô tả mạch điện nói trên.+ N dòng tiếp theo, mỗi dòng gồm tên của điện trở (là một ký tự trong bảng chữ cái) và giá trị tương ứng của điện trở đó, cách nhau bởi một khoảng trống. Kết quả ra ghi trong tệp MACH.OUT chỉ gồm một dòng chứa một số duy nhất là giá trị tính được của điện trở tổng toàn mạch.Tệp chương trình có tên là MACH.PASVí dụ:MACH.INP7(B+((A+(C*(D+G)))*(E+F)))A 10B 5C 8D 4E 8F 6G 4MACH.OUT12(Đề ra của bạn Đinh Xuân Hải - Lớp 10A1 - Khối PT chuyên Toán - Đại học Vinh)

Page 4: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

4 Tin hoïc & Nhaø tröôøng

Bài 107/2002 - Số Palindrome có ba chữ số(Dành cho học sinh Tiểu học)Số Palindrome là một số nguyên dương mà khi đọc xuôi hoặc đọc ngược đều giống nhau, ví dụ các số: 17671, 171... Bạn hãy tìm xem có tất cả bao nhiêu số có hai chữ số mà bình phương của chúng là số Palindrome có ba chữ số (một số có hai chữ số, ba chữ số... thì chữ số đầu tiên phải khác 0). Chú ý: Bình phương của một số là tích của số đó với chính nó.(Nguyễn Tuấn Việt - Lớp 12C6 - Trường chuyên Lê Khiết - Quảng Ngãi)

Bài 108/2002 - Tìm quy luật để lập ma trận vuông(Dành cho học sinh THCS và THPT)Cho số nguyên dương N (1 <= N <= 100). 1) Hãy tìm công thức để tính các phần tử của bảng có kích thước N x N, dựa theo quy luật đưược nhận biết từ cách biểu diễn cụ thể với N = 3, 4, 6 như sau: + Với n = 3:0 1 21 13 92 3 12

+ Với n = 4:0 1 2 31 13 9 112 3 38 21 3 5 6 27

+ Với n = 6:0 1 2 3 4 51 13 9 11 13 152 3 38 21 24 273 5 6 73 37 414 7 9 10 188 575 9 12 14 15 72

2) Đưa ra màn hình một ma trận vuông theo khuôn dạng trên với N cụ thể được nhập từ bàn phím. (Cao Minh Anh - Lớp 10 Lý - THPT chuyên Lê Khiết - Quảng Ngãi)

Bài 109/2002 -Biểu thức chia(Dành cho học sinh THCS và THPT)Biểu thức chia là biểu thức có dạng:x1/x2/x3/…/xn Người ta tính giá trị biểu thức bằng cách thực hiện lần lượt các phép chia từ trái sang phải. Ví dụ: 1/2/1/2 = 1/4Tuy nhiên chúng ta có thể thêm vào biểu thức chia các dấu ngoặc để thay đổi giá trị của biểu thức. Ví dụ: (1/2)/(1/2) = 1Hãy viết chương trình kiểm tra xem có thể thêm các dấu ngoặc vào một biểu thức chia để cho giá trị của nó nhận giá trị nguyên hay không.Dữ liệu vào: Lấy từ tệp văn bản có tên là DIV.INP có cấu trúc như sau:

Page 5: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 5

- Dòng đầu đầu là số N (2 </p" - Dòng thứ i trong N dòng tiếp theo ghi số xi( 0 < xi <=109 ) của biểu thức chia.Dữ liệu ra: Ghi ra tệp văn bản DIV.OUT từ YES nếu như có thể thêm các dấu ngoặc để giá trị biểu thức đó nguyên và từ NO nếu như không thể.Ví dụ:

(Đinh Xuân Hải - Lớp 10A1 - Khối PTCT - Đại Học Vinh)

Bài 110/2002 - Phân phối kênh(Dành cho học sinh THPT)Công ty dịch vụ mạng máy tính cần phân phối kênh hoạt động phục vụ N (N<=1000) yêu cầu của khách hàng đánh số từ 1 đến N. Với mỗi khách hàng thứ i ta biết khoảng thời gian yêu cầu sử dụng kênh là (si,ti) với i =1, 2,.., N (khách hàng sẽ sử dụng kênh từ thời điểm s i

đến thời điểm ti). Thời gian chuyển giao quyền sử dụng kênh từ khách hàng này cho tới khách hàng khác là không đáng kể. Như vậy, nếu hai khách hàng nào đó được bố trí làm việc trên cùng một kênh thì các khoảng thời gian sử dụng của họ chỉ có thể có nhiều nhất một điểm chung.Yêu cầu: Hãy tìm cách phân phối sử dụng ít kênh nhất.Dữ liệu vào: từ file văn bản CHANEL.INP có cấu trúc như sau.- Dòng đầu tiên ghi số N (N <= 1000)- Dòng thứ i trong số n dòng tiếp theo ghi hai số nguyên dương si, ti với i =1, 2,..., NKết quả ra: file CHANEL.OUT có cấu trúc sau:- Dòng đầu ghi số p - số lượng kênh cần sử dụng.- Dòng thứ i trong số p dòng tiếp theo chứa các chỉ số của các khách hàng sử dụng kênh thứ i, i = 1, 2,.., NVí dụ

Bài 111/2002 - Chia lưới ô hình chữ nhậtCho một lưới hình chữ nhật kích thước 5 x 10 ô. Với các số đã cho trên các ô bạn hãy chia lưới hình chữ nhật này ra thành 7 phần sao cho các phần đều có tổng bằng nhau.

Page 6: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

6 Tin hoïc & Nhaø tröôøng

Bài 112/2002 - N giai thừa (Dành cho học sinh THCS và PTTH)Giai thừa N ký hiệu là N! là tích của tất cả các số nguyên dương từ 1 đến N. Giai thừa N tăng rất nhanh, ví dụ: 5! = 120, 10! = 3628800. Một cách để xác định các số lớn như vậy, người ta chỉ ra số lần xuất hiện các số nguyên tố trong phân tích của nó ra thừa số nguyên tố. Ví dụ 825 có thể xác định như sau: (0 1 2 0 1) có nghĩa là: 825 = 20 * 31 * 52 * 70 * 111.Dữ liệu vào trong file văn bản LEKHIET.INP trong đó chứa số nguyên dương N (1 <= N <= 16000).Kết quả đưa ra màn hình dãy các số lần xuất hiện các số nguyên tố trong phân tích của N!Ví dụ:LEKHIET.INP110LEKHIET.OUT18 4 2 1LEKHIET.INP220LEKHIET.OUT218 8 4 2 1 1 1 1LEKHIET.INP3100LEKHIET.OUT397 48 24 16 9 7 5 5 4 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1(Cao Minh Anh - Lớp 10 chuyên Lý trường THPT chuyên Lê Khiết - Quảng Ngãi ) (* Trích dẫn Đề ra đề nghị của trường THPT Nguyễn Thượng Hiền trong kì thi Olimpic 30-4, khối 10 năm 2001*)

Bài 113/2002 - Toà nhà thương mại thế giới(Dành cho học sinh PTTH)Một trung tâm thương mại cao 150 tầng. Trên mỗi tầng đều có các ngân hàng chứa tiền. Toà nhà bị bọn khủng bố tấn công bằng máy bay. Máy bay cảm tử của bọn khủng bố đâm vào tầng j của toà nhà và gây ra cháy. Đám cháy này lan từ tầng k xuống với tốc độ 10 phút/tầng. Một tên cướp đang ở tầng 1 thấy đây là một thời cơ để kiếm tiền vì lúc này mọi người đều lo thoát thân. Hắn ta sử dụng 1 thang máy đặc biệt để đi lấy tiền. Thang máy này có tốc độ là 1phút/1 tầng. Nếu dừng lại để lấy tiền ở mỗi tầng hắn mất 15 phút. Nhân chứng cho thấy rằng hắn có số liệu vể lượng tiền có ở mỗi tầng. Sau khi đám cháy được dập tắt và người ta đang thống kê thiệt hại. Do tài liệu sổ sách về số tiền có trước khi toà nhà bị khủng bố và một số lượng tiền đã bị cháy nên người ta không thể biết được là tên cướp đã lấy được bao nhiêu tiền. Vì vậy cảnh sát đã nhờ một trung tâm Tin học kiểm tra xem số tiền tối đa mà tên cướp có thể lấy được.Dữ liệu vào: Đọc từ file WTC.INP -Dòng thứ nhất chứa số K (0 < K <= 150) là tầng mà máy bay của tên khủng bố đã đâm vào.

Page 7: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 7

-Dòng tiếp theo ghi các số t[2], t[3], …, t[k-1] tương ứng là số tiền có ở các tầng 2, 3,…, k-1Kết quả: ghi ra file WTC.OUT gồm:- Dòng đầu tiên ghi số tiền lớn nhất mà tên cướp đã có thể lấy.- Dòng thứ hai ghi số hiệu các tầng mà hắn đã dừng lại để lấy (tức là tầng mà hắn đã dừng lại để lấy tiền để có thể lấy được số tiền tối đa như dòng đầu đã thông báo).Ví dụ : WTC.INP WTC.OUT102 3 4 5 6 7 8 9

19 7 6 4 2

(Đinh Xuân Hải - Lớp 10A1- Khối Phổ thông Chuyên Toán-Tin Đại học Vinh)

Bài 114/2002 - Xoá bớt các chữ số(Dành cho học sinh Tiểu học)Cho một dãy gồm toàn các chữ số: 865258964125278632545. Bạn hãy xoá khỏi dãy một số chữ số sao cho cuối cùng còn lại, theo đúng thứ tự trong dãy, là một dãy giảm dần và là một số lớn nhất.

Bài 115/2002 - Liệt kê các ô giao đường chéoNguyễn Văn ĐứcDành cho học sinh THCS và THPT)Cho một hình chữ nhật có các cạnh là các số nguyên dương m, n (m, n<= 100). Hình chữ nhật được chia thành các ô vuông cạnh đơn vị bằng các đường song song với các cạnh. Các ô được đánh dấu như sau: các dòng ô được đánh số từ 1 đến m từ dưới lên, các cột ô được đánh số từ 1 đến n từ trái sang phải. Khi đó, mỗi ô được đặc trưng bởi chỉ số dòng và chỉ số cột của nó. Hãy in ra màn hình các ô vuông có điểm chung với đường chéo của hình chữ nhật đi từ góc trái trên của ô (1, 1) đến góc phải dưới của ô (m, n)

Ví dụ: với m = 3, n = 4, kết quả liệt kê được các ô sau: (1,1), (1,2), (2,2), (2,3), (3,3), (3,4).Nguyễn Văn Đức - Cần Thơ

Bài 116/2002 - Cân thăng bằng(Dành cho ho.c sinh THCS và PTTH)Có một cái cân đĩa (cân thăng bằng) và N quả cân trọng lượng khác nhau (các quả cân được đánh số từ 1 đến N). Quả cân số hiệu i có trọng lượng là Aị Người ta muốn cân một vật có trọng lượng P. Hãy viết một chương trình tìm cách đặt vật và các quả cân lên đĩa để cân thăng bằng sao cho số quả cân phải dùng là ít nhất.Dữ liệu vào được đọc từ file văn bản tên là CAN.INP, gồm hai dòng:- Dòng đầu ghi số N (N<=30) và số nguyên P- Dòng thứ hai ghi các số nguyên A1, A2,..., AN (Ai<=100)Kết quả cần ghi ra file văn bản tên là CAN.OUT. Nếu không có phương án đặt cân, kết quả ghi một số -1. Trái lại, kết quả ghi hai dòng:

Page 8: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

8 Tin hoïc & Nhaø tröôøng

- Dòng đầu là số quả cân đặt cùng trên một đĩa với vật, tiếp theo là các số hiệu của các quả cân này,- Dòng thứ hai là số quả cân đặt trên đĩa còn lại, tiếp theo là các số hiệu của các quả cân này.Ví dụ:

CAN.INP10 13169 27 10 73 95 60 55 87 77 75CAN.OUT2 2 32 4 5

Bài 117/2002 - Giải phép toánEm hãy cho biết giá trị số của các chữ cái trong phép toán sau đây?

Bài 118/2002 - Biển đăng kí xe máyTrịnh Phong QuangBiển đăng kí xe máy của Tùng là một số chính phương có 4 chữ số. Biết rằng chữ số hàng trăm, hàng nghìn, hàng chục, hàng đơn vị làm thành 4 số tự nhiên liên tiếp tăng dần. Tìm số biển đăng ký đó?Tác giả: Trịnh Phong QuangGiáo viên trường THCS Quảng Lạc- Nho Quan – Ninh Bình

Bài 119/2002 - Nối điểm không tạo thành tam giácNguyễn Văn TrườngTrên mặt phẳng toạ độ cho n (1 < n < 10 000) điểm, trong đó không có 3 điểm nào thẳng hàng. Hãy tìm cách nối các điểm để được số đoạn thẳng nhiều nhất sao cho không có bất kỳ một bộ ba đoạn nào tạo thành 3 cạnh của một tam giác. Dữ liệu vào cho trong tệp DIEM.INP: dòng đầu là số n: trên n dòng sau, dòng thứ i (1 < i ≤ n+1) ghi hai số tương ứng là hoành độ và tung độ của điểm thứ i-1. Kết quả ghi vào tệp DIEM.OUT: dồng đầu là tổng số đoạn thẳng lớn nhất nối được trên các dòng sau, mỗi dòng ghi hai số là chỉ số của hai điểm tương ứng là hai đầu của đoạn thẳng được nối Ví dụ:

DIEM.INP DIEM.OUT

(Đề ra của bạn Nguyễn Văn Trường)

Page 9: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 9

Bài 120/2002 - Bội số chung nhỏ nhấtCho trước số tự nhiên N (1< N <100)Xét tất cả các phân tích N thành tổng các số tự nhiên: N = a1 + a2 +... +ak (1)Tìm giá trị lớn nhất của BSCNN (a1,a2,, ..., ak) trên tập các bộ số (a1,a2,..., ak) thoả mãn đẳng thức (1).Dữ liệu vào: từ file văn bản BSCNN.INP: là 1 số NKết quả: Ghi ra file văn bản BSCNN.OUT, bao gồm 2 dòng, dòng thứ nhất ghi giá trị số Max tìm được. Dòng thứ hai ghi n bộ số a1,a2,, ..., ak tương ứng, các số cách nhau bằng dấu cách.Ví dụ.

Bài 121/2002 - Số nào vậy?Tích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ số được lặp lại 2 lần. Vậy 2 số đó là những số nào vậy? Ví dụ: 44*77 = 3388;

Bài 122/2002 - Thành PhốMột người thiết kế đường phố yêu thích toán học đã xây dựng mô hình đường phố như sau:Hệ thống đường phố chính trong thành phố được thiết kế bao gồm n nút giao thông và m đường phố, mỗi đường phố nối 2 nút giao thông khác nhau. Các nút giao thông được đánh số từ 1 đến n và các đường phố được đánh số từ 1 đến m. Giữa hai nút giao thông bất kì có không quá 1 đường phố nối chúng. Hệ thống đường được thiết kế đảm bảo sự đi lại giữa hai nút giao thông bất kỳ. Hội đồng thành phố định đặt tên mỗi đường phố là một trong các số từ 1 đến m sao cho tại mỗi nút giao thông thuộc nhiều hơn 1 đường phố thì UCLN của tất cả tên các đường phố xuất phát từ nút đó đều bằng 1.Yêu cầu: Tìm một phương án đặt tên các đường phố thoả mãn điều kiện trên. Dữ liệu vào: name.inp+ Dòng đầu là 2 số m, n (2≤n≤500, 1≤m≤200000)+ Dòng thứ i trong số m dòng tiếp theo chứa cặp 2 số hiệu của 2 nút giao thông tương ứng là hai đầu mút của đường phố thứ i. Kết quả ra: name.out Gồm m dòng, dòng thứ i là tên của đường phố thứ i Ví dụ:

Page 10: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

10 Tin hoïc & Nhaø tröôøng

Bài 123/2002 - Mua HoaNguyễn Mậu Kiên Địa chỉ: Lớp 10Tin THPT Năng khiếu Ngô Sĩ Liên-Bắc GiangNgày 8 -3, một nhóm bạn nam của lớp rủ nhau cùng đi mua K bông hoa tặng cho K bạn gái, mỗi bạn gái một loại hoa khác nhau. Trong một cửa hàng hoa có hình thức khuyến mại là có một số loại hoa gọi là hoa đặc biệt: nếu khách hàng mua thì với mỗi loại hoa khuyến mại họ sẽ có thể mua một loại hoa khác với giá bằng 90% giá của loại hoa này. Giả thiết rằng cửa hàng có N loại hoa (đánh số 1..N) có giá như nhau và mỗi loại hoa đặc biệt như trên chỉ có giá trị giảm giá cho 1 loại hoa khác mà thôi. Bạn hãy tìm danh sách loại hoa cần mua với chi phí thấp nhất.Input : Hoa inp-Dòng 1 ghi số N (0≤N≤10000) và số K (0≤K≤N)-Dòng 2 ghi giá của mỗi loại hoa là C (C≤30000)-Dòng i trong N dòng tiếp theo ghi số hiệu loại hoa được giảm giá nếu khách hàng mua loại hoa i (ghi 0 nếu loại hoa i không phải là loại khuyến mại)Output : Hoa.out-Dòng 1 ghi chi phí phải trả-K dòng tiếp theo ghi danh sách số hiệu K loại hoa cần mua.VI DU

Bài 124/2002 -Số kỳ lạXét số có hai chữ số 45. Bình phương số đó lên (45 x 45)= 2025Chia kết quả thành 2 phần 20 và 25Cộng hai phần đó lại (20+25)=45Đây chính là số đã xét ban đầu.Bạn hãy tìm số có hai chữ số khác có cùng tính chất như trên?

Bài 125/2002 - Biểu thức ngoặcNghiêm Sỹ PhúCho một biểu thức ngoặc gồm các dấu ngoặc '(' hoặc')'. Các dấu ngoặc được xây dựng theo quy tắc sau để xác định được độ sâu của biểu thức:A=() => d(A)=1B=(A) => d(B)=d(A)+1C=AB => d(C)=Max{d(A);d(B)}Yêu cầu của bài toán là cho trước độ sâu d, độ dài của biểu thức n ( n=2k) hãy tính số lượng các biểu thức ngoặc tương ứng.

Page 11: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 11

Ví dụ: n=6, d=2 có 3 biểu thức được sắp theo thứ tự từ điển như sau:( ( ) ( ) )( ( ) )( )( ) ( ( ) )Dữ liệu: Vào từ tệp văn bản Par.inpMột dòng duy nhất chứa n và d (n<=64)Kết quả: Ghi ra file Par.outMột dòng duy nhất số lượng biểu thức ngoặc có chiều dài n và độ sâu d.

Bài 126/2002 - Lập lịch thi đấu bóng đáCó M đội bóng đá (M=2N-1) cần đấu loại vòng tròn với nhau. Một đội phải thi đấu với 2N-2 đội còn lại. Cần xếp lịch thi đấu thành N vòng. Mỗi vòng có N-1 cặp đội đấu với nhau. (Như vậy mỗi vòng sẽ có 1 đội được nghỉ). Lập chương trình xếp lịch thi đấu sao cho mối đội sẽ chơi N-1 trận ở sân nhà và N-1 đội ở sân khách.Dữ liệu vào: số đội bóng M (M<=100) được nhập từ bàn phím.Dữ liệu ra: file Lich.Out với nội dung như sau:+ Dòng thứ i là lịch thi đấu ở vòng thứ i. Mỗi dòng gồm N-1 cặp số viết dưới dạng x-y cách nhau bởi một khoảng trống. Có nghĩa đội x sẽ chơi với đội y trên sân x

Bài 127/2002 - Bảng Quảng CáoTrên quảng trường trung tâm thủ đô Rome có một bảng quảng cáo hình chữ nhật gồm N x M ô vuông. Mỗi ô có một bóng đèn, mỗi bóng đèn có 2 trạng thái tắt hoặc sáng, ứng với mỗi dòng cũng như mỗi cột có một công tắc. Khi tác động đến một công tắc nào đó tất cả các bóng đèn trên dòng hoặc cột tương ứng sẽ đổi sang trạng thái ngược lại (đang sáng thành tắt, đang tắt được bật sáng). Để mừng đội nhà thắng trận trong trận cầu chiều qua người phụ trách bảng quảng cáo muốn bảng có được nhiều bóng sáng nhất. Với trạng thái bảng quảng cáo hiện thời cho trước, người phụ trách nhờ bạn lập trình tìm một phương án tác động lên các công tắc để nhận được trạng thái bảng quảng cáo mong muốn. Bạn hãy giúp nhà phụ trách thực hiện điều đó.Dữ liệu cho trong file văn bản với tên QUANGCAO.INP trong đó:- Dòng đầu chứa 2 số N và M (1≤ N≤ 10, 1≤ M≤ 100).- Dòng thứ i trong N dòng tiếp theo chứa M số 0 hoặc 1. Số thứ j cho biết trạng thái của bóng đèn thứ j trên dòng thứ i của bảng (1 tương đương với bóng đèn sáng, 0 tương đương với bóng đèn tắt).Kết quả ghi ra file QUANGCAO.OUT trong đó:- Dòng đầu là số bóng đèn sáng trên bảng bạn tìm được.- Dòng thứ hai chứa S là số lần bạn tác động lên các công tắc.- S dòng tiếp theo lần lượt ghi ra S công tắc theo trình tự cần bật. Dòng thứ i trong S dòng này chứa 1 xâu độ dài không quá 4, ký tự đầu là 'D' hoặc 'C' tương ứng với tác động thứ i là lên dòng hay lên cột. Phần còn lại của xâu là chỉ số của dòng hay cột tương ứng.

Page 12: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

12 Tin hoïc & Nhaø tröôøng

Ví dụ:QUANGCAO.INP4 41 0 0 10 1 1 00 1 1 01 0 0 1QUANGCAO.OUT164C1C4D1D4Ghi chú:- Các số trên một dòng được ghi cách nhau bởi ít nhất 1 khoảng trắng.- Không cần kiểm tra dữ liệu.Bài 128/2002 - Điền sốCác con số được sắp xếp trong hình tròn bên và nó tuân theo một quy luật nào đó. Bạn hãy thay dấu (?) bằng một con số và chỉ ra quy luật đó?

Bài 129/2002 - Những chiếc vòngLê Việt HưngCho N chiếc vòng (tên là số thứ tự từ 1 đến N, 2≤N≤200) trong đó mỗi chiếc vòng có thể được lồng với một số chiếc vòng khác.Yêu cầu:Tìm số vòng ít nhất bị cắt để không có hai vòng bất kỳ nào lồng nhau.File vào: CAT.INPDòng đầu chứa số N. Tiếp theo gồm một số dòng, mỗi dòng chứa hai số: i, j (là số vòng thứ i được lồng với vòng thứ j)File ra: CAT.OUT Dòng 1: Ghi số MIN là số vòng ít nhất bị cắt.Dòng 2: Ghi MIN số, là số hiệu của các vòng bị cắt.Ví dụ:

Page 13: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 13

Bài 130/2002 - Xếp các khối đáNguyễn Mậu KiênBa bạn Kiên, Hùng, Thành chơi rất thân với nhau, bạn Hùng học chuyên Toán còn hai bạn Thành và Kiên học lớp chuyên Tin. Một lần, bạn Hùng mang ra N khối đá ( N ≤ 5000 ), các khối đá đều có dạng hình hộp chữ nhật và được đặc trưng bởi 3 kích thước. Một cách xây tháp là cách đặt một số khối đá trong các khối đã cho chồng lên nhau theo quy tắc: - Chiều cao của mỗi khối đá là kích thước nhỏ nhất trong 3 kích thước.- Các mép của các khối được đặt song song với nhau sao cho không có phần nào của khối trên nằm chìa ra ngoài khối dưới. Trong lúc các bạn còn đang ngạc nhiên, Hùng nói:'Bây giờ, từ N khối đá này, Thành hãy giúp tớ xây được một cái tháp để số các khối đá còn lại sau khi xây là ít nhất. Còn Kiên, cậu chờ Thành làm xong rồi xây cho tớ cái tháp có chiều cao lớn nhất cũng từ N khối đá này nhé! Được không!'Thành và Kiên cười : 'Chuyện nhỏ! Cái món này thì đúng sở trường của dân Tin bọn anh rồi chú em ạ!. Hùng khoanh tay: 'Thì cứ thử xem !. Và ngay lập tức, Kiên và Thành bắt tay vào làm.Còn bạn, bạn còn chờ gì nữa mà không thử sức với bài toán tin này. Dữ liệu vào: Hung.inp ghi thông tin về các khối đá mà Hùng đem ra:- Dòng đầu là số N.- N dòng sau, dòng thứ i ghi 3 số nguyên dương không quá 255 là kích thước của khối đá thứ i. Dữ liệu ra: Kien.out ghi cách xếp tương ứng với câu Hùng hỏi Kiên:- Dòng đầu là số khối đá của tháp- Các dòng sau mỗi dòng ghi các khối đá theo thứ tự từ đáy tháp lên đỉnh tháp, mỗi dòng một số theo thứ tự là: T, D, R, C, trong đó T là số hiệu khối đá, D là chiều dài, R là chiều rộng và C là chiều cao của khối đá tương ứng.Thanh.out ghi cách xếp tương ứng với câu Hùng hỏi Thành theo quy cách giống như trên. Với mọi bộ dữ liệu thoả mãn, chương trình của bạn không được chạy quá 5 giây và nếu dưới 3 giây thì càng tuyệt vời (đặt {$R-}). Ví dụ:

Bài 131/2003 - Mừng tuổiMùng 1 tết, Bố Hoa mừng tuổi cho 9 chị em Hoa. Đứa thứ nhất được 1 đồng và 1/10 số tiền còn lại, đứa thứ 2 được 2 đồng và 1/10 số tiền còn lại,.. ,đứa thứ 8 được 8 đồng và 1/10 số

Page 14: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

14 Tin hoïc & Nhaø tröôøng

tiền còn lại, còn lại là số tiền mừng tuổi của đứa thứ 9. Cả 9 đứa đều nhận được số tiền như nhau. Hỏi số tiền bố đã mừng tuổi cho chị em Hoa là bao nhiêu?

Bài 132/2003 - Mật thư toạ độNguyễn Tất ThắngTrong một kỳ hội trại của trường X, anh phụ trách viết một bảng chữ cái có kích thước tuỳ ý (5< n,m<110) chứa nội dung là các chữ được sắp xếp không theo thứ tự thậm chí các ký tự lặp lại và có cả ký tự số. Anh phụ trách đưa ra một tờ giấy trong đó chứa các toạ độ (x,y) để các em giải. Cách giải: là chiếu theo toạ độ ngang và dọc để tìm ra chữ cái ứng với vị trí (x,y). Dữ liệu vào: Lấy từ file văn bản MATTHU.INP - Dòng đầu tiên chứa 3 số n,m,s (n: dòng, m: cột, s: số toạ độ) - n dòng tiếp theo mỗi dòng chứa m ký tự của bảng, mỗi ký tự được cách nhau bởi dấu cách. - s dòng sau ghi các toạ độ của mật thư (x,y) cách nhau bởi dấu cách. Kết quả: ghi ra file MATTHU.OUT Ghi ra s ký tự tương ứng với s toạ độ của mật thư. Ví dụ: MATTHU.INP A B C D E F G H I J K L M N O P Q R (2,2) (1,1) (1,6) (3,2) (3,3) MATTHU.OUT H A F N O Bạn hãy lập chương trình giải mật thư Nguyễn Tất Thắng [email protected]

Bài 133/2003 - Đổ nướcNgô Khắc ToảnCó 2 bình đựng nước: bình 1 có dung tích dl1 lít, bình 2 có dung tích dl2 lít. Hãy chỉ ra cách đong để có được dl lít nước.Dữ liệu vào : Lấy từ file văn bản có tên là DONUOC.INP có cấu trúc như sau : Dòng đầu là dung tích của bình 1 (dl1).Dòng thứ 2 là dung tích của bình 2 (dl2).Dòng cuối cùng là dung tích nước cần lấy (dl).Điều kiện: 10000≥ dl1 ≥ dl2 > 0 , 0 < dl≥ 20000. Kết quả ra: Ghi ra file văn bản DONUOC.OUT có cấu trúc như sau: i dòng đầu tiên ghi thứ tự các bước đổ và dung tích của bình 1 và bình 2 sau mỗi lần đổ. Nếu có cách đổ thì dòng cuối cùng ghi từ CO, còn nếu không có cách đổ thì dòng cuối cùng ghi từ KHONG CO.

Page 15: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 15

Bài 134/2003 - Xếp gạch trên nền nhàLê Quang TrựcCho một nền nhà kích thước n*n. Để lát gạch cho nền người ta dùng những viên gạch hình thước thợ kích thước 3 đơn vị diện tích. Để có chỗ thoát nước cho nền nhà người ta khoét một lỗ cống có kích thước 1 đơn vị diện tích. (Xem hình).

Yêu cầu: Hãy nêu ra cách sắp xếp các viên gạch lên nền nhà sao cho chừa ra một lỗ cống không bị gạch xếp lên (toạ độ ô lỗ cống cho trước). Dữ liệu vào 2 tệpXepgach.inpChứa số n và toạ độ lỗ cống (i,j)Xepgach.out: Chứa phương án lát nền vừa tìm được. Nếu không xếp được thì dòng đầu tiên ghi ″BAI VO NGHIEM ″, nếu tồn tại cách xếp thì ghi thành N dòng, mỗi dòng N số nguyên không âm cách nhau bởi dấu cách. Tại vị trí hàng i cột j ghi số k có ý nghĩa như sau: k= 0 nếu (i,j) là vị trí lỗ cống, k > 0 là số thứ tự của viên gạch tại vị trí (i,j)

Dữ liệu Xepgach.out như trên mô tả cách xếp gạch như sau

Page 16: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

16 Tin hoïc & Nhaø tröôøng

Bài 135/2003 - Hãy giúp Hoàng tử Ivan

Trên đường đi cứu nàng công chúa Êlêna xinh đẹp, hoàng tử Ivan phải đi qua một hòn núi có một vị hung thần canh giữ. Vị thần nói: "Ta sẽ nghĩ 3 số bất kỳ a,b,c trong các số từ 1 đến 9. Hãy nói cho ta 3 số tự nhiên x,y,z bất kỳ trong các số từ 1 đến 100. Khi đó ta sẽ nói cho ngươi tổng ax+by+cz. Hãy đoán xem, ta đã nghĩ 3 số nào. Nếu không đoán được, ta sẽ chém đầu ngươi. Nếu đoán đúng ta sẽ cho ngươi đi qua ". Hoàng tử rất lo lắng. Em có giúp Hoàng tử được không?

Bài 136/2003 - Đặt bomLê Việt HưngSau khi Israel chiếm đóng một số thành phố của Palestine bằng xe tăng, tổ chức hồi giáo cấp tiến Hamas quyết định tổ chức đợt đánh bom phá huỷ toàn bộ xe tăng của Israel. Vào ban đêm các xe tăng của Israel không di chuyển và đứng yên ở một vị trí xác định. Thành phố được thể hiện bởi ma trận vuông A: n x n, trong đó A[i,j]=1 có xe tăng, ngược lại thì A[i,j]=0. Hãy lập chương trình tìm số bom ít nhất mà tổ chức Hamas cần dùng, biết các quả bom là như nhau và nếu một quả bom nào đó được đặt tại vị trí [i,j] thì các vị trí sau xe tăng sẽ bị phá huỷ : [i,j], [i,j+1], [i+1,j], [i+1,j+1] (nếu có xe tăng ở đó) Dữ liệu vào: BOM.INP Dòng 1: ghi số n (2<=n<=150) Phần tiếp theo là ma trận A Dữ liệu ra: Bom.out Dòng 1: ghi số m là số bom ít nhất cần để phá huỷ toàn bộ các xe tăng. Trong m dòng tiếp theo là toạ độ các vị trí đặt bom (các số trên một dòng ghi cách nhau ít nhất một dấu cách). Ví dụ: Bom.inp41 0 0 10 1 1 1 0 1 0 11 1 0 0 Bom.out41 11 33 13 4Lê Việt Hưng Trường THPT Năng Khiếu Hàn Thuyên Bắc Ninh - Tỉnh Bắc Ninh; Bài 137/2003 - Tạm biệt người bạn của tôiLiz và Lilly đã từng là hai người bạn rất thân thiết nhưng gần đây do một số bất đồng không thể tháo gỡ nên cuối cùng họ đã quyết định nói lời chia tay với nhau. Họ đều nói: ″Tao không muốn thấy mặt mày thêm lần nào nữa! Tao sẽ xếp những khối đá sao cho dù đi đâu tao cũng không nhìn bao giờ thấy mặt mày nữa!″

Page 17: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 17

Họ sống trong một ngôi làng nhỏ được chia thành lưới ô vuông kích thước n*n. Liz thường sống ở góc trên bên trái lưới (vị trí (1,1)) và Lilly sống ở góc dưới bên phải lưới (vị trí (n,n)). Mỗi ô vuông có thể là khu đất trống, hồ nước hoặc khối đá. Họ không thể đi qua khối đá hoặc hồ nước. Họ không thể nhìn xuyên qua khối đá nhưng họ có thể nhìn qua khu đất bằng hoặc hồ nước. Khi di chuyển, họ chỉ có thể đi theo bốn hướng: bắc, nam, đông, tây và mỗi lần chỉ đi qua được một ô vuông. Cả hai người đều bị cận nên họ chỉ có thể nhìn không quá k ô vuông (cùng hàng hoặc cùng cột) ở trước mặt họ. Họ không thể đi hay nhìn qua các ô nằm chéo nhau. Vì cả hai rất lười nên họ chỉ muốn xếp số khối đá ít nhất. Mỗi khối đá chỉ có thể xếp vào một ô vuông mà một trong hai cô gái có thể đi đến từ nhà mình. Hãy nhớ, họ đều không muốn xếp những khối đá quá gần nhà mình, do đó mỗi khối đá phải nằm ở ô vuông cách nhà họ ít nhất m ô vuông. Khoảng cách giữa hai lưới ô vuông (x1,y1), (x2,y2) được tính là |(x1 - x2)| + |(y1 - y2)|.

Dữ liệu vào: Lấy từ file văn bản friend.inp - Dòng đầu tiên chứa 3 số nguyên n, k, m (5≤n≤20, 1≤k≤n, 1≤m≤n) cách nhau bởi một ký tự trống. - Dòng thứ i trong n dòng tiếp theo, mỗi dòng chứa n ký tự viết hoa chỉ sơ đồ ngôi làng. Ký tự ′O′ chỉ hồ nước, ′*′ chỉ khối đá và ′.′ chỉ khu đất trống.

Dữ liệu ra: Đưa ra file văn bản friend.out:- Dòng đầu là số khối đá ít nhất cần xếp để ngăn cách hai người. - Các dòng tiếp theo là toạ độ đặt các khối đá, trên mỗi dòng các toạ độ cách nhau bởi một dấu cách.Nếu không tìm được kết quả, hãy hiển thị số −1 trên dòng tương ứng.Ví dụ:friend.inp 7 4 4 ....... ...... *.... * O.* *. *. O.... *.... O O.. *........

friend.out22 64 3 (Không cần kiểm tra dữ liệu vào)

Bài 138/2003 - Qua sôngCó 5 người gồm 3 người lớn và 2 trẻ em muốn qua sông. Trên sông chỉ có một con thuyền và thuyền này chỉ chở được một người lớn hoặc 2 trẻ em. Em hãy cho biết bằng cách nào họ có thể qua sông biết rằng cả người lớn và trẻ em đều biết chèo thuyền. Tính tổng quãng đường con thuyền đã đi nếu khoảng cách giữa hai bờ sông là 100m.

Page 18: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

18 Tin hoïc & Nhaø tröôøng

Bài 139/2003 - Đổi TiềnĐỗ Đức ĐôngMột ngân hàng có N loại tiền mệnh giá A[1],A[2],..A[N] với số tiền không giới hạn cần chi trả cho khách hàng một số tiền M đồng.Cho biết M,N,A[i] là các số nguyên và N≤100;M≤32000; Yêu cầu: Tìm cách trả sao cho số lượng tờ là ít nhất. + Dữ liệu vào file ″DOITIEN.INP″ có dạng Dòng 1 ghi 2 số N,M Dòng 2 ghi N số nguyên dương A[1],A[2],..,A[N] + Kết quả ra file ″DOITIEN.OUT″ có dạng Nếu không có cách trả ghi ra file một dòng duy nhất ″No Solution″ Nếu có cách trả dòng một ghi ra số lượng tờ ít nhất phải trả, dòng 2 ghi N số ứng với số tờ cần trả cho mỗi loại tiền. Ví dụ:

Bài 140/2003 - Thang MáyMột toà nhà gồm có N tầng đánh số từ 1 đến N (N≤100), và chỉ có một thang máy để phục vụ. Trong một ngày, có tất cả M yêu cầu vận chuyển bằng thang máy (M≤100), mỗi yêu cầu được mô tả bằng 2 số a, b cho biết cần vận chuyển hàng từ tầng a đến tầng b. Do yêu cầu vận chuyển nên thang máy không thể phục vụ 2 yêu cầu cùng một lúc mà phải xong một yêu cầu mới đến yêu cầu khác. Tuy nhiên người ta có thể thay đổi thứ tự thực hiện các yêu cầu. Bài toán đặt ra là tìm thứ tự thực hiện các yêu cầu sao cho tổng quãng đường thang máy phải đi là ít nhất. Thang máy ban đầu xuất phát từ tầng 1.Input: Cho trong file text Elevator.dat : Dòng đầu là 2 số N, M. M dòng tiếp theo, dòng thứ i ghi 2 số a, b mô tả yêu cầu thứ i. Output: File Elevator.out có cấu trúc: Dòng đầu là tổng quãng đường tìm được. Dòng thứ hai mô tả thứ tự thực hiện các yêu cầu bởi một hoán vị của 1, 2,..., M. Ví dụ:

Bài 141/2003 - Những đồng tiền vàngBốn anh em chia nhau 45 đồng tiền vàng. Nếu cho người thứ nhất thêm 2 đồng, bớt đi của người thứ hai 2 đồng, tăng gấp đôi số tiền của người thứ 3 và giảm một nửa của người thứ 4 thì bốn anh em có số tiền bằng nhau. Hỏi mỗi người có bao nhiêu tiền?. Bài 142/2003 - Tô màu cho bảng

Page 19: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 19

Đỗ Đức ĐôngTrên lưới gồm NxN ô vuông (N dòng và N cột), N<=100, người ta chọn một số ô bằng cách cho một mảng A[1..N,1..N] trong đó A[i,j]=1 nếu ô [i,j] (dòng i cột j) được chọn và A[i,j]=0 nếu ô không được chọn. Yêu cầu: Hãy tìm cách tô màu một số nhiều nhất có thể được các ô được chọn sao cho trên mọi dòng và trên mọi cột đều có không quá một ô được tô màu. Dữ liệu vào: đựơc cho trong file TOMAU.INP có cấu trúc như sau: Dòng 1 ghi số N, dòng thứ i trong số N dòng tiếp theo lần lượt ghi các số A[i,1],A[i,2],.. , A[i,N], i=1..N. Kết quả: ghi ra file TOMAU.OUT: Dòng đầu ghi số lượng k các ô được tô màu. Dòng thứ i trong k dòng tiếp theo ghi chỉ số dòng và chỉ số cột của ô thứ i, i=1..N.

Bài 143/2003 - Xếp hàng mua véLưu Văn MinhCó N người sắp hàng mua vé dự buổi hoà nhạc. Ta đánh số họ từ 1 đến n theo thứ tự đứng trong hàng. Mỗi người cần mua một vé, song người bán vé được phép bán cho mỗi người tối đa 2 vé. Vì thế một số người có thể rời hàng và nhờ người đứng trước mình mua hộ vé. Biết ti là thời gian cần thiết để người i mua xong vé cho mình. Nếu người i+1 rời khỏi hàng và nhờ người i mua hộ vé thì thời gian để người thứ i mua được vé cho cả hai người là ri. Yêu cầu: Xác định xem những người nào cần rời khỏi hàng và nhờ người đứng trước mua vé để tổng thời gian phục vụ bán vé là nhỏ nhất. Dữ liệu: Vào từ file TICK.INP. - Dòng đầu tiên chứa số n (1<N<2001) - Dòng thứ 2 ghi N số nguyên dương t1, t2,.. ,tn. - Dòng thứ 3 ghi N-1 số nguyên dương r1, r2,.. ,rn-1. <N<2001) Kết quả: Ghi ra file văn bản TICK.OUT. - Dòng đầu tiên ghi tổng số thời gian phục vụ. - Dòng tiếp theo ghi chỉ số của các khách hàng cần rời khỏi hàng (nếu không có ai cần rời khỏi hàng thì quy ước ghi một số 0). <N<2001) Ví dụ:

Bài 144/2003 - Điệp Viên (Lê Việt Hưng)Một tổ chức tình báo trung ương được giao nhiệm vụ rất quan trọng. Tổ chức này đã cử ra N điệp viên tốt nhất để làm việc, và chia N điệp viên này thành 2 nhóm hoạt động riêng rẽ nhau. Trong N điệp viên trên có thể có hai điệp viên bất kỳ nào đó biết về nhau, nên để đảm bảo tính khách quan và bí mật cho việc điều tra, ban lãnh đạo cục tình báo không thể cho hai điệp viên bất kỳ trong một nhóm biết nhau. Cho trước số điệp viên N và mối quan hệ quen biết của các điệp viên này, bạn hãy lập trình tìm cách chia thành hai nhóm điệp viên hoạt động riêng rẽ (mỗi nhóm ít nhất phải có một người). Sau khi ban lãnh đạo đã biết được rằng nếu có cách phân chia thì họ lại đặt ra một yêu cầu là: trong M cách phân chia tìm được thì cần phải thực thi cách phân chia sao cho độ chênh lệch số điệp viên của hai nhóm là ít nhất. Dữ liệu vào: cho trong file SPIER.INP

Page 20: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

20 Tin hoïc & Nhaø tröôøng

Dòng đầu chứa số N là số điệp viên (2≤N≤7000). Tiếp theo là một số dòng, mỗi dòng chưa 2 số là số hiệu của hai điệp viên biết về nhau. Kêt quả: ghi ra file SPIER.OUT Dòng thứ nhất ghi số M là số cách phân chiăbiết rằng dữ liệu sẽ đảm bảo cho M không vượt quá 17 chữ số). Nếu M>0 thì ghi cách chia: - Dòng thứ hai ghi số hiệu các điệp viên trong nhóm thứ nhất. - Dòng thứ ba ghi số hiệu các điệp viên trong nhóm thứ hai. Ví dụ: SPIER.INP 9 1 2 1 3 4 1 5 6 7 8 9 7 5 8 SPIER.OUT 4 2 3 4 5 7 1 6 8 9 Bài 145/2003 - Ông thợ cắt tócBa người đàn ông vào hiệu cắt tóc. Sau khi cắt xong cho người đàn ông đầu tiên, ông thợ nói: "Hãy nhìn vào ngăn kéo, đặt vào đó số tiền đúng như số tiền có trong ngăn, và lấy 2 đồng tiền trả lại". Ông thợ nói tương tự như vậy với người thứ hai và người thứ ba. Sau khi cả 3 người khách đã đi về, ông thợ cắt tóc phát hiện ra rằng trong ngăn kéo không còn một đồng tiển nào cả. Hỏi trước khi người khách đầu tiên trả tiền thì trong ngăn kéo có bao nhiêu tiền?

Bài 146/2003 - Cắt hình chữ nhậtVũ Mạnh HùngNgười ta dùng máy cắt để cắt một hình chữ nhật có kích thước MxN (N, M nguyên dương ≤ 100) thành một số ít nhất các hình vuông có kích thước nguyên dương và có các cạnh song song với cạnh hình chữ nhật ban đầu. Máy cắt khi cắt một nhát theo phương song song với một trong hai cạnh của hình chữ nhật đó. Dữ liệu vào từ file văn bản CUT.INP- Ghi 2 kích thước M,N cách nhau bởi dấu trắng. Kết quả: ghi ra file văn bản CUT.OUT - Dòng đầu ghi số k là số hình vuông được tạo ra. - Dòng thứ hai ghi các kích thước của k thình vuông đó. Ví dụ:

Bài 147/2003 - Khoán công việc

Page 21: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 21

Vũ Mạnh HùngCó một ông chủ khoán cho anh đầy tớ tuần tự n công việc bắt đầu từ thời điểm 0 (nghĩa là tại mỗi thời điểm anh ấy chỉ thực hiện một việc và phải thực hiện liên tục từ khi bắt đầu đến lúc kết thúc). Các công việc được đánh số từ 1 đến n (1<n ≤ 30000). Với mỗi công việc biết các thông tin như sau: - Thời gian thực hiện là Pi.

- Thời điểm phải hoàn thành là di. - Hệ số (để tính thưởng hay phạt) là Ci. Các giá trị được giả thiết là nguyên dương. Gọi ti là thời điểm kết thúc công việc i. + Nếu thời điểm này nhỏ hơn hay bằng di thì công việc thứ i được thưởng một lượng là Ci

(di-ti). + Trái lại sẽ bị phạt một lượng là Ci(ti- di). Giả thiết thời gian chuyển từ một công việc đến công việc kế tiếp là bằng 0. Yêu cầu :Tìm thứ tự thực hiện các công việc để hiệu số tổng lượng thưởng trừ đi tổng lượng phạt là lớn nhất. Dữ liệu vào: Vào từ file Working.INP. - Dòng đầu ghi số n. - Dòng thứ hai ghi các số Pi. - Dòng thứ ba ghi các số di. - Dòng thứ tư ghi các số Ci. Kết quả: Đưa ra file van bản Working.OUT. - Dòng đầu tiên ghi tổng lượng thưởng. - Dòng thứ hai ghi tổng lượng phạt. - Dòng thứ ba ghi số hiệu các công việc cần thực hiện theo thứ tự tìm được. Các số cách nhau bởi dấu cách. Ví dụ:

Bài 148/2003 - Những giỏ táoMột người phụ nữ mang 5 giỏ táo đỏ và trắng ra chợ bán. Trong mỗi giỏ có theo thứ tự là 20, 25, 30,35, 40 quả táo. Trong mỗi giỏ chỉ có hoặc toàn táo đỏ, hoặc toàn táo trắng. Sau khi bán hết một giỏ táo, người phụ nữ thấy rằng số táo đỏ còn lại ít hơn số táo trắng 2 lấn. Hỏi còn lại bao nhiêu quả táo đỏ?

Bài 149/2003 - Linh kiệnNguyễn Trung HảiMột xí nghiệp đặt hàng một công ty điện tử thiết kế một vi mạch gồm N vị trí linh kiện. Tại vị trí gắn linh kiện thứ i (1 <= i <= N) chỉ cho phép gắn 1 trong 1 số loại linh kiện tiêu chuẩn cho trước. Có tất cả M loại linh kiện tiêu chuẩn. Hiện tại trong kho, công ty chỉ còn K loại linh kiện (K <= M), mỗi loại có 1 cái. Công ty thì không muốn mua thêm linh kiện, vấn đề là liệu có thể chọn và sắp xếp các linh kiện sao cho phù hợp với yêu cầu đặt hàng hay không?

Page 22: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

22 Tin hoïc & Nhaø tröôøng

Input : file chip.inp. - Dòng 1 ghi 3 số M,N,K (1 <= M,N, K <= 100) - Trong N dòng tiếp theo, ở dòng thứ i ghi chỉ số các loại loại linh kiện có thể gắn ở vị trí i. - Dòng cuối ghi K số thể hiện K loại linh kiện hiện có ở công ty. Output: file chip.out: - Dòng 1 ghi "Yes" hoặc "No" tương ứng với có hoặc không có cách gắn các linh kiện vào đúng vị trí vi mạch. - Nếu là "Yes" dòng 2 ghi N số, số thứ i ghi chỉ số linh kiện gắn ở vị trí i. Ví dụ: Chip.inp 5 3 3 1 3 2 1 5 4 1 1 2 3 chip.out Yes 3 2 1

Bài 150/2003 - Chữ kýĐặng Quang HưngGiám đốc một công ty trách nhiệm hữu hạn muốn xin chữ kí của ông kiến trúc sư trưởng thành phố phê duyệt dự án xây dựng trụ sở làm việc của công ty. Ông kiến trúc sư trưởng chỉ ký vào giấy phép khi bà thư ký của ông ta đã ký duyệt vào giấy phép. Bà thư kí làm việc tại tầng thứ M của một toà nhà được đánh số từ 1 đến M, từ thấp lên cao. Mỗi tầng của toà nhà có N phòng được đánh số từ 1 đến N, từ trái sang phải. Trong mỗi phòng chỉ có 1 nhân viên làm việc. Giấy phép của bà thư kí ký duyệt khi có ít nhất một nhân viên ở mỗi tầng của toà nhà đã kí xác nhận. Một nhân viên bất kỳ có thể chỉ kí xác nhận vào giấy phép khi có ít nhất một trong các điều kiện sau được thoả mãn: * Nhân viên đó làm việc ở tầng 1 * Giấy phép đã được kí xác nhận bởi một nhân viên làm việc ở phòng liền kề (hai phòng được gọi là liền kề khi chỉ số phòng sai khác nhau một đơn vị) * Giấy phép được kí xác nhận bởi nhân viên làm việc ở phòng cùng số phòng ở tầng dưới. Mỗi nhân viên khi đã kí xác nhận đều phải có một chi phí nhất định. Hãy chỉ ra cách xin chữ kí sao cho xin được chữ kí của ông kiến trúc sư trưởng mà chi phí bỏ ra là ít nhất. Dữ liệu: Vào từ file Sign.Inp như sau: * Dòng đầu tiên ghi M, N (1 <= M <= 100; 1 <= N <= 500); * Dòng thứ i trong số M dòng tiếp theo ghi N số biểu diễn chi phí phải trả khi kí ở các phòng của tầng i. Các số cách nhau bởi một dấu cách. Kết quả: Ghi ra file: Sign.Out như sau: * Dòng đầu tiên ghi hai số F, K theo thứ tự là chi phí cần trả và số lượng phòng cần đi qua. * K dòng tiếp theo ghi thông tin của các phòng theo thứ tự cần đi qua, mỗi dòng ghi 2 số là số thứ tự tầng và chỉ số phòng tương ứng. Ví Dụ:

Page 23: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 23

Page 24: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

24 Tin hoïc & Nhaø tröôøng

Phần lời giảiBài 101/2002 - Bảng con 5x5(Dành cho học sinh Tiểu học)Ta biểu diễn bảng thành một lưới hình chữ nhật kích thước 15x23 ô và đánh dấu các ô chứa kí tự 1 là ô đen, các ô chứa kí tự 0 là ô trắng. Khi đó, lưới hình chữ nhật được đánh dấu như hình a.

Hình a.Và bảng con kích thước 5 x 5 cũng được biểu diễn như hình b.

Hình b.Đối chiếu hai hình trên ta thấy hình a chứa tất cả 2 hình có hình dạng như hình b.

Bài 102/2002 - Số nguyên tố đặc biệt(Dành cho học sinh THCS và THPT)Thuật toán rất đơn giản: từ các số nguyên tố có 2 chữ số ta lần lượt duyệt thêm các số vào đầu để số nhận được vẫn là số nguyên tố. Tiếp tục thêm cho tới khi đủ N chữ số.{$A+,B-,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q+,R+,S+,T-,V+,X+}{$M 16384,0,655360}uses crt;const fo ='output.txt';var n, dem, mu10, k :longint; f :text;function IsPrime(x:longint):boolean;var i,j:longint;begin IsPrime:=false;

Page 25: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 25

If (x = 3) or (x =2) then IsPrime:= true; If (x mod 3= 0) or (x mod 2=0) then exit; i:=-1; j:=trunc(sqrt(x)); Repeat Inc(i,6); Until (x mod i=0) or (x mod(i+2)=0) or (i>j); IsPrime:=i>j;end;procedure vet(i,x:longint);var j:byte;begin mu10:=mu10*10; if i>N then inc(dem) else for j:=1 to 9 do if IsPrime(x+j*mu10) then vet(i+1,x+j*mu10); mu10:=mu10 div 10;end;BEGIN clrscr; writeln('Nhap so N (2<=N<=9) !'); {Khong xet voi N = 1} write('N= '); readln(N); mu10:=10; dem:=0; for k:=11 to 99 do if IsPrime(k) then vet(3,k); assign(f,fo); rewrite(f); write(f,dem); close(f);END.

Bài 103/2002 - Trò chơi với ô chữ(Dành cho học sinh THPT)Thuật toán của bạn Phan Đắc Anh Huy - Lớp 9/16 - THCS Thái Nguyên - thành phố Nha Trang - Khánh Hoà: nếu có hàm vị trí(m: char):integer trả về vị trí của ký tự m trong bảng chữ cái thì số thứ tự của chuỗi anan-1an-2...a1 được tính theo công thức:F = vitri(an)*10n-1 + vitri(an-1)*10n-2 + vitri(an-2)*10n-3 +... + vitri(a1) (CT này sai, có lẽ là do bạn nhầm lẫn). Sửa lại là: F = vitri(an)*26n-1 + vitri(an-1)*26n-2 +vitri(an-2)*26n-3 +...+ vitri(a1) Ta lập các hàm nhân, chia, cộng, trừ với các số khổng lồ, tuy nhiên trong bài toán chỉ sử dụng phép chia cho 26 nên ta chỉ viết hàm riêng về phép chia một số lớn cho một số nhỏ chứ không cần viết một hàm tổng quát chia hai số lớn.Để tìm vị trí tương ứng với một số, ta tìm số dư của số đó cho 26 rồi lấy số đó chia cho 26 cho đến khi nào số đó bằng 0, mỗi số dư tìm được là vị trí của các chữ cái trong từ cần tìm tính từ cuối lên.

Page 26: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

26 Tin hoïc & Nhaø tröôøng

Sau đây là lời giải của bạn Nguyễn Việt CườngProgram bai103;{$B-,R+,Q+}{$M 65500, 0, 655360}const maxN = 26; fi ='GAME.INP'; fo = 'GAME.OUT';type mang1 = array[0..100] of byte; mang2 = array['a'..'z'] of byte;var ai, ao: mang1; id: mang2; si, so: string; f: text;procedure KhoiTao;var s: string; c: char; i: byte;begin fillchar(ai, sizeof(ai), 0); assign(f, fi); reset(f); readln(f, s); readln(f, si); close(f); ai[0] := ord(s[0]); for i := 1 to ai[0] do ai[i] := ord(s[i]) - ord('0'); for c := 'a' to 'z' do id[c] := ord(c) - ord('a') + 1;end;procedure Cong(var a: mang1; x: byte); var n, i, tg: byte;begin n := a[0]; i := 1; repeat tg := a[i]; a[i] := (a[i] + x) mod 10; x := (tg + x) div 10; inc(i); until (i > n) or (x = 0); while x <> 0 do begin inc(n); a[n] := x mod 10;

Page 27: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 27

x := x div 10; end; a[0] := n;end;procedure Tru(var a: mang1; x: byte);var i: byte;begin i := a[0]; while (x <> 0) and (i >= 1) do begin if a[i] >= x then begin a[i] := a[i] - x; x := 0; end else begin a[i] := a[i] + 10 - x; x := 1; end; dec(i); end; if (a[0] > 1) and (a[0] = 0) then begin for i := 1 to a[0] - 1 do a[i] := a[i+1]; dec(a[0]); end;end;procedure Nhan(var a: mang1; x: byte);var n, i, tg, du: byte;begin n := a[0]; i := 1; du := 0; for i := 1 to n do begin tg := a[i]; a[i] := (tg*x + du) mod 10; du := (tg*x + du) div 10; end; while du <> 0 do begin inc(n); a[n] := du mod 10; du := du div 10; end;

Page 28: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

28 Tin hoïc & Nhaø tröôøng

a[0] := n;end;function Chia(var a: mang1; x: byte): byte;var b: mang1; i: byte; du: integer;begin du := 0; i := 0; while (du < x) and (i < a[0]) do begin inc(i); du := du*10 + a[i]; end; b[0] := 0; while (i <= a[0]) do begin inc(b[0]); b[b[0]] := du div x; du := du mod x; inc(i); if i <= a[0] then du := du*10 + a[i]; end; Chia := du; a := b;end;procedure Encode(s: string; var a: mang1);var i: byte;begin a[0] := 1; a[1] := 0; Cong(a, id[s[1]]); for i := 2 to length(s) do begin Nhan(a, 26); Cong(a, id[s[i]]); end;end;procedure Decode(a: mang1; var s: string);var du: byte;begin s := ''; repeat du := Chia(a, 26); if du = 0 then

Page 29: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 29

begin du := 26; Tru(a, 1); end; s := chr(du + ord('a') - 1) + s; until (a[0] = 1) and (a[1] = 0);end;procedure XuLy;var i: byte;begin assign(f, fo); rewrite(f); Encode(si, ao); for i := ao[0] downto 1 do write(f, ao[i]); writeln(f); Decode(ai, so); write(f, so); close(f);end;BEGIN KhoiTao; XuLy;END.Bài 104/2002 - Dấu phép tính(Dành cho học sinh Tiểu học)Câu hỏi của bài toán hình như có vẻ 'đánh lừá chúng tả Các bạn thấy không, bạn chớ nên đi xét ngay các khả năng dấu phép toán với phép tính thứ nhất mà hãy để ý đến phép tính thứ hai: 8 A 4 B 3 C 2 = 9, phép tính này sẽ có ít khả năng để trở thành phép tính đúng nhất. Ta chỉ tìm được duy nhất 1 trường hợp, đó là: 8 - 4 + 3 + 2 = 9.Với các dấu phép toán này nếu thay vào phép tính thứ 3 ta sẽ tìm được dấu hỏi chấm (?) là số 2. Nhưng nếu thay vào phép tính thứ nhất thì phép tính này không thoả mãn.Vậy không tìm được các dấu phép toán để thay thế cho các chữ cái để thực hiện ba phép tính đúng, do đó ta cũng không tìm được giá trị số thay cho dấu hỏi chấm ở phép tính cuối cùng.

Bài 105/2002 - Dãy con dài nhấtBạch Tuyết(Dành cho học sinh THCS và THPT)Program Day_con_dai_nhat;Uses crt;Const fn='dayso.inp'; gn='dayso.out'; maxk=10000;Var f,g:text; n,k,max,cs:longint;

Page 30: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

30 Tin hoïc & Nhaø tröôøng

A:array[0..maxk-1]of longint;Procedure Nhap_xuly;Var i,du,new:longint;Begin Assign(f,fn); Reset(f); Readln(f,n,k); du:=0; max:=0; Fillchar(A,sizeof(A),0); For i:=1 to n do begin Read(f,new); du:=(dunew) mod k; new:=(new+k-du) mod k; If A[new]=0 then A[new]:=i; new:=(k-du) mod k; If (A[new]<>0)and(i-A[new]+1>max) then begin cs:=A[new]; max:=i-cs+1; End; End; Close(f);End;Procedure Inra;Begin Assign(g,gn); Rewrite(g); Writeln(g,max,cs:8); Close(g);End;Begin Nhap_xuly; Inra;End.(Lời giải của bạn Bạch Tuyết - [email protected])

Bài 106/2002 - Tổng trở của mạch điện (Dành cho học sinh THPT){$A+,B-,D+,E+,F-,G-,I+,L+,N-,O,P-,Q+,R+,S+,T-,V+,X+,Y+}{$M 16384,0,655360}program TongDienTro;uses crt;const inp='mach.inp'; out='mach.out';

Page 31: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 31

MaxLength=250;var r:array ['A'..'Z'] of real; Exp:array [1..MaxLength] of char; Length:0..maxLength; Pos,n:integer; ValidExpression: boolean; s:real; {Tong dien tro} f:text;

procedure ReadFileInput;const EndMark='$';var f:text; c:char; num:real; i:byte;begin assign(f,inp); reset(f); length:=0; fillchar(r,sizeof(r),0); readln(f,n); while not seekeoln(f) do begin length:=length+1; read(f,exp[length]); end; readln(f); exp[length+1]:=EndMark; for i:=1 to n do begin readln(f,c,num); r[upcase(c)]:=num end; close(f);end;

procedure GetChar(var Pos:integer; var NextSymbol:char);begin pos:=pos+1; While exp[pos]=' ' do inc(pos); nextSymbol:=exp[pos]end;

procedure CheckForExpression(var pos:integer; var Valid:boolean; var GT:real); Forward;

Page 32: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

32 Tin hoïc & Nhaø tröôøng

procedure CheckForFactor(var Pos:integer; var Valid: boolean; var GT:real);var Symbol:char; GT1:real;begin GetChar(pos,Symbol); if Symbol='(' then begin CheckForExpression(pos,Valid,GT); if Valid then begin GetChar(Pos,Symbol); if Symbol<>')' then Valid:=false; end end else if Symbol in ['A'..'Z','a'..'z'] then begin Valid:=true; GT:=r[upcase(symbol)]; end else Valid:=false;end;

procedure CheckForExpression;var Symbol:char; GT1:real;begin CheckForFactor(pos,valid,GT); if Valid then begin GetChar(pos,Symbol); if Symbol in ['+','*'] then begin CheckForFactor(pos,Valid,GT1); if symbol='+' then GT:=GT+GT1 else GT:=1/(1/GT+1/GT1); end else pos:=pos-1; end;end;

begin readFileInput; Pos:=0; CheckForExpression(pos,ValidExpression,s);

Page 33: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 33

assign(f,out); rewrite(f); if ValidExpression and (pos=length) then writeln(f,s:10:2) else writeln(f,'Bieu thuc khong hop le'); close(f);end.(Lời giải của bạn Nguyễn Trường Đức Trí - 301 Lê Văn Sỹ - Phường 1 - quận Tân Bình - Tp. Hồ Chí Minh)

Bài 107/2002 - Số Palindrom có hai chữ sốTrong khoảng từ 10 đến 99 sẽ có đúng 3 số thỏa mãn điều kiện Palindrom, đó là các số: 11-->12122-->48426-->676

Bài 108/2002 - Tìm quy luật để lập ma trận vuôngCác bạn có thể để ý thật kỹ những ma trận vuông với N=3,4,6 thì sẽ thấy những quy luật của nó. Cụ thể : + Các phần tử trên đường viền sẽ bằng chỉ số trừ đi một đơn vịa[1,j ]:=j-1; a[i,1]:=i-1+ Đường chéo chính: Các số trên đường chéo chính (trừ ra phần tử cuối cùng) sẽ bằng tổng của bốn số xung quanh trừ đi 1.Phần tử a[n,n] =a[n-1,n]+a[n,n-1]+ Tam giác dưới: Xác định đường chéo phụ: Được tính theo quy luật : Số trước nó cộng chỉ số của cột. Các số còn lại được tính theo công thức: Số trên nó + chỉ số cột+ Tam giác trên:Đường chéo phụ: Số trước nó cộng với 4 lần chỉ số hàng Các số còn lại: Số trước nó cộng với chỉ số hàng. Chương trình của bài toán như sau: uses crt;var i,j,n,k:longint; a:array[0..101,0..101]of longint;BEGIN clrscr; write(' nhap n: '); readln(n); fillchar(a,sizeof(a),0); for i:=2 to n do begin j:=i-1; a[i,j]:=a[i-1,j-1]+j; for k:=i+1 to n do a[k,j]:=a[k-1,j]+j; end;

Page 34: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

34 Tin hoïc & Nhaø tröôøng

a[1,2]:=1; for k:=3 to n do a[1,k]:=k-1; for j:=3 to n do begin i:=j-1; a[i,j]:=a[i-1,j-1]+4*i; for k:=j+1 to n do a[i,k]:=a[i,k-1]+i ; end; for i:=2 to n-1 do a[i,i]:=a[i-1,i]+a[i+1,i]+a[i,i-1]+a[i,i+1]-1; a[n,n]:=a[n,n-1]+a[n-1,n]; for i:=1 to n do begin for j:=1 to n do write(a[i,j],''); writeln; end; readln;END.(Chương trình của bạn Dương Công Minh, 12A2 Chuyên Vĩnh Phúc, Vĩnh Yên, Vĩnh Phúc.)

Bài 109/2002 - Biểu thức chiaĐây là một bài toán tương đối khó. Rất nhiều bạn gửi lời giải lên Tòa soạn nhưng đều hoặc chưa có lời giải đúng hoặc chưa có lý giải đúng cho thuật toán của mình.Để tìm được thuật toán đúng cho bài toán chúng ta sẽ chứng minh mệnh đề toán học sau: Để biểu thức x1/x2/.../xn tồn tại một cách đặt dấu ngoặc trở thành giá trị nguyên, điều kiện cần và đủ là tồn tại một số xi (iạ2) sao cho tích của chúng chia hết cho x2. Trước khi chứng minh mệnh đề ta có nhận xét: biểu thức chia trên với mọi cách đặt dấu ngoặc thì luôn có dạng:

vậy x1 luôn nằm trên tử số, x2 luôn nằm dưới mẫu số. Điều kiện cần của mệnh đề là hiển nhiên suy từ nhận xét trên: do x2 luôn nằm ở mẫu số nên tích của các phần tử nằm trên tử số sẽ chia hết cho x2.Điều kiện đủ: giả sử tích của 1 số phần tử xi nào đó chia hết cho x2. Ta cần chứng minh rằng tồn tại một cách đặt dấu ngoặc sao cho biểu thức chia là nguyên.Nhận xét rằng (x/y)/z = x/yz do đó ta có thể 'ghép' các phần tử xi liền nhau lại nếu chúng cùng nằm tỏng nhóm (hoặc không cùng nằm trong nhóm) các phần tử có tích chia hết cho x2. Do vậy không mất tổng quát có thể giả thiết về hai trường hợp sau: (1): Tích x1x3x5... chia hết cho x2 (2): Tích x4x6x8... chia hết cho x2 Trong cả hai trường hợp trên ta đều dễ dàng tìm được cách ghép dấu ngoặc sao cho biểu thức chia sẽ có giá trị nguyên. Ví dụ: (1): x1/x2/x3/x4/x5 --->x1/(((x2/x3)/x4)/x5) (2): x1/x2/x3/x4/x5/x6 --->x1((x2/x3)/(x4/(x5/x6))) program bieu_thuc_chia;uses crt;const fi='div.inp'; fo='div.out';var

Page 35: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 35

f :text; n,i,j:integer; x :array[2..10000] of longint;procedure init;begin assign(f,fi); reset(f); readln(f,n); for i:=1 to n do readln(f,x[i]); close(f);end;function ucln(p,q:longint):longint;var nho:longint;begin repeat nho:=q; q:= p mod q; p:=nho; until q=0; ucln:=p;end;BEGIN {========== chuong trinh chinh=========}; init; assign(f,fo); rewrite(f); i:=0; repeat i:=i+1; if i<>2 then x[2]:=(x[2] div ucln(x[2],x[i])); until (i=n) or (x[2]=1); if x[2]=1 then writeln(f,'yes') else writeln(f,'no'); close(f);END.

Bài 110/2002 - Phân phối kênhĐây là một bài toán khá đơn giản và có rất nhiều ban làm được. Gọi C i là kênh sẽ gán cho khách hàng thứ i. Ban đầu ta gán mặc định Ci =1 với mọi i. Gọi maxC là số lượng kênh cần sử dụng Thuật toán được mô tả ngắn gọn như sau :Với mỗi i, i chạy từ 1 đến n, ta sẽ tìm cách gán lại giá trị Ci là số tự nhiên nhỏ nhất sao cho các thông số của khách hàng thứ i không mẫu thuẫn với các khách hàng thứ 1,2,..,i-1.Có thể mô phỏng thuật toán trên như sau:maxC=1;For i:=1 to n do Ci :=1;For i:=2 to n do

Page 36: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

36 Tin hoïc & Nhaø tröôøng

For j:=1 to i-1 doIf (si , ti) giao (sj,tj) then If Ci=Cj then Begin Ci:=Ci+1;If Ci > maxC then maxC:=Ci ;End;

Bài 111/2002 - Chia lưới ô hình chữ nhậtPhạm Thế PhongCó rất nhiều cách để chia ô lưới hình chữ nhật sao cho thoả mãn đề bài. Nhìn vào ô lưới của hình chữ nhật. Ta dễ dàng tính được tổng của tất cả các ô lưới là 189. Để chia lưới ra 7 phần sao cho các phần đều có tổng bằng nhau thì mỗi phần sẽ có tổng bằng189:7=27. Từ đây ta thực hiện được các cách chia ô lưới.Dưới đây là một cách chia ô lưới của bài toán.

Bài 112/2002 -N giai thừaDương Công MinhĐây là bài toán khá đơn giản, có rất nhiều thụât toán để giải. Nhưng để đưa ra một thụât toán hay, tối ưu thì không phải là dễ. Sau đây là một trong những thuật toán hay, các bạn có thể tham khảo:Thuật toán:Duyệt tất cả các số nguyên tố từ 2 đến n. Với mỗi số nguyên tố i (2<=i<=n), nếu phần nguyên của phép chia n cho i j >=1 ( 1<=j <= sqrt(n)) thì tăng biến đếm. Kết thúc vòng lặp, mảng đếm là kết quả của bài toán.Chương trình:Const Int='Lekhiet.inp'; Out='Lekhiet.out';Var F:text; M,n:longint; A:array[0..30001]of integer;Procedure Nhap; Begin Assign(f,int); Reset(f); Readln(f,n); Close(f); End;Function Kt(x:longint):boolean; Var i:longint;

Page 37: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 37

Begin Kt:=false; For i:=2 to trunc(sqrt(x)) do If x mod i=0 then exit; Kt:=true; End;Function Mu(k,h:longint):longint; Var i,j:longint; Begin I:=0; J:=h; While trunc(k/j)>=1 do Begin I:=i+trunc(k/j); J:=j*h; End; Mu:=i; End;Procedure Xuly; Var i:integer; Begin M:=0; For i:=2 to n do If kt(i) then Begin Inc(m); A[m]:=Mu(n,i); End; End;Procedure Xuat; Var i:integer; Begin Assign(f,out); Rewrite(f); For i:=1 to m do Write(f,a[i],' '); Close(f); End;BeginNhap;Xuly;Xuat;End.{Chương trình của bạn: Dương Công Minh 12A2 Chuyên Vĩnh Phúc - Tỉnh Vĩnh Phúc}Bài 113/2002 - Toà nhà thương mại thế giớiĐinh Xuân Hải

Page 38: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

38 Tin hoïc & Nhaø tröôøng

Thuật toán:- Duyệt các cách mà tên cướp có thể lấy đươc tiền.+ Điều kiện để tên cướp từ tầng i chuyển sang tầng j là : Về mặt thời gian: tg[j] + j - i + 15 <10*(k-i).Về lượng tiền: tổng tiền cách thứ i < tổng tiền cách thứ uluuii + số tiền có ở tầng i.+ Điều kiện để tên cướp từ tầng i có thể tiếp tục lấy tiền là: i+14 >= (k-i)*10.Với mỗi cách cần lưu tổng tiền, và số tầng mà tên cướp dừng lại để lấy tiền.- Tìm max của các tổng và đưa ra cách mà tổng đạt max.Program LayTien;Uses Crt;Const fi='WTC.INP'; fo='WTC.OUT'; Max=10000;Var T:Array[2..150] Of Integer; Fx:Array[2..Max] Of LongInt; Time:Array[2..150] of Integer; Truoc:Array[2..150] of Byte; K,N:Byte; t1:Integer; f1:Text;ProcedureNhap; Var f:Text; i: Byte;Begin Assign(f,fi); Reset(f); Readln(f,K); For i:=2 to K-1 do Read(f,T[i]); Close(f);End;ProcedureKhoiTao; Var i :Byte;Begin For i:=1 to 150 do Begin Time[i]:=0; Fx[i]:=0; End;End;Function Ke(i,j:Byte):Boolean; Var t:boolean;Begin t:=False ; if (Time[j]+j-i+15) < (10*(N-i)) then t:=True; Ke:=t;End;FunctionChay(i:Byte):Boolean; Var t:Boolean;

Page 39: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 39

Begin t:=False; If (i+14) õ‰O((k-i)*10) then t:=True; Chay:=t;End;ProcedureXuly; Var i,j: Byte;Begin i:=k-1; N:=K; while Chay(i)do dec(i); k:=i; Fx[k]:=T[k]; Time[k]:=k+14; for i:=k-1 downto 2 do For j:=i+1 to K do If (Ke(i,j))and(Fx[i]<fx[j]+t[i]) then Begin Truoc[i]:=j; Fx[i]:=Fx[j]+T[i]; Time[i]:=Time[j]+j-i+15; End;End;ProcedureViet(i:Byte);Begin If Truoc[i]<>0 then Begin Viet(Truoc[i]); Write(f1,Truoc[i],' '); End;End;ProcedureXuat; Var i, Luu:Byte; Max:LongInt;Begin Assign(f1,fo); ReWrite(f1); Max:=0; For i:=2 to K-1 do If Max<fx[i] then Begin Max:=Fx[i]; Luu:=i; End; Writeln(f1,Max); Viet(Luu); Write(f1,Luu);

Page 40: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

40 Tin hoïc & Nhaø tröôøng

Close(f1);End;Begin clrscr; KhoiTao; Nhap; Xuly; Xuat;End.(Chương trình của bạn: Đinh Xuân Hải 10A1 khối Phổ thông Chuyên Toán - Tin Đại học Vinh.)Nhận xét:Do không đọc kỹ đề nên hầu hết các bạn đưa ra thuật toán chưa chính xác. Với thuật toán các bạn đưa ra chỉ đúng trong trường hợp số tiền ở các tầng là một đã sắp tăng. Đối với dãy không sắp thì thuật toán không còn đúng nữa. Các bạn lưu ý: phải duyệt tất cả các cách có thể lấy được tiền sau đó tìm max của các tổng.Ví dụ:WTC.INP108 9 12 3 4 6 8 20 WTC.OUT307 6 4 2Các bạn có thể tự test và dựa vào thuật toán trên để sửa lại chương trình của mình. Chúc các bạn bài sau sẽ giải tốt hơn. Bài 114/2002 - Xoá bớt các chữ sốVới số đã cho thì số sau khi xoá có tối đa 9 chữ số. Lần lượt thử với 9,8,7 chữ số đều không thoả mãn điều kiện của bài toán. Với 6 chữ số ta được số: 865432 là số cần tìm.

Bài 115/2002 - Liệt kê các ô giao đường chéoTrước hết ta có nhận xét như sau:Các ô vuông có điểm chung với đường chéo của hình chữ nhật khi và chỉ khi đường chéo của hình chữ nhật cắt đường chéo của các ô vuông.Thuật toán:Giả sử f(x,y) là phương trình đường chéo của hình chữ nhật

Duyệt tất cả các ô (i,j). Xét các điểm (i+1,j), (i,j+1) với i=1…m,j=1…nNếu f(i+1,j)*f(i,j+1)<=0 (nghĩa là hai điểm (i+1,j), (i,j+1) nằm về hai phía khác nhau của đường chéo hình chữ nhật) thì in ra màn hình ô (i,j).

Chương trình:

Page 41: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 41

{R+}uses crt;type ii = longint;var m,n:ii;procedure doc;begin clrscr; write('M = '); readln(m); write('N = '); readln(n);end;function f(xdau,ydau,xcuoi,ycuoi,xm,ym:ii):ii;begin f:=(xm-xdau)*(ycuoi-ydau)-(ym-ydau)*(xcuoi-xdau);end;function cat(i,j:ii):boolean;begin cat:=f(1,1,m+1,n+1,i,j+1)*f(1,1,m+1,n+1,i+1,j)<=0;end;procedure inkq;var i,j,d:ii;begin d:=0; for i:=1 to m do for j:=1 to n do if cat(i,j)=true then begin write('(',i,',',j,') '); inc(d); if d mod 10 =0 then writeln; end; writeln; writeln('Nhan Enter de ket thuc...');end;begin doc; inkq; readln;end.{Chương trình của bạn Nguyễn Minh Tuấn - Lớp 11A2 – Trường THPT Chuyên Vĩnh Phúc – Tỉnh Vĩnh Phúc}Nhận xét:Do không đọc kỹ đề nên hầu hết các bạn đều áp dụng thuật toán Bresenham đăng trong tạp chí TH&NT số 3/2000 của tác giả Nguyễn Xuân Huy. Các bạn lưu ý thuật toán Bresenham

Page 42: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

42 Tin hoïc & Nhaø tröôøng

chỉ đúng trong trường hợp đường chéo của hình chữ nhật cắt các cạnh của ô vuông ít nhất tại hai điểm. Nhưng trong bài toán này, yêu cầu của đề là liệt kê các ô vuông có điểm chung với đường chéo (một hoặc hai điểm chung). Như vậy áp dụng thuật toán Bresenham trong trường hợp này là không tổng quát (chưa xét được trường hợp m=n).

Bài 116/2002 - Cân thăng bằngĐây là bài toán khá lý thú. Có rất nhiều cách giải khác nhau. Tuỳ theo thuật toán các bạn đưa ra mà phương pháp đặt các quả cân khác nhau. Sau đây là một trong các phương án cân các bạn có thể tham khảo:Thuật toán:Xét tất cả các quả cân. Với mỗi quả cân ta gán các trạng thái (-1/0/1). Lần lượt đặt các quả cân lên đĩa. + Nếu trạng thái của quả cân là -1 thì đặt trên đĩa cùng vật.+Nếu trạng thái của quả cân là 1 thì đặt trên đĩa còn lại.+Nếu trạng thái của quả cân là 0 thì để bên ngoài. +Gọi s là tổng trọng lượng của các quả cân đặt trên đĩa. Nếu s=p thì ta có một phương án. So sánh với phương án tối ưu. Nếu tối ưu đưa ra màn hình phương án đó. Program Bai116;Uses crt;const fn='can.inp'; gn='can.out'; maxc=30;var f,g: text; a,b,cung, nguoc: array[1..maxc] of integer; n,d,c,p,s,toiuu: integer; Check: Boolean;Procedure ReadFileInput;Var j: byte;Begin readln(f,n,p); for j:=1 to n do read(f,a[j]);end;procedure WriteFileOutput;var j:byte;begin if not check then begin write(g,'-1'); exit; end; write(g,c,' '); for j:=1 to c do write(g,cung[j],' '); writeln(g); write(g,d,' ');

Page 43: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 43

for j:=1 to d do write(g,nguoc[j],' ');end;Procedure Process;var j,dem: byte;begin if s=p then begin dem :=0; for j:=1 to n do if (b[j]=1) or (b[j]=-1) then inc(dem); If dem < toiuu then begin c:=0; d:=0; for j:=1 to n do begin if b[j] =1 then begin inc(d); nguoc[d]:=j; end; if b[j]=-1 then begin inc(c); cung[c]:=j; end; end; toiuu:=dem; end; check:=true; end;end;Procedure thucan(i:integer);var j : integer;begin If i>n then process else for j:=-1 to 1 do begin b[i]:=j; s:=s+j*a[i]; thucan(i+1); s:=s- j*a[i]; end;end;BEGIN

Page 44: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

44 Tin hoïc & Nhaø tröôøng

Check:=false; assign(f,fn); reset(f); assign(g,gn); rewrite(g); ReadFileInput; toiuu:=n; s:=0; Thucan(1); WriteFileOutput; Writeln('Chuong trinh da ket thuc'); close(f); close(g); readln;END.{Chương trình của bạn: Vo Thanh Dao - So nha 09 - Dinh Cong Trang – Phuong Nguyen Van Cu - TP Quy Nhon - Binh Dinh}Bài 117/2002 - Tìm giá trị số của các chữ cáiTừ đề bài ta thưc hiện phép tính:Y+2N=Y, N=0 hoặc N=5.Nếu N=5 thì T + 2E + 1=T Không có giá trị nào thoả mãn (loại N=0);Khi đó: T+2E=T+10hay E=5.Vì O và I cùng hàng nên, R+2T+1= X+10 hoặc R+2T+1=X+20;Nếu R+2T+1=X+10 thì O+1=I+10 (Vì F và S cùng hàng và khác nhau)O=9 và I=0 (loại vì N=0)Nên R+2T+1=X+20 (a)O + 2=I+10, O=9 và I=1.Và phép tính lúc này sẽ là:

Từ(a) R+2T=X+19 mà R,T,X khác 0,1,9,5.R+2T=20T có thể nhận giá trị 6,7,8.+Với T=6 R=X+7R=9, X=2 (loại vì O=9) hoặc R=8, X=1 ( loại vì I=1)+Với T=7 thay vào (a) R=X+5R=9, X=4 (loại vì O=9) hoặc R=8, X=3 hoặc R=7, X=2 (loại vì T=7) hoặcR=6, X=1( loại vì I=1);+Với T=8 thay vào (a) R=X+3 R=8, X=5 (loại vì E=5) hoặc R=7, X=4Nếu T=7, R=8, X=3 mà F, S là hai số tự nhiên liên tiếp nên F=6, S=7 (loại vìT=7) hoặc F=2, S=3 ( loại vì X=3)Nếu T=8, R=7, X=4 mà F, S là hai số tự nhiên liên tiếp nên F=2, S=3.Còn lại thì Y=6.Các giá trị nhận được là Y=6, T=8, R=7, O=9, F=2, E=5, N=0, I=1, F=2, S=3, X=4Vậy kết quả tìm được là:

Page 45: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 45

Bài 118/2002 - Biển đăng ký xe máyBiển xe máy của Tùng là số có 4 chữ số nên nó có dạng: Vì đó là một số chính phương nên d có thể nhận các giá trị:0,1,4,5,6,9.Theo đề bài thì b,a,c,d làm thành 4 số tự nhiên liên tiếp tăng dần nên d chỉ nhận được giá trị là 4,5,6,9.Từ điều kiện trên thì ta tìm được 4 số thoả mãn như sau:2134324543567689Trong 4 số trên chỉ có số 4356=662 là số chính phương.Vậy biển số xe máy của Tùng là 4356.Giải tốt bài tập này có bạn Lê Bá Quốc Thịnh - Lớp 9/1 TrườngTHCS Nguyễn Tri Phương-Huế; Đoàn Anh Quân − Lớp 9B − THCS Vĩnh Yên− T. Vĩnh Phúc;

Bài 119/2002 - Nối điểm không tạo thành tam giácThuật toán (chỉ với độ phức tạp rất nhỏ)Ta chia tập n điểm đã cho thành hai tập hợp điểm A và B sao cho số điểm trong mỗi tập chênh lệch nhau không quá một. Chẳng hạn, A là tập các điểm có chỉ số 1,2,..,n div 2; và B là tập các điểm còn lại. Nối lần lượt từng điểm trong tập A với các điểm trong tập B, ta sẽ chứng minh với cách nối như vậy sẽ thu được tập lớn nhất các đoạn thẳng (gồm |A|*|B| đoạn thẳng) thoả mãn yêu cầu bài toán. Thật vậy:Giả sử A={a1,a2,..,an div 2} và B = {bn div2 +1,..,bn} là các tập điểm.+ nếu n ≤3 thì rõ ràng theo thuật toán ta thu được số đoạn thẳng lớn nhất (số đoạn là 1 khi n =2 và là 2 khi n=3).+ nếu n>3 A và B đều có nhiều hơn một phần tử.Rõ ràng, ta không thể nối thêm được bất kỳ một đoạn thẳng dạng albk nào nữa (nối hai điểm lần lượt thuộc hai tập A và B) mà chỉ có thể nối thêm đoạn giữa hai điểm của cùng một tập hợp. Chẳng hạn, trong tập A, ta nối thêm được đoạn a lak thì ta phải xoá đi một đoạn nào đó có một đầu là al hay ak để thoả mãn điều kiện không tạo thành tam giác; và sau khi xoá ta phải nối thêm được ít nhất là một đoạn nữa để số các đoạn tăng lên. Giả sử, xoá cạnh a lbh

nào đó, và nối thêm được một cạnh alal'. Nhưng vì B có nhiều hơn một phần tử, nên ngoài bh

thì còn có bh' (≠bh) được nối với cả al và al'. Do vậy sau khi nối thêm thì lại tạo ra tam giác bhalal' Ta phải xoá đi một cạnh nào đó (bhal hoặc bhal') và lại phải nối thêm được ít nhất là một đoạn nữa... Nhưng do ||A|-|B||≤ 1, nên quá trình này không làm tăng thêm số đoạn thẳng được nối thêm.Program Ke_khong_tao_thanh_tam_giac;var n:integer;Procedure init;var f:text;Beginassign(f,'DIEM.INP');

Page 46: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

46 Tin hoïc & Nhaø tröôøng

reset(f);readln(f,n);close(f);End;Procedure Resolve;var f:text;k,i,j:integer;Beginassign(f,'DIEM.OUT');rewrite(f);k:=n div 2;writeln(f,k*(n-k));for i:=1 to k dofor j:=k+1 to n dowriteln(f,j,' ',i);close(f);End;Begininit;resolve; End.Nhận xét:Đây là một bài toán khá đơn giản, nếu mặc định trong N điểm đã cho không có 3 điểm bất kỳ nào thẳng hàng. Và như vậy việc cho toạ độ của các điểm trở nên thừa và có vẻ như đánh lừa học sinh. Nhưng để chương trình được hoàn thiện, chúng ta nên lập thêm hàm kiểm tra giả thiết trên, phục vụ cho việc nhập dữ liệu. Như vậy bài toán sẽ trở nên lý thú hơn, các bạn hãy thử xem. Bài 120/2002 - Bội số chung nhỏ nhấtThuật toán: áp dụng giải thuật quy hoạch độngGọi a[i,j] là giá trị lớn nhất của BSCNN khi phân tích i thành tổng của j số tự nhiên.b[i.j] là giá trị của số thứ j trong cách phân tích i thành tổng của j số tự nhiên để a[i,j] đạt max.Khởi tạo: a[i,1]:=ib[i,1]:=i (1≤j≤ i ≤N)Với mọi j (2≤j≤N) ta xét các khả năng phân tích i (j≤i≤N) để BSCNN của các cách phân tích đó đạt max.Ta có: a[i,j]:=max {BSCNN(a[i-t,j-1],t)} với 1≤t≤i-j+1; b[i,j]:=t;Giá trị lớn nhất trong các cách phân tích N bằng Max(a[n,i]) với 1≤i≤N.Program Bai120;uses crt;const fi='BSCNN.inp';fo='BSCNN.out';maxn=100;var a: array[1..maxn,1..maxn] of longint;b: array[1..maxn,1..maxn] of byte;n : integer;f: text;procedure init;

Page 47: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 47

beginassign(f,fi);reset(f);readln(f,n);close(f);end;function bscnn(x,y: longint):longint;var tg,i,j: longint;begini:=x;j:=y;while i mod j <>0 dobegintg:=j;j := i mod j;]i:=tg;end;bscnn:=(x*y)div j;end;procedure solution;var i,j ,t: integer;tg: longint;beginfor i:=1 to n dobegina[i,1]:=i;b[i,1]:=i;end;for j:=2 to n-1 dofor i:=j+1 to n dobegina[i,j]:=0;for t:=1 to i-j+1 dobegintg:=bscnn(a[i-t,j-1],t); if a[i,j]thenbegin a[i,j]:=tg;b[i,j]:=t;end;end;end;end;

procedure result;var i,j: integer;

Page 48: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

48 Tin hoïc & Nhaø tröôøng

beginassign(f,fo);rewrite(f);j:=n;for i:=1 to n-1 doif a[n,n]< a[n,i] thenbegina[n,n]:=a[n,i];j:=i;end;writeln(f,a[n,n]);i:=n;while j>0 dobeginwrite(f,b[i,j]),' ');i:=i-b[i,j];j:=j-1;end;close(f);end;

BEGINInit;Solution; Result;END. (Chương trình của bạn NguyễnThành Trung − Số nhà 07 − Ngõ 4/6 − Đường Huyền Quang − TX Bắc Giang− Bắc Giang.)Nhận xét: Đây là một bài toán khá lý thú, có rất nhiều bạn do không đọc kỹ đề nên dẫn đến thuật toán sai. Các bạn chú ý: với số n cho trước có rất nhiều cách phân tích N thành tổng của các chữ số, với mỗi cách phân tích chúng ta phải xách định BSCNN của các số trong phân tích đó. Cuối cùng chúng ta phải đưa ra max của các BSCNN và lưu lại cách phân tích mà BSCNN đạt max. Như vậy áp dụng giải thuật quy hoạch động, bài toán sẽ trở nên dễ dàng hơn nhiều.

Bài 121/2002 - Số nào vậy?Các số thoả mãn đề bài là: 77 x 88 = 6776 55 x 99 =4554 88 x 88 = 7744

Bài 122/2002 - Thành PhốĐây là một bài toán khá "khoai" nhưng nếu các bạn đọc kỹ đề và sử dụng thuật toán khéo léo một chút, bài toán sẽ trở nên dễ dàng. Tất nhiên bài toán sẽ được đưa về dạng đồ thị nhưng trước khi đưa ra thuật toán ta có nhận xét sau: Do hệ thống thiết kế đảm bảo sự đi lại giữa hai nút giao thông bất kỳ nên đồ thị được xét đến trong bài toán này là liên thông. Vì vậy trong chương trình ta không cần thủ tục kiểm tra tính liên thông của đồ thị. Mặt khác trong quá trình đặt tên đường ta chỉ cần xét đến các nut (đỉnh) có bậc lớn hơn 1 sao cho thoả

Page 49: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 49

mãn điều kiện của bài toán đặt ra. Còn lại các đỉnh có bậc bằng 1 không cần thoả mãn điều kiện này. Như vậy việc đặt tên cho những con đường này là bất kỳ. Để đặt tên đường thoả mãn điều kiện đề bài các bạn cần chú ý một điểm là các số tự nhiên liên tiếp bao giờ cũng nguyên tố cùng nhau và trong một tập hợp tồn tại hai số nguyên tố cùng nhau thì UCLN bằng 1. Như vậy việc đặt tên cho các con đường thoả mãn điều kiện của bài toán đưa về việc đánh số cho các đỉnh sao cho tại mỗi nút có số bậc lớn hơn 2 có cạnh ghi 2 số tự nhiên liên tiếp. Trên cơ sở này ta đưa ra thuật toán như sau: Thuật toán: Duyệt tất cả các nút (đỉnh). Xuất phát từ đỉnh (nut) đầu tiên đọc được từ file: Nếu đỉnh (nút đầu) nd nối với đỉnh j (1< j< n) thì tăng biến đếm gán tên cho cạnh (nd,j) là đếm bà lưu vào file. Lần lại từ đỉnh j. Đến khi tất cả các đường được đặt tên thì dừng. Chương trình như sau:const inp='nam.inp'; out='nam.out'; temp='tenduong.inp'; maxn=500; maxm=200000;type kn=0..maxn; km=0..maxm;var n,nd:kn; m:km; fi,fo,ft:text;function coduong(nut,j:kn):boolean;var i,l,n1,n2:km;begin i:=0; coduong:=false; assign(Fi,inp); reset(fi); readln(fi,m,n); repeat inc(i); readln(fi,n1,n2); until ((n1=nut) and (j=n2)) or (i=m); close(fi); if (n1=nut) and (j=n2) then begin assign(ft,temp); reset(ft); while not eof(ft) do begin readln(ft,n1,n2);

Page 50: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

50 Tin hoïc & Nhaø tröôøng

if (n1=nut) and (n2=j) then begin close(ft); exit; end; end; coduong:=true; close(Ft); end;end;procedure name(nut,ten:km);var j:kn;begin if ten>m then exit else for j:=1 to n do if j<>nut then if coduong(nut,j) then begin assign(ft,temp); append(ft); writeln(ft,nut,' ',j); close(ft); name(j,ten+1); end;end;procedure result;var i,j:km; n1,n2,n3,n4:kn;begin assign(fo,out); rewrite(fo); assign(fi,inp); reset(Fi); readln(fi,m,n); for i:=1 to m do begin readln(fi,n1,n2); assign(ft,temp); reset(ft); j:=0; repeat readln(ft,n3,n4); inc(j); until (n1=n3) and (n2=n4); writeln(fo,j);

Page 51: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 51

close(ft); end; close(fo); close(fi);end;procedure init;begin assign(fi,inp); reset(fi); readln(fi,m,n); readln(Fi,nd); close(fi); assign(Ft,temp); rewrite(Ft); close(Ft);end;BEGIN init; name(nd,1); result;END.

Bài 123/2002 - Mua hoaThuật toán: Coi mỗi loại hoa là 1 đỉnh của đồ thị. Như vậy mỗi đỉnh chỉ có duy nhất 1 cung đi ra từ nó, đồ thị có không quá N cạnh. Mục đích của bài toán này là tìm 1 tập các {X i} lớn nhất trong đó Xi là tập hợp các đỉnh trên 1 thành phần liên thông u1, u2,.. uk (Mua hoa u1 khuyến mãi hoa u2, mua hoa u2 khuyến mãi hoa u3.. ). Ta sẽ dùng 1 thuật toán có độ phức tạp cỡ O(N):- Khởi tạo: Từ các đỉnh u có bậc nhỏ nhất ta loang ra, đến đỉnh v ta cập nhật lại độ dài đoạn dài nhất kết thúc tại v và lưu lại đường đi.- Sắp xếp lại các đỉnh theo chiều giảm dần của độ dài đoạn kết thúc ở đỉnh đó. - Tiến hành loang từ các đỉnh để ghi nhận hoa mua, đánh dấu. - In kết quả. PROGRAM MUA_HOA;const fi = 'MUAHOA.IN'; fo = 'MUAHOA.OUT'; maxn = 10000;type arr1 = array [1..maxn] of integer; arr2 = array [1..maxn] of boolean;var infile, outfile: text; n, amount, dmin: integer; next, d, t: arr1; pre: ^arr1; c, m: real;procedure read_input;

Page 52: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

52 Tin hoïc & Nhaø tröôøng

var i: integer; b: arr2;begin assign(infile, fi); reset(infile); readln(infile, n, amount); readln(infile, c); fillchar(d, sizeof(d), 0); fillchar(b, sizeof(b), true); dmin := maxn; for i := 1 to n do begin readln(infile, next[i]); if next[i] > 0 then begin inc(d[next[i]]); b[next[i]] := false; end; end; for i := 1 to n do begin if d[i] < dmin then dmin := d[i]; if dmin = 0 then break; end; close(infile);end;procedure marku(u: integer);var count, p: integer; b: arr2;begin fillchar(b, sizeof(b), true); count := 0; p := 0; while u > 0 do begin if not b[u] then break; b[u] := false; inc(count); if t[u] < count then begin t[u] := count; pre^[u] := p; end; p := u; u := next[u]; end;

Page 53: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 53

end;procedure init;var i: integer;begin fillchar(t, sizeof(t), 0); new(pre); for i := 1 to n do begin if d[i] = dmin then marku(i); d[i] := i; end;end;procedure swap(var x, y: integer);var tmp: integer;begin tmp := x; x := y; y := tmp;end;procedure sort(l, r: integer);var i, j, x: integer;begin if l >= r then exit; i := l; j := r; x := t[(i + j) div 2]; repeat while t[i] > x do inc(i); while t[j] < x do dec(j); if i <= j then begin swap(t[i], t[j]); swap(d[i], d[j]); inc(i); dec(j); end; until i > j; sort(l, j); sort(i, r);end;

procedure process;var i, j, count: integer; b: arr2;

Page 54: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

54 Tin hoïc & Nhaø tröôøng

v: real;begin m := 0; count := 0; fillchar(b, sizeof(b), true); for i := 1 to n do if b[d[i]] then begin if count = amount then exit; inc(count); j := d[i]; t[count] := j; v := c; m := m + v; while pre^[j] > 0 do begin if count = amount then exit; j := pre^[j]; inc(count); t[count] := j; b[j] := false; v := v*9/10; m := m + v; end; end;end;

procedure result;var i: integer;begin assign(outfile, fo); rewrite(outfile); writeln(outfile, m: 0: 5); for i := amount downto 1 do writeln(outfile, t[i]); close(outfile);end;

BEGIN read_input; init; sort(1, n); process; result;END.{Chương trình của Ngô Thành Giang− Lớp 12 Toán − Trường THPT Năng Khiếu Trần Phú − Hải Phòng.}

Page 55: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 55

Bài 124/2002 - Số kỳ lạBài toán thử óc phán xét và sự kiên trì của các bạn. Sau khi nhận xét các bạn chỉ cần thử với hữu hạn lần các số có hai chữ số. Số lần thử sẽ phụ thuộc vào tài phán xét của bạn. Cuối cùng chúng ta tìm được hai số thoả mãn điều kiện của bài toán, hai số đó là: số 55 và 99. Các bạn thấy thế nào, quá dễ phải không. BBT hy vọng lần sau các bạn sẽ giải tốt hơn loại toán này.

Bài 125/2002 - Biểu thức ngoặcThuật toán: áp dụng giải thuật quy hoạch động Toàn bộ văn bản chương trình như sau:const filein='par.inp'; fileout='par.out';var fi,fo:text; i,j,k,m,o,p,n,d:integer; a:array[0..32,0..32]of real;begin{Phan Nhap} assign(fi,filein); reset(fi); read(fi,n,d); close(fi); assign(fo,fileout); rewrite(fo);{Kiểm tra điều kiện} if n mod 2 =1 then begin writeln(fo,0); close(fo); halt; end;{ở mỗi a[j,i] với j lá số cặp ngoặc của chuỗi và i là độ sâu của chuỗi.Ta xét ở từng vị trí có bao nhiêu trường hợp mà có độsâu tho mãn đề bài ở vị trí đó} a[0,0]:=1; for i:=1 to d do for j:=1 to n div 2 do for k:=0 to j-i do for m:=k+i to j do for o:=0 to i do for p:=0 to i-1 do a[j,i]:=a[j,i]+a[m-k-1,i-1]*a[k,o]*a[j-m,p];{Viet ket qua} writeln(fo,a[n div 2,d]:0:0); close(fo);end.{Chương trình của bạn Nghiêm Sỹ Phú − Email [email protected] }

Page 56: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

56 Tin hoïc & Nhaø tröôøng

Nhận xét: Đây là một bài toán khá đơn giản, có nhiều cách giải khác nhau nhưng để đưa ra lời giải tối ưu thì không phải là dễ. Rất nhiều bạn đã đưa ra đáp án đúng nhưng tư tưởng thuật toán chưa tối ưu, quá trình cài đặt còn phức tạp, dài dòng.

Bài 126/2002 - Lập lịch thi đấu bóng đáThuật toán: Mỗi đội sẽ thi đấu m-1 trận, nên mỗi đội đấu với (m-1)/2 trận trên sân nhà và (m-1)/2 trận trên sân khách. Sử dụng mảng hai chiều a; với a[i,j]=1 cho biết đội i sẽ thi đấu với đội j trên sân i. Cho đội i thi đấu với (m-1)/2 đội liên tiếp, từ đội i+1 đến đội i+(m-1)/2, nếu i+(m-1)/2 > m thì đội i sẽ thi đấu với đội 1,2.. Với mỗi vòng, đệ quy quay lui để tìm các cặp thi đấu sao cho không có đội nào phải thi 2 lần và mỗi đội được nghỉ đúng một lần. {--------------}const fi='lich.inp'; fo='lich.out'; max=100;type km=0..max;var a:array[km,km] of 0..1; doi:array[km] of km; chon:array[km] of 0..1; found:boolean; m:km; f:Text;procedure readdata(fi:string);begin assign(f,fi); reset(f); readln(f,m); if (m mod 2=0) and (m>100) then begin writeln('du lieu khong hop le. Ban hay nhap lai'); exit; end; close(f);end;procedure tim(i:km);var j,k:km; ok :boolean;begin if i>m-1 then begin k:=0; while (k<m-1) do

Page 57: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 57

begin inc(k,2); write(f,doi[k-1],'-',doi[k],' '); end; writeln(f); found:=true; end else for j:=1 to m do if not found then begin if odd(i) then ok:=chon[j]=0 else ok:=(a[doi[i-1],j]=1) and (chon[j]=0); if (ok) and (not found) then begin doi[i]:=j; chon[j]:=1; if (not odd(i)) then a[doi[i-1],j]:=0; tim(i+1); if not found then begin chon[j]:=0; if (not odd(i)) then a[doi[i-1],j]:=1; end; end; end;end;procedure slove;var i,j:km;begin fillchar(a,sizeof(a),0); for i:=1 to m do for j:=i+1 to i+((m-1) div 2) do if j <=m then a[i,j]:=1 else a[i,j-m]:=1; for i:=1 to m do begin fillchar(chon,sizeof(chon),0); found:=false; chon[i]:=1; tim(1); end;end;BEGIN readdata(fi); assign(f,fo); rewrite(f);

Page 58: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

58 Tin hoïc & Nhaø tröôøng

slove; close(f);END.

{Chương trình của Nguyễn Ngọc Anh (BBT có chỉnh sửa) - 90 Vành Đai Phi Trường - Phường An Thôi - Tp Cần Thơ:}Do sơ suất nên đề bài có sự sai sót và được sửa lại như sau: cần xếp lịch thi đấu thành m vòng chứ không phải n vòng. Tuy nhiên hầu hết các bạn đều phát hiện ra. Vì vậy trong phần này BBT chỉ nhận xét bài giải của các bạn có chỉnh sửa đề. BBT thành thật xin lỗi và mong nhận được sự cảm thông của bạn đọc gần xa.

Bài 127/2002 - Bảng quảng cáoThuật toán: Duyệt các cách mà ta có thể thay đổi ở các dòng. Với mỗi cách thay đổi ở các dòng, ta sẽ tìm cách thay đổi ở các cột để đạt số ô bóng đèn sáng lớn nhất. Nếu trên một cột số ô sáng dc[j] ≤ (N-1) div 2 thì ta thay đổi trạng thái của tất các ô trong cột j. Sau đó, ta đếm tổng số ô sáng của cách thay đổi này. Nếu nó lớn hơn kỷ lục Max thì ta giữ lại kỷ lục đó. Toàn bộ chương trình của bài toán như sau: program Bangquangcao;uses crt;const finp='QUANGCAO.INP' ; fout='QUANGCAO.OUT'; maxn=10; maxm=100;var a : array[1..maxn,1..maxm] of byte; d, kqd : array[1..maxN] of byte; c,kqc,dc : array[1..maxM] of byte; n,m,max,k : integer; f : text;procedure init;var i,j: integer;begin clrscr; max:=0; assign(f,finp); reset(f); readln(f,N,M); for i:=1 to N do begin for j:=1 to M do read(f,a[i,j]); readln(f); end;

Page 59: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 59

close(f);end;procedure Update;var i,j, dem: integer;begin for j:=1 to M do dc[j]:=0; for j:=1 to M do c[j]:=0; for i:=1 to N do for j:=1 to M do dc[j]:=dc[j]+a[i,j]; dem:=0; for j:=1 to M do if dc[j] <= (N-1) div 2 then begin c[j]:=1; dem:=dem+N-dc[j]; end else dem:=dem+dc[j]; if dem> max then begin max:=dem; kqd:=d; kqc:=c; end;end;

procedure try(i: integer);var j: integer;begin for j:=0 to 1 do begin d[i]:=j; if j=1 then for k:=1 to M do a[i,k]:=1-a[i,k]; if i=n then Update else Try(i+1); if j=1 then for k:=1 to M do a[i,k]:=1-a[i,k]; end;end;Procedure Result;var s:integer;begin assign(f,fout); rewrite(f); writeln(f,max); s:=0;

Page 60: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

60 Tin hoïc & Nhaø tröôøng

for k:=1 to n do s:=s+kqd[k]; for k:=1 to m do s:=s+kqc[k]; writeln(f,S); for k:=1 to N do if kqd[k]=1 then writeln(f,'D',k); for k:=1 to M do if kqc[k]=1 then writeln(f,'C',k); close(f);end;

BEGIN Init; Try(1); Result;END.{Chương trình của Nguyễn Thành Trung - Số nhà 07 Ngõ 4/6 - Đường Huyện Quang - TX Bắc Giang - Bắc Giang} Ta có nhận xét:Yêu cầu của bài toán là tìm một phương án tác động để số bóng đèn sáng nhiều nhất. Như vậy để đạt được bảng quảng cáo như mong muốn, không phụ thuộc vào phương án tác động, số lần tác động và cách thức tác động. Tuy nhiên sau khi tác động vào các công tắc ở hàng và cột thì số bóng đèn sáng trên bảng là lớn nhất. Do vậy chương trình của các bạn chỉ cần đưa ra được số bóng đèn sáng lớn nhất, coi như đã đạt yêu cầu. Bài 128/2002 - Điền sốSố đó là số 71Quy luật ở đây là: Mỗi số (trừ số 4) bằng nhân số trước cho 2 rồi lần lượt trừ đi cho 1,2,3,4,57=(4 x 2) - 1;12=(7 x 2) - 2;21=(12 x 2) – 338=(21 x 2) - 4;71= (38 x 2) - 5;

Bài 129/2002 - Những chiếc vòngGiải thuật:Lưu dữ liệu vào ma trận A: N x N.Nếu A[i,j]=0 vòng (i) không lồng với vòng (j) và ngược lạiGọi vòng (i) là vòng "tự do" nếu vòng (i) không lồng với bất kỳ vòng nào khácĐánh dấu những vòng đã "tự do" ban đầu.

Page 61: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 61

Bước 1: Tìm vòng [k] sao cho khi cắt nó thì làm cho số vòng được"tự do" nhiều nhất.Bước 2: Nếu không có vòng [k] ở bước 1 thì tìm vòng k sao cho nó được lồng với nhiều vòng khác nhất.Bước 3: Cắt vòng [k] (ghi nhớ vòng bị cắt này), đánh dấu vòng [k] đã được xét (và các vòng khác được "tự do" khi cắt vòng [k]).Bước 4: Làm lại bước 1 đến khi tất cả các vòng đã được đánh dấu.Toàn bộ văn bản chương trinh như sau:Program Cat_nhung_chiec_vong ;uses crt;const vao='cat.inp'; ra='cat.out';var a: array[1..250,1..250] of 0..1; b,c: array[0..250] of 0..1; n, min, het: integer; f:text;function kt(j :integer):boolean;var t: integer;Begin kt:=false; for t:=1 to n do if b[t]=0 then if a[j,t] =1 then exit; kt:=true;end;procedure getin;var i,j: integer;begin assign(f,vao); reset (f); fillchar(a,sizeof(a),0); fillchar(b,sizeof(b),0); c:=b; readln(f,n); while not eof(f) do begin readln(f,i,j); a[i,j]:=1; a[j,i]:=1; end; close(f); min:=0; het:=n; for i:=1 to n do if kt(i) then

Page 62: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

62 Tin hoïc & Nhaø tröôøng

begin b[i]:=1; dec(het); end;end;procedure tinh1(var tmax,k: integer);var i,j,t: integer;begin tmax:=0; for i:=1 to n do if b[i] =0 then begin b[i]:=1; t:=0; for j:=1 to n do if b[j]=0 then if kt(j) then inc(t); if tmax<t then begin tmax:=t; k:=i; end; b[i]:=0; end;end;procedure tinh2( var k: integer);var i,j, t, dmax:integer;begin dmax:=0; for i:=1 to n do if b[i]=0 then begin t:=0; for j:=1 to n do if a[i,j]=1 then inc(t); if t>dmax then begin dmax:=t; k:=i; end; end;end;procedure Xuly;var i,j,tmax,k: integer;begin

Page 63: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 63

repeat tinh1(tmax,k); if tmax=0 then tinh2(k); c[k]:=1; b[k]:=1; if tmax>0 then begin for j:=1 to n do if a[k,j]=1 then if kt(j) then begin b[j]:=1; dec(het); end; end; inc(min); dec(het); until het<=0;end;procedure getout;var i: integer;begin assign(f,ra); rewrite(f); writeln(f,min); for i:=1 to n do if c[i]=1 then write(f,i,' '); close(f);end;Begin clrscr; getin; Xuly; Getout;END.

{Chương trình của bạn Lê Việt Hưng - Lớp 12Tin - Trường Năng Khiếu Hàn Thuyên- Bắc Ninh}Các bạn có thể kiểm tra và tự sửa lại chương trình của mình với bộ test sau:CAT.INP81 32 32 55 65 45 7

Page 64: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

64 Tin hoïc & Nhaø tröôøng

4 88 7CAT.OUT33 5 8Giải bài 130/2002 - Xếp các khối đáThuật toán: 1. Sắp xếp theo thứ tự giảm dần các chiều dài của khối đá.2. Đối với công việc của Thành là xây từ N khối đá thành một cái tháp sao cho khối đá còn lại sau khi xây là ít nhất.Tức là: ta phải tìm số khối đá nhiều nhất trong N khối đá đã sắp xếp thoả mãn khối sau phải có hai kích thước đáy không lớn hơn khối đá trước. Vì ta đã sắp xếp khối đá theo chiều giảm dần của chiều dài nên bây giờ nhiệm vụ của ta là duyệt N khối đá theo chiều giảm của chiều dài để tìm ra một dãy giảm dần về chiều rộng mà độ dài của dãy đó là lớn nhất. Ta dùng giải thuật quy hoạch động:3. Gọi f[1,i]=j nghĩa là khối đá j đứng liền trước khối đá i trong dãy sắp xếp giảm dần và dãy đó là lớn nhất (trong những dãy có chứa phần tử i khi đã duyệt từ 1 đến i);4. f[2,i] là số lượng phần tử nằm trong dãy nêu trên khi duyệt từ 1 đến i (kể cả i).5. Khởi tạo ban đầu f[1,i]=0; f[2,i]=0 với i=1..n;6. Cách xây dựng:for i:=2 to n dofor j:=i downto 1 do if khoi[j].r>=khoi[i].r) and (f[2,j]>=f[2,i]) then begin F[1,i]:=j; F[2,i]:=F[2,i]+1; end;7. Ta tìm ra phần tử F[2,i] lớn nhất khi i chạy từ 1 đến n thì phần tử i đó sẽ là khối đá nằm ở đỉnh tháp thoả mãn là số khối đá còn thừa là ít nhất. Từ phần tử i ta sẽ tìm ngược lại được dãy thỏa mãn. 8. Đối với công việc của Kiên là xây một cái tháp từ N khối đá trên sao cho có chiều cao là lớn nhất (thoả mãn điều kiện bài ra). Do vậy ta cũng phải duyệt dãy giảm dần theo chiều dài đã sắp xếp và tìm ra một dãy giảm dần theo chiều rộng mà dãy này có tổng chiều cao lớn nhất trong các dãy thỏa mãn.

9. Ta cũng sử dụng thuật toán quy hoạch động với F[1,i], F[2,i] có ý nghĩa giống như trên. Ta thêm a[i] có giá trị là tổng chiều cao các khối thoả mãn từ 1 đến i. Như vậy ta sẽ tìm phần tử a[i] lớn nhất trong dãy từ 1 đến n. Phần tử i đó cũng sẽ là phần tử nằm ở đỉnh tháp; rồi ta sẽ lần lại và tìm được dãy thỏa mãn.10. Cách xây dựng:for i:=2 to n dofor j:=i downto 1 do if khoi[j].r>=khoi[i].r) and (a[i]<=a[j]+khoi[i].c) then begin F[1,i]:=j; F[2,i]:=F[2,i]+1; a[i]:=a[j]+khoi[i].c; end;

Page 65: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 65

11. Cấu trúc dữ liệu:Mảng F: array[1..2,1..5000] of integer;A là mảng động: array[1..5000] of longint;

12. Cài đặt:Thủ tục Reađata: đọc dữ liệu từ file;Thủ tục Quicksoft: Sắp xếp giảm dần theo chiều dài của khối đá. Thủ tục Kien: Quy hoạch động tìm ra tháp cao nhất.Thủ tục Thanh: Quy hoạch động tìm ra tháp xây từ nhiều khối nhất. Phần cài đặt chương trình: {$A+,B-,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q-,R-,S+,T-,V+,X+}{$M 16384,0,655360}Const fi='hung.inp'; fo1='kien.out'; fo2='thanh.out';Type hinh=record d,r,c: byte; t: integer; end; mang=array[1..5000] of longint;var f: array[1..2,1..5000] of integer; a:^mang; khoi:array[1..5000] of hinh; n: integer; f1,f2,f3: text; t1,t2: longint;Procedure Init;Begin t1:=meml[0:$46c]; assign(f1,fi); reset(f1); assign(f2,fo1); rewrite(f2); assign(f3,fo2); rewrite(f3);end;Procedure Finish;begin t2:=meml[0:$46c]; writeln(' thoi gian chay chuong trinh la:',(t2-t1)/18.2:0:3,'giay'); close(f1); close(f2); close(f3);end;procedure gan(var i,j,k: byte);

Page 66: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

66 Tin hoïc & Nhaø tröôøng

var a: array[1..3] of byte; d1,d2,tg: byte;Begin a[1]:=i; a[2]:=j; a[3]:=k; for d1:=1 to 2 do for d2:=d1+1 to 3 do if a[d1]<a[d2] then begin tg:=a[d1]; [d1]:=a[d2]; a[d2]:=tg; end; i:=a[1]; j:=a[2]; k:=a[3];end;Procedure Readdata;var i: integer;Begin readln(f1,n); for i:=1 to n do begin khoi[i].t:=i; readln(f1,khoi[i].d,khoi[i].r,khoi[i].c); gan(khoi[i].d,khoi[i].r,khoi[i].c); end;end;Procedure Quicksoft; Procedure Soft(l,r: integer); var i,j,g: integer; tg: hinh; begin i:=l; j:=r; g:=khoi[(l+r) div 2].d; repeat While khoi[i].d>g do inc(i); While Khoi[j].d<g do dec(j); if i<=j then begin tg:=khoi[i]; khoi[i]:=khoi[j]; khoi[j]:=tg;

Page 67: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 67

inc(i); dec(j); end; until (i>j); If j>l then soft(l,j); If i<r then soft(i,r); end;Begin soft(1,n);end;Procedure Thanh;Var i,j,sl,vt: integer; luu:array[1..5000] of integer;Begin fillchar(f,sizeof(f),0); sl:=0; for i:=2 to n do for j:=i downto 1 do if (khoi[j].r>=khoi[i].r) and (f[2,j]>=f[2,i]) then begin f[1,i]:=j; f[2,i]:=f[2,j]+1; if f[2,i]>sl then begin sl:=f[2,i]; vt:=i; end; end; writeln(f3,sl); i:=0; while sl<>0 do begin i:=i+1; luu[i]:=vt; vt:=f[1,vt]; sl:=sl-1; end; for j:=i downto 1 do writeln(f3,khoi[luu[j]].t,' ',khoi[luu[j]].d,' ',khoi[luu[j]].r,' ',khoi[luu[j]].c);end;Procedure Kien;var i,j,sl,vt: integer; luu: array[1..5000] of integer; maxh: longint;begin fillchar(f,sizeof(f),0);

Page 68: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

68 Tin hoïc & Nhaø tröôøng

new(a); fillchar(a^,sizeof(a^),0); sl:=0; maxh:=0; for i:=2 to n do for j:=i downto 1 do if (khoi[j].r>=khoi[i].r) and (a^[i]<=a^[j]+khoi[i].c) then begin f[1,i]:=j; f[2,i]:=f[2,j]+1; a^[i]:=a^[j]+khoi[i].c; if a^[i]>maxh then begin maxh:=a^[i]; sl:=f[2,i]; vt:=i; end; end; writeln(f2,sl); i:=0; while sl<>0 do begin i:=i+1; luu[i]:=vt; vt:=f[1,vt]; sl:=sl-1; end; for j:=i downto 1 do writeln(f2,khoi[luu[j]].t,' ',khoi[luu[j]].d,' ',khoi[luu[j]].r,' ',khoi[luu[j]].c);end;procedure main;begin Quicksoft; Kien; Thanh;end;Begin Init; ReadData; Main; Finish; readln;END.{Chương trình của bạn Trần Viết Hải - Lớp 11Tin - Chuyên Lê Hồng Phong - TP Nam Định}

Bài 131/2003 - Mừng tuổi

Page 69: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 69

Kí hiệu: x là số tiền còn lại sau khi đứa trẻ thứ 8 đã nhận được số tiền là 8 đồng. Như vậy, đứa trẻ thứ 8 nhận được 8 đồng + 1/10x. Và đứa thứ 9 nhận được 9/10x.Theo điều kiện , những đứa trẻ nhận được số tiền như nhau, do đó: 8 +1/10x=9/10x. Giải ra ta được x=10. Như vậy mỗi đứa trẻ nhận được 9 đồng. Hay bố đã mừng tuổi cho chị em Hoa tất cả là 81 đồng

Bài 132/2003 - Mật thư toạ độBài toán khá đơn giản, thực chất của bài toán là kiểm tra một số thao tác về xử lý xâu, các hàm về ký tự. Các bạn lưu ý, ở toạ độ thứ i trong s toạ độ thì ngoài các ký tự chỉ toạ độ ra, còn có các ký tự "(" , "," , ")" và cả ký tự trống. Như vậy khi đọc dữ liệu từ tệp nếu không chú ý đến điều này các bạn sẽ không giải được bài toán, hoặc chương trình sẽ cho kết quả sai. ở bài toán này khó nhất là xử lý để lọc ra các toạ độ và đưa về dạng số. Để giải được bài toán đòi hỏi các bạn phải sử dụng thành thạo một số hàm, thủ tục liên quan đến xâu, ký tự. Đồng thời cần lưu ý toạ độ được cho ở dạng text vì vậy các bạn muốn sử dụng làm chỉ số của ma trận thì cần phải đổi sang dạng số nhờ hàm val. Cụ thể các bạn có thể tham khảo thuật toán sau: Thuật toán: - Lưu các ký tự có trong bảng vào ma trận A[i,j] với 0≤i≤n; 0≤j≤m; - Đọc dòng tiếp theo trong s dòng, gán cho xâu P i:= pos('(',P);{Lấy vị trí của ký tự '(' trong xâu P} j:=pos(',',P); {Lấy vị trí của dấu ',' trong xâu P} val(copy(P, i+1, j-i-1), x, code);{lấy j-i-1 ký tự trong xâu P, sau đó đổi thành số x} i:= j; j:= length(P); val(copy(P,i+1, j-i-1), y, code); Q:= a[x, y] + ' '; - Đưa Q −mật thư ra tệp văn bản. Toàn bộ văn bản chương trình như sau: {$r+,q+,b-}program matthu_ism_132;uses crt;const ki = 'MatThu.inp'; ko = 'MatThu.out'; limit = 120;type ka = array [1..limit, 1..limit] of char; ks = String[10];var f, g : Text; n, m, s : Integer; a : ka; P, Q : ks;procedure turn_on;var i, j : integer; ch : char;begin

Page 70: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

70 Tin hoïc & Nhaø tröôøng

assign(f, ki); reset(f); readln(f, n, m, s); for i:= 1 to n do begin for j:= 1 to m do begin read(f, a[i, j]); if not eoln(f) then read(f, ch); end; readln(f); end; assign(g, ko); rewrite(g);end;procedure readinp;var i : integer;begin readln(f, P); i:= 1; repeat while (P[i] <> ' ') and (i <= length(P)) do Inc(i); while (P[i] = ' ') do delete(P, i, 1); until i > length(P);end;procedure process;var i, j, x, y, code : integer;begin i:= pos('(', P); j:= pos(',', P); val(copy(P, i+1, j-i-1), x, code); i:= j; j:= length(P); val(copy(P,i+1, j-i-1), y, code); Q:= a[x, y] + ' ';end;procedure writeout;begin write(g, Q);end;procedure listen;var i : integer;begin for i:= 1 to s do begin

Page 71: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 71

readinp; process; writeout; end;end;procedure turn_off;begin close(f); close(g);end;begin clrscr; turn_on; listen; turn_off;end.{Chương trình của bạn Nguyễn Mậu Kiên -Lớp 11@THPT Năng Khiếu Ngô Sĩ Liên -Bắc Giang} Bài 133/2003 - Đổ nướcThuật toán rất đơn giản như sau: Nếu dl1+dl2<dl thì không có cách đong vì số lít cần đong lớn hơn tổng dung tích cả hai bình.Ngược lại ta chọn bình có dung tích chênh lệch so với dl là lớn nhất. Coi bình này là bình 1 và bình còn lại là bình 2.Lặp:- Nếu bình 1 rỗng thì đổ nước vào bình 1 cho đầy. - Nếu bình 2 chưa đầy thì đổ nước từ bình 1 sang bình 2. Ngược lại nếu bình 2 đầy thì đổ hết nước ở bình 2 đi.Đến khi 1 trong 2 bình chứa dl lít hoặc tổng dung tích của 2 bình bằng dl hoặc trạng thái đổ nước trở lại như cũ là bình 1 đầy, bình 2 rỗng thì dừng lại thông báo KHONG CO.program do_nuoc;

var b1,b2,dl,dl1,dl2,i:integer; f1,f2:text;begin assign(f1,'donuoc.inp'); reset(f1); readln(f1,dl1,dl2,dl); assign(f2,'donuoc.out'); rewrite(f2); if dl1+dl2<dl then writeln(f2,'Khong co') else if dl1=dl then begin writeln(f2,'Buoc 1 : ',dl1,' 0'); end else

Page 72: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

72 Tin hoïc & Nhaø tröôøng

if dl2=dl then begin writeln(f2,'Buoc 1 : 0 ',dl2); end else if dl1+dl2=dl then begin writeln(f2,'Buoc 1 : ',dl1,' 0'); writeln(f2,'Buoc 2 : ',dl1,' ',dl2); end else begin b1:=0; b2:=0; i:=0; repeat if b1=0 then begin i:=i+1; b1:=dl1; writeln(f2,'Buoc ',i,' : ',b1,' ',b2); end; if b2=dl2 then begin i:=i+1; b2:=0; writeln(f2,'Buoc ',i,' : ',b1,' ',b2); end; if b2<dl2 then begin if b1>dl2-b2 then begin i:=i+1; b1:=b1-(dl2-b2); b2:=dl2; writeln(f2,'Buoc ',i,' : ',b1,' ',b2); end else begin i:=i+1; b2:=b1+b2; b1:=0; writeln(f2,'Buoc ',i,' : ',b1,' ',b2); end; end; if (b1=0) and (b2=dl2) then begin writeln(f2,'Khong co');

Page 73: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 73

close(f2); halt; end; until (b1=dl) or (b2=dl) or (b1+b2=dl); end; close(f1); close(f2);end.(Chương trình của Ngô Khắc Toản - 151 Khối 5 - Hà Huy Tập -Vinh - Nghệ An) Bài 134/2003 - Xếp gạch trên nền nhàHướng giải quyết:Cơ sở của thuật toán là chia để trị của trường hợp đặc biệt n=2 k (k thuộc N)Để bài toán có nghiệm điều kiện là n mod 3 <>0 (nghiệm là tồn tại một cách lát nền thoả mãn điều kiện của bài toán) Nhận xét- n=5 không phải luôn là nghiệm, phụ thuộc vào vị trí của ô cống.- n=1,2,4,7,8,10,11 luôn có cách phủ mọi p,q thuộc 1.. nVới n<= 11, dễ dàng xây dựng chương trình đệ quy để giải quyết bài toán. Dùng phương pháp quy nạp ta chứng minh mệnh đề sau:Với mọi n>6, n mod 3 <>0 thì nền nhà nxn luôn có cách lát với mọi vị trí ô cống (p,q). Thật vậy: n có dạng: 6k+1, 6k+2, 6k+4, 6k+5 (k<= 1)Xét n=6k+2- k=1 đúng.- Giả sử luôn có cách phủ với k. Chứng minh đúng với k+1Với k: n'=6k+2 k+1: n=(6k+2) +6=n'+6

Do n<= 14 nên nếu ta dùng 4 hình vuông n'xn' đặt vào 4 góc: trái trên, trái dưới, phải trên, phải dưới thì các hình vuông n'xn' này sẽ giao nhau và phủ hoàn toàn lưới nxn.Suy ra mọi (p,q) thuộc lưới thì luôn tồn tại ít nhất một hình vuông ở góc chứa (p,q). Không mất tính tổng quát, giả sử đó là hình vuông trái trên.Theo giả thiết quy nạp, hình vuông n'xn' đặt ở góc trái trên chứa ô trống (p,q) luôn có phương án lát. Do đó ta chỉ cần tìm cách lát phần dôi ra là được. Chúng ta để ý hình chữ nhật 2x6 dễ dàng được lát bởi 4 thanh chữ L (quy ước gọi viên gạch là thanh chữ L). Do đó bằng đường chia (nét đậm) ta chia phần dôi ra làm 2 hình chữ nhật nx6 và n'x6. Do n và n' chẵn nên ta có thể chia chúng thành các hình chữ nhật 2x6 và lần lượt lát các hình chữ nhật con 2x6 này.

Page 74: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

74 Tin hoïc & Nhaø tröôøng

Minh hoạ: Hình chữ nhật nhỏ gạch rọc là hình chữ nhật 2x6suy ra điều phải chứng minh.Với n=6k+4(k>1) chứng minh tương tự+ Với n=6k+1: Các bước chứng minh quy nạp đều tương tự. ở đây ta chỉ quan tâm phần bị dôi ra.Vì n và n' đều lẻ nên không thể áp dụng cách làm như trên.

Ta có phương án chia như hình gồm 2 hình chữ nhật(n'-1)x6 và một hình chữ vuông 7x7 bị khuyết một ô(1,1). Dễ thấy có thể lát kín 2 hình chữ nhật (n'-1)x6 bằng các hình chữ nhật 2x6 và hình chữ nhật 7x7 với ô (1,1) trống (đệ quy) vì ta đã chứng minh luôn có phương án phủ cho n=7, với mọi (p,q) thuộc lưới. Vậy thuật toán chứng minh với n=6k+5

Nhận xét: Có nhiều cách để giải quyết với n<= 11 như:- áp dụng đặc biệt với n=2k

- Xét việc phủ hình vuông cấp lớn qua các hình cấp thấp hơn, chẳng hạn hình 10x10 thông qua hình 8x8- Lưu kết qủa với n=7 và (p,q)=(1,1) để tiện cho n lẻVới n>11- Lưu việc phủ hình chữ nhật 2x6.ở đây ta chỉ cần dùng ngay thủ tục đệ quy chung với n<=11 cho ngắn.Thuật toán:Bước 1: n mod 3 =0. Vô nghiệm thì thoát, ngược lại sang bước 2Bước 2: n<= 11, sang bước 4, ngược lại sang bước 3.Bước 3: Xét (p,q) thuộc hình vuông con nào, qua đó lát phần dôi ra như đã chứng minh. Hạ kích thước xuống n-6Quy lại bước 2.Bước 4: Đệ quy tìm phương án kết thúc.

PROGRAM XEP_GACH_TREN_NEN_NHA;type tconst=array[1..12,1..2]of shortint;

Page 75: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 75

const max=151; fi='xepgach.inp'; fo='xepgach.out'; dx:tconst=((1,1),(-1,0),(-1,-1),(0,1),(-1,0),(1,1),(0,1),(-1,-1), (0,1), (0,-1),(-1,0),(1,0)); dy:tconst=((-1,0),(-1,-1),(0,1),(1,1),(1,1),(0,1),(-1,-1),(-1,0), (-1,0), (-1,0),(0,1),(0,1)); d:array[0..1,1..6]of byte=((1,1,2,3,3,4),(1,2,2,3,4,4));

var a:array[1..max,1..max]of integer; w:array[1..7,1..7]of byte; n,p,q,x1,y1,x2,y2,xx,yy:byte; found:boolean; m,dem:integer; f:text;

procedure nhap;begin assign(f,fi); reset(f); read(f,n,p,q); close(f);end;

procedure xuat;var i,j:byte;begin for i:=1 to n do begin for j:=1 to n do write(f,a[i,j]:5); writeln(f); end;end;procedure find(var xx,yy:byte);var i,j:byte;begin for i:=x1 to x2 do for j:=y1 to y2 do if a[i,j]=0 then begin xx:=i; yy:=j; exit; end;

Page 76: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

76 Tin hoïc & Nhaø tröôøng

end;

procedure phu(x,y:byte);var k,xx1,yy1,xx2,yy2:byte;begin for k:=1 to 12 do begin xx1:=x+dx[k,1]; if(xx1>=x1)and(xx1<=x2)then begin yy1:=y+dy[k,1]; if(yy1>=y1)and(yy1<=y2)and(a[xx1,yy1]=0)then begin xx2:=x+dx[k,2]; if(xx2>=x1)and(xx2<=x2)then begin yy2:=y+dy[k,2]; if(yy2>=y1)and(yy2<=y2)and(a[xx2,yy2]=0)then begin inc(dem); a[x,y]:=dem; a[xx1,yy1]:=dem; a[xx2,yy2]:=dem; if dem=m then found:=true else begin find(xx,yy); phu(xx,yy); end; if found then exit; a[x,y]:=0; a[xx1,yy1]:=0; a[xx2,yy2]:=0; dec(dem); end; end; end; end; end;end;

procedure UseCase;var i,j:byte;begin m:=(n*n-1)div 3; dem:=0;

Page 77: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 77

case n of 1: begin a[1,1]:=0; xuat; end; 2: begin for i:=1 to 2 do for j:=1 to 2 do a[i,j]:=1; a[p,q]:=0; xuat; end; else begin x1:=1; y1:=1; x2:=n; y2:=n; for i:=1 to n do for j:=1 to n do a[i,j]:=0; a[p,q]:=1; if(p=1)and(q=1)then phu(1,2) else phu(1,1); a[p,q]:=0; if found then xuat else write(f,'Bai Toan Vo Nghiem'); end; end;end;

procedure chay1(x1,x2,yy2:byte);var i,j,k,l:byte;begin k:=0; l:=0; for i:=x1 to x2 do begin inc(l); for j:=1 to 6 do a[i,yy2+j]:=dem+d[k,j]; k:=1-k; if l=2 then begin l:=0; dem:=dem+4; end; end;end;

Page 78: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

78 Tin hoïc & Nhaø tröôøng

procedure chay2(y1,yy2,xx2:byte);var i,j,k,l:byte;begin k:=0; l:=0; for j:=y1 to yy2 do begin inc(l); for i:=1 to 6 do a[xx2+i,j]:=dem+d[k,i]; k:=1-k; if l=2 then begin l:=0; dem:=dem+4; end; end;end;

procedure xaydung;var i,j:byte;begin x1:=1; x2:=7; y1:=1; y2:=7; m:=16; dem:=0; for i:=1 to 7 do for j:=1 to 7 do a[i,j]:=0; a[1,1]:=1; phu(1,2); a[1,1]:=0; found:=false; for i:=1 to 7 do for j:=1 to 7 do w[i,j]:=a[i,j]; fillchar(a,sizeof(a),0);end;

procedure TruongHop1(xx1,yy1,xx2,yy2:byte);var i,j:byte;begin chay1(xx1,xx2-1,yy2); chay2(yy1,yy2-1,xx2); for i:=xx2 to x2 do

Page 79: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 79

for j:=yy2 to y2 do a[i,j]:=w[i-xx2+1,j-yy2+1]+dem; a[xx2,yy2]:=0;end;

procedure TruongHop2(xx1,yy1,xx2,yy2:byte);var i,j:byte;begin chay1(xx1,xx2-1,y1-1); chay2(yy1+1,yy2,xx2); for i:=xx2 to x2 do for j:=y1 to yy1 do a[i,j]:=w[7+y1-j,i+1-xx2]+dem; a[xx2,yy1]:=0;end;

procedure TruongHop3(xx1,yy1,xx2,yy2:byte);var i,j:byte;begin chay1(xx1+1,xx2,yy2); chay2(yy1,yy2-1,x1-1); for i:=x1 to xx1 do for j:=yy2 to y2 do a[i,j]:=w[j-yy2+1,7+x1-i]+dem; a[xx1,yy2]:=0;end;

procedure TruongHop4(xx1,yy1,xx2,yy2:byte);var i,j:byte;begin chay1(xx1+1,xx2,y1-1); chay2(yy1+1,yy2,x1-1); for i:=x1 to xx1 do for j:=y1 to yy1 do a[i,j]:=w[7+x1-i,7+y1-j]+dem; a[xx1,yy1]:=0;end;

procedure XuLiLe;var xx1,xx2,yy1,yy2,kt:byte;begin xaydung; dem:=0; x1:=1; y1:=1; x2:=n; y2:=n; kt:=n;

Page 80: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

80 Tin hoïc & Nhaø tröôøng

while kt>11 do begin kt:=kt-6; if p<x1+kt then if q<y1+kt then begin xx1:=x1; xx2:=x2-6; yy1:=y1; yy2:=y2-6; TruongHop1(xx1,yy1,xx2,yy2); end else begin xx1:=x1; xx2:=x2-6; yy1:=y1+6; yy2:=y2; TruongHop2(xx1,yy1,xx2,yy2); end else if q<y1+kt then begin xx1:=x1+6; xx2:=x2; yy1:=y1; yy2:=y2-6; TruongHop3(xx1,yy1,xx2,yy2); end else begin xx1:=x1+6; xx2:=x2; yy1:=y1+6; yy2:=y2; TruongHop4(xx1,yy1,xx2,yy2); end; dem:=dem+16; x1:=xx1; x2:=xx2; y1:=yy1; y2:=yy2; end; a[p,q]:=1; m:=dem+(kt*kt-1)div 3; if(p=x1)and(q=y1)then phu(x1,y1+1) else phu(x1,y1); a[p,q]:=0;

Page 81: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 81

xuat;end;

procedure xulichan;var xx1,xx2,yy1,yy2,kt:byte;begin dem:=0; fillchar(a,sizeof(a),0); x1:=1; y1:=1; x2:=n; y2:=n; kt:=n; while kt>11 do begin kt:=kt-6; if p<x1+kt then if q<y1+kt then begin xx1:=x1; xx2:=x2-6; yy1:=y1; yy2:=y2-6; chay1(x1,x2,yy2); chay2(y1,yy2,xx2); end else begin xx1:=x1; xx2:=x2-6; yy1:=y1+6; yy2:=y2; chay1(x1,x2,y1-1); chay2(yy1,yy2,xx2); end else if q<y1+kt then begin xx1:=x1+6; xx2:=x2; yy1:=y1; yy2:=y2-6; chay1(x1,x2,yy2); chay2(yy1,yy2,x1-1); end else begin

Page 82: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

82 Tin hoïc & Nhaø tröôøng

xx1:=x1+6; xx2:=x2; yy1:=y1+6; yy2:=y2; chay1(x1,x2,y1-1); chay2(yy1,yy2,x1-1); end; x1:=xx1; x2:=xx2; y1:=yy1; y2:=yy2; end; a[p,q]:=1; m:=dem+(kt*kt-1)div 3; if(p=x1)and(q=y1)then phu(x1,y1+1) else phu(x1,y1); a[p,q]:=0; xuat;end;

begin nhap; assign(f,fo); rewrite(f); found:=false; if(n mod 3)=0 then write(f,'Bai Toan Vo Nghiem') else if n<12 then UseCase else if odd(n) then xulile else XuLiChan; close(f);end.(Chương trình của bạn Lương Ngọc Hoàng - Lớp 11Toán - PTTH Hùng Vương - PleiKu - Gia Lai)

Bài 135/2003 - Hãy giúp Hoàng tử IvanHoàng tử chỉ cần nói ba số 1, 10, 100 và khi đó sẽ đi qua được. Nếu 3 số của hung thần nói là a,b,c thì sau khi hoàng tử nói 3 số 1, 10, 100. Hung thần sẽ phải nói số có 3 chữ số mà hàng trăm là c, hàng chục là b và hàng đơn vị là a.

Bài 136/2003 - Đặt bomBài toán khá đơn giản, trước tiên các bạn cần đưa ra nhận xét. Ta xét tại ô (i,j) có hai khả năng xảy ra, có hoặc không có xe tăng. - Nếu tại ô (i,j) có xe tăng, trong trường hợp này bắt buộc chúng ta phải đặt bom tại vị trí ô (i,j) bởi theo giả thiết nếu đặt bom tại vị trí (i,j) thì các vị trí (i,j), (i+1,j), (i,j+1), (i+1,j+1) sẽ bị phá huỷ, và như vậy để phá huỷ được xe tăng tại vị trí (i,j) thì chỉ có cách đặt bom tại ô (i,j).

Page 83: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 83

- Nếu tại vị trí (i,j) không có xe tăng, tại vị trí này được đặt bom khi và chỉ khi tại các ô (i+1,j, (i,j+1) có xe tăng, trong trường hợp này ta không cần quan tâm đến ô (i+1,j+1). Trên cơ sở nhận xét trên ta đưa ra thuật toán đơn giản như sau: Thuật toán: Duyệt tất cả các ô của ma trận, ô (i,j) được đặt bom khi và chỉ khi tại ô (i,j+1) và ô (i+1,j) hoặc chính tại ô (i,j) có xe tăng: Toàn bộ văn bản chương trình như sau: Uses crt;Const fi='BOM.INP'; fo='BOM.OUT';Var n:integer; mang:array[0..151,0..151] of 0..1; kq:array [1..50,1..2] of byte; i,j,dem:byte;Procedure Init;Var f:text; i,j:integer;Begin assign(f,fi); reset(f); read(f,n); For i:=1 to n do For j:=1 to n do read(f,mang[i,j]); close(f);End;

Procedure xuli;Var i,j:integer; f:text;Begin i:=1; j:=1; dem:=0; Repeat If (mang[i,j]=1) or ((mang[i,j+1]=1) and (mang[i+1,j]=1)) then begin mang[i,j]:=0; mang[i,j+1]:=0; mang[i+1,j]:=0; mang[i+1,j+1]:=0; inc(dem); kq[dem,1]:=i; kq[dem,2]:=j; inc(j,2) end

Page 84: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

84 Tin hoïc & Nhaø tröôøng

else inc(j); If j>n then begin j:=1; inc(i); end; Until i>n;

assign(f,fo); rewrite(f); Writeln(f,dem); For i:=1 to dem do writeln(f,kq[i,1],' ',kq[i,2]); close(f);End;

Begin clrscr; init; xuli;End.(Chương trình của bạn Phan Đắc Anh Huy − lớp 10 Toán − trường PTTH Lê Quý Đôn − Nha Trang − Khánh Hoà)

Bài 138/2003 - Qua sôngTH&NTĐầu tiên 2 cậu bé qua sông, một cậu quay về cùng thuyền. Một người đàn ông qua sông, cậu bé còn lại bên kia sông sẽ đưa thuyền về. Như vậy cứ 4 lần thuyền qua sông thì đưa được một người đàn ông sang bờ bên kia. Để đưa 3 người đàn ông qua sông phải chèo thuyền sang sông 12 lần. Lần cuối cùng chở hai cậu bé. Tất cả 13 lần thuyền phải qua sông. Vậy con thuyền đã bơi một quãng đường là 13x100=1300m.

Giải bài 139/2003 - Đổi tiềnTH&NTBài toán này khá hay, ta có thể áp dùng rất nhiều phương pháp để giải quyết. Song tư tưởng chủ đạo của bài toán vẫn là sử dụng Quy hoạch động. Chúng ta hoàn toàn có thể áp dụng cách giải quyết dựa vào bài toán xếp ba lô. ở cách này các bạn đã quá quen thuộc, vì vậy tôi không trình bày. Sau đây tôi muốn đưa ra một hướng giải quyết khác như sau. Thuật toán: Gọi F[i] là số tờ ít nhất được dùng để đổi số tiền loại i. Với i=1..M. Với quy ước F[i]= ∞ khi không đổi được X[i] là loại tiền cuối cùng đựơc dùng để đổi số tiền i (chỉ lưu một loại tiền) - Xếp mệnh giá A[i] tăng dần. - Khởi gán F[i]= ∞ , X[i]=0 với mọi i =1..M. - Gán F[0]:=0 Với số tiền i chạy từ 1 đến M, ta tính F[i] và X[i] bằng cách: Nếu chọn loại tiền j thì số tiền còn lại là i-A[j] F[i]=Min(F[i-A[j]] +1) nếu i ≥ A[j] với loại tiền j chạy từ 1 đến N

Page 85: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 85

Ta có X[i] là chỉ số loại tiền cuối cùng cho vào để được i đồng. Nếu X[i]= ∞ có nghĩa là không có cách đổi được số tiền M Ta dễ dàng lần lại cách đổi từ mảng X Toàn bộ chương trình bài toán đổi tiền như sau: const fi ='doitien.inp'; fo='doitien.out';var chon,f,x,A:array[0..1000]of word; M,n,soto:word; g:text;procedure nhap;var i:word; g:text;begin assign(g,fi); reset(g); readln(g,n,M); for i:=1 to n do read(g,A[i]); close(g);end;procedure taobang;var i,j:word;begin for i:=1 to m do f[i]:=32000; f[0]:=0; for i:=1 to m do for j:=1 to n do if i>=A[j] then if f[i]>f[i-A[j]]+1 then begin f[i]:=f[i-A[j]]+1; x[i]:=j; end;end;procedure trabang;var i:byte;begin soto:=0; if f[m]<32000 then while m>0 do begin inc(chon[x[m]]); m:=m-A[x[m]]; inc(soto);

Page 86: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

86 Tin hoïc & Nhaø tröôøng

end;end;procedure xuat;var i,j:Byte; g:text;begin assign(g,fo); rewrite(g); if f[M]=32000 then write(g,'Khong doi duoc ') else begin writeln(g,soto:4); for i:=1 to n do if chon[i]>=0 then write(g,chon[i]:3); end; close(g);end;begin nhap; taobang; trabang ; xuat;end.

Bài 140/2003 - Thang máyý tưởng chủ đạo là thuật toán quy hoạch động Ta coi mọi yêu cầu là một đỉnh trong đồ thị có hướng. Trong thuật toán: Đường đi trung gian từ yêu cầu i đến yêu cầu j là quãng đường từ cuối yêu cầu i đến đầu yêu cầu j. Ví dụ: Yêu cầu1: 1-->3; yêu cầu 2: 4-->5. Nên suy ra đường đi trung gian từ yêu cầu 1 đến yêu cầu 2 là quãng đường từ 3 đến 4 tức là abs(3-4)=1. Như vậy để giải bài toán ta tìm cách sắp xếp sao tổng quãng đường trung gian là ngắn nhất. −c[i,j]: mảng 2 chiều kiểu tập hợp gồm các yêu cầu đã chọn khi đã chọn i yêu cầu và yêu cầu cuối là j. (để tiết kiệm, trong chương trình đã dùng 2 mảng C1,C2 1 chiều thay cho 1 mảng C). b[i,j]: mảng 2 chiều cho biết yêu cầu ngay trước yêu cầu j là b[i,j]. − Thêm điều cần chú ý: Vì luôn bắt đầu từ tầng 1 nên ta có thêm yeucau0: dau=1 và cuoi=1; *) Thuật toán gồm các bước như sau: + Bước 1: Tạo mảng a, ý nghĩa: a[i,j] − là độ dài đường trung gian từ i đến j. a[i,j]:=abs(yc[i].cuoi-yc[j].dau); (a[i,j] thường là khác a[j,i]) + Bước 2: Tao mảng d, ý nghĩa: d[i,j] −là quãng đường min khi chọn i yêu cầu và j là đỉnh cuối. d[i,j]:=min{d[i-1,k]+a[k,j]} (0≤k≤m) and not(j in c[i,j]); + Bước 3: Tìm trên dòng m+1 của bảng d giá trị nhỏ nhất và từ đó tra bảng để tìm đường đi, lưu đường đi vào mảng lt[i] là mảng 1 chiều.

Page 87: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 87

Chương trình như sau: Program Thang_may;const inp='Elevator.inp'; out='Elevator.out'; vocuc=60000;type yeucau=record dau,cuoi: byte; end;var yc: array[0..100] of yeucau; d: array[1..101,0..100] of word; {Vi them yeucau0 nen toi da la 101 dong} c1:array[0..100] of set of 0..100; c2:array[0..100] of set of 0..100; a: array[0..101,0..101] of byte; {Vi them yeucau0 nen toi da la 101 yeu cau} lt: array[1..100] of byte; fi,fo: text; m,n,i,j,k,min,luu,tong,t: word;

BEGIN {Nhap du lieu} assign(fi,inp); reset(fi); read(fi,n,m); with yc[0] do begin dau:=1; cuoi:=1; end; for i:=1 to m do with yc[i] do begin read(fi,dau,cuoi); tong:=tong+abs(dau-cuoi) ; end; close(fi); {buoc 1:} for i:=0 to m do for j:=0 to m do if i<>j then a[i,j]:=abs(yc[i].cuoi-yc[j].dau); { Buoc 2} for i:=0 to m+1 do for j:=0 to m do d[i,j]:=vocuc; d[1,0]:=0; c1[0]:=c1[0]+[0]; b[1,0]:=0; {Khoi gan} for i:=2 to m+1 do begin for j:=1 to m do begin

Page 88: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

88 Tin hoïc & Nhaø tröôøng

min:=vocuc; for k:=0 to m do if not (j in c1[k]) and (d[i-1,k] <> vocuc) then if (d[i-1,k]+a[k,j]) < min then begin min:=d[i-1,k]+a[k,j]; luu:=k; end; d[i,j] :=min; b[i,j]:=luu; c2[j]:=c1[luu]+[j]; move(c2,c1,sizeof(c2)); {c1,c2 duoc su dung linh hoat de tiet kiem} {Buoc 3:} min:=1; for j:=2 to m do if d[m+1,j] <d[m+1,min] then min:=j; i:=m+1; j:=min; inc(t); lt:=j; {Xuat ket qua} assign(fo,out); rewrite(fo); writeln(fo,tong+d[m+1,j]); for i:=m+1 downto 1 do begin j:=b[i,j]; inc(t); lt[t]:=j; end; for i:=m downto 1 do write(fo,lt[i],' ') ; close(fo);END.{Chương trình của bạn Đào Đức Minh − Lớp 10 Toán Tin 1 − Trường Chuyên Lương Thế Vinh − Biên Hoà − Đông Nai} Giải bài 141/2003 - Những đồng tiền vàngBài toán được giải đơn giản như sau: Giả sử số tiền của người thứ ba là một phần thì số tiền của người thứ 4 sẽ là 4 phần, số tiền của người thứ nhất và người thứ hai cộng lại sẽ là 4 phần, tổng số là 9 phần, do đó mỗi phần là 5. Như vậy người thứ 3 được 5 đồng, người thứ tư được 20 đồng. Người thứ nhất được 2 x 5 − 2 = 8 đồng và người thứ nhất được 2 x 5 + 2 = 12 đồng.

Bài 142/2003 - Tô màu cho bảngBài toán khá đơn giản, thuật toán được trình bày như sau:Thuật toán: Sau khi một ô được tô thì các ô cùng cột và cùng hàng với nó sẽ không được tô nữa, ta gọi đó là các ô bị ảnh hưởng bởi ô ban đầu. Tại một thời điểm, một ô chỉ được tô khi nó làm ảnh hưởng đến ít nhất các ô được chọn. Sử dụng vòng lặp để tìm và tô ô đó cho đến khi nào không thể tô được nữa. Chương trình chính: Uses crt;Const fi='tomau.inp'; fo='tomau.out';

Page 89: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 89

Var a:array[0..100,0..100] of 0..1; b:array[1..10000,1..2] of integer; n,s,k:integer;

Procedure init;Var f:text; i,j:integer;Begin fillchar(a,sizeof(a),0); assign(f,fi);

reset(f); readln(f,n); s:=0; clrscr; For i:=1 to n do For j:=1 to n do begin read(f,a[i,j]); if a[i,j]=1 then begin inc(s); inc(a[0,j]); inc(a[i,0]); end; end; close(f);End;

Procedure xuli;Var i,j,x,y,dem,min:integer;Begin dem:=0; k:=0; Repeat min:=maxint; For i:=1 to n do For j:=1 to n do If (min>a[i,0]+a[0,j]) and (a[i,j]=1) then begin min:=a[i,0]+a[0,j]; x:=i; y:=j; end; For i:=1 to n do

Page 90: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

90 Tin hoïc & Nhaø tröôøng

if a[i,y]=1 then begin inc(dem); a[i,y]:=0; dec(a[i,0]); dec(a[0,y]); end; For i:=1 to n do if a[x,i]=1 then begin inc(dem); a[x,i]:=0; dec(a[x,0]); dec(a[0,i]); end; inc(k); b[k,1]:=x; b[k,2]:=y; Until dem=s;End;

Procedure xuat;Var f:text; i:integer;

Begin assign(f,fo); rewrite(f); writeln(f,k); For i:=1 to k do writeln(f,b[i,1],' ',b[i,2]); close(f);End;

Begin init; xuli; xuat;End.{Chương trình của bạn Phan Đắc Anh Huy - 137 Nguyễn Trãi - Nha Trang - Khánh Hòa}

Bài 143/2003 - Xếp hàng mua véDùng qui hoạch động:Gọi A[i] là thời gian nhỏ nhất để mua vé khi xét đến người thứ iVới người thứ i có hai trường hợp:- Bước ra khỏi hàng: A[i]=A[i-2]+R[i-1]- Không bước ra khỏi hàng: A[i]=A[i-1]+T[i]Vậy A[i]=Min{A[i-2]+R[i-1],A[i-1]+T[i]}

Page 91: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 91

Sử dụng mảng K: Đánh dấu những người rời khỏi hàng Chương trình được cài đặt đơn giản sau:Uses crt;const fi='Tick.inp'; fo='Tick.out';Var a,t,r:Array[0..2001]of integer; k:Array[1..2001]of boolean; n:Integer;

Procedure input;var f:Text; i:Integer;Begin assign(f,fi); reset(f); readln(f,n); for i:=1 to n do read(f,t[i]); for i:=1 to n-1 do read(f,r[i]); close(f);End;

Procedure Process;var i:Integer;Begin r[0]:=0; a[0]:=0; a[1]:=t[1]; fillchar(k,sizeof(k),false); For i:=2 to n do if a[i-2]+r[i-1]<t[i]+a[i-1] then begin k[i]:=true; k[i-1]:=false; a[i]:=a[i-2]+r[i-1]; end else a[i]:=t[i]+a[i-1];End;Procedure output;var i:Byte; f:Text;Begin assign(f,fo); rewrite(f);

Page 92: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

92 Tin hoïc & Nhaø tröôøng

writeln(f,a[n]); for i:=1 to n do if k[i] then write(f,i,' '); close(f);end;

BEGIN Input; process; output;END.{Chương trình của bạn Võ Đức Trọng - lớp 10A3 - khối PTCTT - ĐH Sư Phạm Hà Nội}Giải bài 144/2003 - Điệp viênHướng giải quyết: Gọi G(V,E) là đồ thị biểu diễn mối quan hệ N điệp viên. Ta sẽ phân G làm các thành phần liên thông (TPLT). Gọi K là số TPLT tìm đựơc. ứng với mỗi TPLT, kiểm tra xem nó có là đồ thị 2 phía được hay không bằng cách phân tập đỉnh của TPLT này làm 2 phần, đặt pi, qi lần lượt là số đỉnh của mỗi phần của TPLT thứ i (i=1..K) Xét hai trường hợp: K=N Suy ra N điệp viên không có quan hệ nào. Mỗi cách xếp 1 điệp viên vào một nhóm sẽ cho một cách phân nhóm. Ngoài ra, đề bài không chấp nhận một nhóm nào đó có 0 người. Có một cách xếp sao cho một nhóm có 0 người nếu số cách phân nhóm là M=2N-1-1. K<N -> Khi đó tồn tại ít nhất 1 TPLT có hơn 1 đỉnh. Do đó số cách phân nhóm là 2 k-1

Vì M không quá 17 chữ số nên 2n-1 - 1 có không quá 17 chữ số2k-1 có không quá 17 chữ sốSuy ra Số TPLT: K<= 56 Cấu trúc dữ liệu:M không quá 17 chữ số. Ta dùng kiểu Exrtended để biểu diễn vì kiểu biểu diễn này có thể cho kết quả chính xác hơn 17 chữ số:ds[i]: nhãn đỉnh i. Khởi tạo ds[i]=0 i=1..n Giải thuật:Do N lớn (2<=N<=7000). Ta không thể lưu lại toàn bộ dữ liệu của đồ thị G nên sẽ xử lí cùng lúc đọc. Giả sử ta đọc được dữ liệu là (a,b). Khi đó ta có kết luận sau: + a,b thuộc 1 TPLT+ Nếu TPLT chứa a,b là đồ thị 2 phía thì a,b thuộc 2 tập đỉnh 2 phía khác nhau. Ta sẽ gán nhãn như sau:Nếu a,b chưa có nhãn: ds[a]=ds[b]=0: TPLT chứa a,b chưa xác định. Khi đó tăng biến đếm và đặt ds[a]=+đếm, ds[b]= - đếm.ds[a]=0, ds[b]≠0; ds[a]= - ds[b]: a thuộc tập đỉnh đối diện b của đồ thị hai phía chứa a và b.ds[a]≠ 0, ds[b]=0; ds[b]= -ds[a]ds[a]≠ 0, ds[b]≠ 0; Vậy nếu:+ ds[a]=ds[b]: vô nghiệm. Halt.+ ds[a]= -ds[b]: Bỏ qua, xét tiếp file đầu vào.+ ds[a]≠ ds[b]: sửa lại nhãn cho b theo a và các đỉnh có nhãn liên quan (±b) theo a

Page 93: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 93

Kết thúc việc nhập thì:Nếu ds[i]=0 suy ra i là một TPLT ị tăng biến đếm và gán nhãn ds[i]=đếmNếu ds[i] ≠ 0 suy ra tập các đỉnh có nhãn ds[j]=ds[i] là tập đỉnh phía này, tập các đỉnh có nhãn ds[j]= - ds[i] là tập đỉnh phía còn lại.Xét yêu cầu tìm cách phân chia sao cho chênh lệch ít nhất.Vì số TPLT: K<56 nên ta có thể quy bài toán về bài toán xoay đômino quen thuộc như sau: Xét hàng đôminô xếp như sau:

Phần trên các đôminô là nửa trên, phần dưới là nửa dưới. Yêu cầu xoay các đôminô sao cho chênh lệnh tổng nửa trên và tổng nửa dưới bé nhất. Đối với bài toán này ta sẽ xét các con đôminô đặc biệt mà mặt trên là pi, mặt dưới là qi, i=1..k, pi, qi là số đỉnh của hai phía của đồ thị 2 phía thứ i. Khi đó, ta qui về bài toán chia kẹo gồm k gói mà số kẹo mỗi gói là | pi-qi| , i=1..k. Cần chia làm 2 sao cho chênh lệch bé nhất. Do K<=56 nên ta có thể dùng đệ quy hay quy hoạch động để giải quyết. Chương trình: {$B-,Q+,R+,N+}{$M 65520,0,655360}program Diep_Vien;type mang=array[0..3500]of boolean;const max=7000; vc:extended=1.0E17; fi='spier.inp'; fo='spier.out';var ds:array[1..max]of integer; a,b:array[1..max]of integer; d:array[1..56]of ^mang; n,x,y,dem,w,k,i,luu:integer; f:text;

procedure ThietLap;var i:integer; d:array[-max..max] of integer;begin k:=0; w:=0; for i:=-dem to dem do d[i]:=0; for i:=1 to n do inc(d[ds[i]]); for i:=1 to dem do if d[i]>0 then begin inc(k);

Page 94: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

94 Tin hoïc & Nhaø tröôøng

if d[i]>d[-i] then begin a[k]:=d[i]-d[-i]; b[k]:=i; end else begin a[k]:=d[-i]-d[i]; b[k]:=-i; end; inc(w,a[k]); end; w:= w div 2;end;

procedure ChiaKeo;begin for i:=1 to k do begin new(d[i]); d[i]^[0]:=true; for x:=1 to w do d[i]^[x]:=false; end; if a[1]<=w then d[1]^[a[1]]:=true; for i:=2 to k do for x:=1 to w do if x>=a[i] then d[i]^[x]:=d[i-1]^[x-a[i]]or d[i-1]^[x] else d[i]^[x]:=d[i-1]^[x];end;

procedure TruyXuat;begin for x:=w downto 0 do if d[k]^[x] then break; y:=k; repeat if x>=a[y] then if(y=1)or d[y-1]^[x-a[y]]then begin x:=x-a[y]; b[y]:=-b[y]; end; dec(y); until y=0;end;

procedure Print;begin

Page 95: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 95

w:=0; for x:=1 to k do for y:=1 to n do if ds[y]=b[x] then begin write(f,y,' '); inc(w); if w mod 40=0 then writeln(f); end; writeln(f); w:=0; for x:=1 to k do for y:=1 to n do if ds[y]=-b[x] then begin write(f,y,' '); inc(w); if w mod 40=0 then writeln(f); end;end;

procedure Xuat(b:boolean);var r:extended;begin assign(f,fo); rewrite(f); if b then begin r:=2; for i:=1 to dem-w do r:=(r-1)*2; w:=0; for i:=1 to n do if ds[i]=0 then begin inc(dem); ds[i]:=dem; inc(w); end; for i:=1 to w do r:=(r -1)*2; if w=n then r:=(r-1)-2; if r<vc then writeln(f,r:0:0) else begin write(f,'Du Lieu Qua Lon ! So Cach Phan Nhom Vuot Qua 17 Chu So'); close(f); halt; end;

Page 96: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

96 Tin hoïc & Nhaø tröôøng

ThietLap; ChiaKeo; TruyXuat; Print; end else write(f,0); close(f);end;

procedure Test;begin if ds[x]=0 then if ds[y]=0 then begin inc(dem); ds[x]:=dem; ds[y]:=-dem; end else ds[x]:=-ds[y] else if ds[y]=0 then ds[y]:=-ds[x] else if ds[x]=ds[y] then begin Xuat(false); halt; end else if ds[x]<>-ds[y] then begin luu:=abs(ds[y]); inc(w); if longint(ds[x]*ds[y])<0 then k:=1 else k:=-1; for i:=1 to n do if abs(ds[i])=luu then ds[i]:=(ds[i] div luu)*k*ds[x]; end;end;

procedure XuLi;begin assign(f,fi); reset(f); readln(f,n); for i:=1 to n do ds[i]:=0; dem:=0; w:=0; while not eof(f) do

Page 97: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 97

begin readln(f,x,y); Test; end; close(f); Xuat(true);end;

begin XuLi;end.{Lời giải của bạn Lương Ngọc Hoàng (BBT có chỉnh sửa) - Lớp 11C3 - THPT Hùng Vương - Plei Ku - Gia Lai:}Bài 145/2003 - Ông thợ cắt tócBài toán được giải một cách đơn giản như sau. Ta ký hiệu x là số tiền đầu tiên ở trong ngăn kéo. Theo đầu bài thì: Sau khi người thứ nhất đặt vào x đồng và lấy đi 2 đồng, số tiền trong ngăn kéo còn lại là x+x- 2= 2x-2. Sau khi người thứ hai đặt vào 2x-2 đồng và lấy ra 2 đồng, số tiền trong ngăn kéo còn lại là (2x-2) + (2x-2)–2 = (4x-6)–2 Sau khi người thứ 3 đặt vào 4x-6 đồng và lấy ra 2 đồng, trong ngăn kéo hết tiền, nghĩa là (4x-6) +(4x-6)-2=0. Do đó 8x=14 hay x=1,75 (đồng) Như vậy trứơc khi người thứ nhất trả tiền thì ông thợ cắt tóc có 1,75 đồng trong ngăn kéo.

Bài 146/2003 - Cắt hình chữ nhật

Đây là một bài toán Quy hoạch động (QHD) cơ bản. Ta lập hàm QHD: F[i,j] cho số hình vuông ít nhất cắt ra được từ một hình chữ nhật (HCN) kích thước i*j. Dễ thấy: - HCN có 2 cạnh bằng nhau thì F[i,i]=1. - HCN có kích thước a*b (1<=n, a <= b): Ta gọi một nhát cắt là "hoàn toàn" nếu nó chia HCN thành 2 HCN khác, nghĩa là nó không "lơ lửng" trong HCN. Nhận xét (bạn đọc dễ dàng chứng minh): Khi cắt HCN a*b, trong các nhát cắt hoàn toàn có ít nhất 1 nhát cắt làm cho F[a,b] nhỏ nhất, đó là nhát cắt ta sẽ chọn tại mỗi bước cắt. Tất cả các bạn đều dựa trên nhận xét này để giải quyết bài toán. Từ đó theo tư tưởng tích luỹ QHD, F[a,b] sẽ được xác định bằng cách thử tất cả các nhát cắt hoàn toàn: F[a,b]= min{ F[a,k]+F[a,b-k]; F[i,b]+F[a-i,b]} với 1<= k<=b div 2, 1<=i<=a div 2. HCN a*b được chia thành 2 HCN a*k và a*(b-k) hoặc i*b và (a-i)*b. Kết quả ta có F[m,n] là số hình vuông ít nhất cắt ra từ HCN m*n ban đầu. Để xuất kết quả ta dùng đệ quy và các mảng phụ trợ. Toàn bộ văn bản chương trình như sau: Program CatHCN;Const fi ='cut.inp'; fo ='cut.out';Var g: text;

Page 98: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

98 Tin hoïc & Nhaø tröôøng

m,n: byte; f,a,b: array[1..100,1..100] of integer;

Procedure nhap;Var f: text;Begin assign(f,fi); reset(f); readln(f,m,n); close(f);End;

Procedure QHD;Var i,j,k: byte;Begin for i:=1 to m do for j:=1 to n do if i=j then f[i,j]:=1 else begin f[i,j]:=maxint; for k:=1 to i-1 do if f[i,j]>f[k,j]+f[i-k,j] then begin f[i,j]:=f[k,j]+f[i-k,j]; a[i,j]:=k; b[i,j]:=0; end; for k:=1 to j-1 do if f[i,j]>f[i,k]+f[i,j-k] then begin f[i,j]:=f[i,k]+f[i,j-k]; a[i,j]:=0; b[i,j]:=k; end; end;end;

Procedure cut(i,j:byte);Begin if i=j then write(g,i,' ') else if a[i,j]<>0 then begin cut(i-a[i,j],j); cut(a[i,j],j);

Page 99: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 99

end else begin cut(i,j-b[i,j]); cut(i,b[i,j]); end;end;

Procedure xuat;Begin assign(g,fo); rewrite(g); writeln(g,f[m,n]); cut(m,n); close(g);End;

BEGIN nhap; QHD; xuat;END.Giải bài 147/2003 - Khoán công việcHướng giải quyết: Bài toán trông có vẻ phức tạp với 3 hệ số cho mỗi công việc, nhưng thực ra lại đơn giản là một bài toán sắp xếp. Mời các bạn tham khảo cách đặt vấn đề của bạn Lương Ngọc Hoàng: Ta phát biểu lại bài toán một cách đơn giản như sau: "Một người cần làm n việc. Biết việc i (i=1..n) có: hạn định di thời gian thực hiện pi hệ số tính điểm ci. Giải sử ti là thời gian hoàn thành việc i, khi đó điểm được tính là c i(di - ti). Cần tìm trình tự thực hiện các công việc sao cho tổng số điểm là lớn nhất."Giả sử hoán vị A: 1 , 2 ,.., k , k+1 ,.., n của 1.. n là trình tự tối ưu. Xét hoán vị B: 1 , 2 ,.., k-1 k+1 , k , k+2 .., n (chỉ đổi chỗ thứ tự hai công việc k và k+1 so với hoán vị A). Gọi IA, IB là điểm thu được theo các trình tự A và B. Ta có:

Do A là trình tự tối ưu nên

Tổng quát hoá, trình tự A là tối ưu Bài toán tìm trình tự bây giờ trở thành một bài toán sắp xếp thuần tuý. Đây không phải là một bài toán khó về giải thuật nên hầu hết các bạn đều đi đúng hướng, nhưng thật đáng tiếc là lại không có nhiều bạn nào giải quyết được triệt để bài toán đưa ra. Hầu hết các bạn đều mắc lỗi tổ chức dữ liệu.

Page 100: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

100 Tin hoïc & Nhaø tröôøng

Tác giả không đưa ra các giới hạn cụ thể của các chỉ số p, d, c, mà chỉ giới hạn n<=30000, vậy n là khá lớn. Tổ chức dữ liệu: type m1word=array[0..30001] of word; var p,d,c: ^m1word; cs: m1word; Các mảng p, d, c dùng để lưu các hệ số của từng công việc. Mảng cs dùng để lưu chỉ số, sẽ được khởi tạo: for i:=1 to n do cs[i]:=i;

Lưu ý: có nhiều bạn cũng sử dụng 4 mảng như trên nhưng khi chạy lại bị thông báo lỗi 203 "Heap overflow error", lý do là các bạn đã thay đổi chế độ bộ nhớ mặc định của Pascal từ {$M 16384,0,655360} sang {$M 65384,0,655360}, như thế chỉ làm giảm vùng Heap của Pascal thôi!Giải thuật sắp xếp: Các bạn nên sử dụng các giải thuật sắp xếp nhanh, ở đây trình bày QuickSort theo chỉ số. function chia(i:word):real;begin chia:=p^[cs[i]]/c^[cs[i]];end;

procedure QuickSort(l,r:word);var x:real; i,j,tg:word;begin x:=chia((l+r) div 2); i:=l; j:=r; repeat while Chia(i)<x do inc(i); while Chia(j)>x do dec(j); if i<=j then begin tg:=cs[i]; cs[i]:=cs[j]; cs[j]:=tg inc(i); dec(j); end; until i>j; if i<r then QuickSort(i,r); if j>l then QuickSort(l,j);end;Thủ tục sau đây dùng để tính lượng tiền thưởng và tiền phạt:procedure TinhTien(var thuong, phat: extended);var tgian: extended; i: word;

Page 101: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 101

begin thuong:=0; phat:=0; tgian:=0; for i:=1 to n do begin tgian:=tgian+p[cs[i]]; if tgian<d[cs[i]] then thuong:=thuong+c[cs[i]]*(d[cs[i]]-tgian) else phat:=phat+c[cs[i]]*(tgian-d[cs[i]]) end;end;Lưu ý: Do n khá lớn nên để đảm bảo, các bạn cần khai báo các biến dùng để lưu tiền thưởng, tiền phạt và thời gian thực hiện kiểu Extended. Các bạn hãy suy nghĩ thêm có phải dùng đến "Số khổng lồ" không(?). Bài 148/2003 - Những giỏ táoTheo giả thiết của bài toán thì số táo của cả hai loại còn lại phải chia hết cho 3. Tổng số táo ban đầu là 150 quả. Do đó số táo bán đi phải là một số chia hết cho 3, đó là số táo ở giỏ thứ 3. Như vậy số táo còn lại là 150 −30 =120 và vì số táo đỏ ít hơn 2 lần số táo trắng nên số táo đỏ bằng 120:3=40. Vậy số táo đỏ còn lại là 40 quả.

Bài 149/2003 - Linh kiện

Dễ dàng nhận ra đây là trường hợp riêng của bài toán cặp ghép tối ưu lực lượng không bằng nhau. Bài toán tổng quát đã được bạn Lê Văn Chương (trong bài "Cặp ghép" số tháng 11-2001) và bạn Trần Đức Thiện (trong bài "Cặp ghép tối ưu lực lượng không bằng nhau" số tháng 12-2002) giải quyết triệt để. ở đây không nhắc lại mà chỉ xin bàn thêm về trường hợp riêng này. Ta xây dựng đồ thị hai phía như sau: + Một bên là tập X các linh kiện 1..m. + Một bên là tập Y các vị trí của vi mạch từ 1..n Mảng trọng số C với C[i,j]=1 khi linh kiện i có trong kho và có thể lắp vào vị trí j của vi mạch, ngược lại C[i,j]:=0. Hai đỉnh i, j gọi là "liên kết" với nhau khi C[i,j]=1; Tư tưởng thuật toán Kuhn-Munkres áp dụng riêng cho trường hợp trọng số 0 − 1 như sau: - Bắt đầu từ tập rỗng các cặp ghép. - Tại mỗi bước, đường tăng cặp ghép là (minX, minY).Trong đó C[minX,minY]=1, minX là đỉnh thuộc X có ít liên kết nhất với các đỉnh còn lại thuộc Y (các đỉnh chưa được kết nạp vào tập cặp ghép); trong số các đỉnh liên kết với minX, minY có ít liên kết nhất với các đỉnh còn lại thuộc X. Toàn bộ văn bản chương trình như sau: Const fi='chip.inp'; fo='chip.out';Type arr1=array[1..100]of byte; arr2=array[1..100,1..100]of byte;Var f,g:text; M,N,K:byte;

Page 102: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

102 Tin hoïc & Nhaø tröôøng

A,Dx,Dy,sol:arr1; C: arr2;Procedure input;Var i,j:byte;Begin Assign(f,fi); Reset(f); readln(f,M,N,K); Fillchar(C,sizeof(C),0); Fillchar(Dx,sizeof(Dx),0); Fillchar(Dy,sizeof(Dy),0); For i:=1 to N do Begin While not seekeoln(f) do begin read(f,j); C[i,j]:=1; inc(Dx[i]); inc(Dy[j]); end; readln(f); end; Fillchar(A,sizeof(A),0); For i:=1 to K do Begin read(f,j); A[j]:=1; end; Close(f);end;Procedure Nosolution;Begin Assign(g,fo); Rewrite(g); writeln(g,'No'); close(g); halt;end;Procedure Prepare;Var i,j:byte;begin For i:=1 to N do For j:=1 to M do If C[i,j]=1 then If A[j]=0 then begin

Page 103: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 103

C[i,j]:=0; dec(Dx[i]); dec(Dy[j]); end;end;Function MinX:byte;Var i,j:byte;begin j:=0; For i:=1 to N do If Dx[i]>0 then If (j=0)or(Dx[i]<Dx[j]) then j:=i; MinX:=j;end;Function MinY(x:byte):byte;Var i,j:byte;begin j:=0; For i:=1 to M do If C[x,i]=1 then If (j=0)or(Dy[i]<Dy[j]) then j:=i; MinY:=j;end;Procedure Del(x,y:byte);Var i:byte;begin For i:=1 to M do If C[x,i]=1 then begin C[x,i]:=0; dec(Dy[i]); end; For i:=1 to N do If C[i,y]=1 then Begin C[i,y]:=0; dec(Dx[i]); end; Dx[x]:=0; Dy[y]:=0;end;Procedure Solve;Var i,x,y:byte;begin

Page 104: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

104 Tin hoïc & Nhaø tröôøng

Prepare; Fillchar(sol,sizeof(sol),0); For i:=1 to N do begin x:=MinX; If x=0 then nosolution; y:=MinY(x); If y=0 then nosolution; sol[x]:=y; Del(x,y); end;end;Procedure output;Var i:byte;begin Assign(g,fo); Rewrite(g); writeln(g,'Yes'); For i:=1 to N do write(g,sol[i],' '); close(g);end;Begin input; Solve; output;end.(Bài giải của bạn có biệt danh Xgenuis)

Bài 150/2003 - Chữ ký

Tiếp theo số tháng 6, trong số tháng 7 THNT đưa ra thêm một bài toán quy hoạch động (QHĐ) khá hay và điển hình.Chúng tôi rất mừng khi nhận được nhiều bài giải đúng của các bạn. Có lẽ tư tưởng QHĐ là khá rõ ràng, nhưng với giới hạn m≤100, n≤500 thì các bạn cần lưu ý để có cách tổ chức, sử dụng dữ liệu tốt nhất. Thuật toán: - Gọi s[i,j] là chi phí nhỏ nhất từ tầng thứ 1 đến phòng j của tầng i; a[i,j] là chi phí phải trả khi kí ở phòng j của tầng i. - Hàm QHĐ:

Để dễ hình dung, ta coi việc đi xin chữ kí giống như việc di chuyển trên lưới ô vuông, hướng di chuyển chỉ có thể từ dưới lên, từ trái sang, từ phải sang:

Page 105: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 105

Với mỗi tầng, ta thực hiện duyệt một lần từ bên trái sang, một lần từ bên phải sang như sau: For j:=1 to n do s[i,j]:=s[i,j]+a[i,j] For j:=2 to n do If s[i,j-1]+a[i,j] For j:=n-1 downto 1 do If s[i,j+1]+a[i,j]<s[i,j] then s[i,j]:=s[i,j+1]+a[i,j]; Để truy xuất lại đường đi, ta tổ chức lưu lại hướng đi bằng mảng P[i,j] với quy ước: p[i,j]=1 : đi từ dưới lên. p[i,j]=2 : đi từ trái sang. p[i,j]=3 : đi từ phải sang. Thấy rằng, không phải dùng toàn bộ mảng 2 chiều s[i,j] và a[i,j] mà tại mỗi tầng, ta chỉ quan tâm thêm đến tầng ngay dưới nó. Với nhận xét này bạn có thể tiết kiệm một lượng lớn biến cần dùng. Toàn bộ văn bản chương trình như sau: program Chu_ky;const Fi = 'Sign.Inp'; Fo = 'Sign.Out'; Mm = 101; Mn = 501;var M,i : Byte; N,j,q : Integer; P : array [1..Mm,1..Mn] Of ShortInt; A : array [1..Mn] of Integer; S : array [1..Mn] Of LongInt;

procedure Init;begin Assign(Input ,Fi); ReSet(Input); Assign(Output,Fo); ReWrite(Output); Fillchar(P,SizeOf(P),1);end;function Min:integer;var i,j : Integer;begin i:=1; for j:=2 To n do if S[j]<S[i] then i:=j; Min:=i;end;function Find(x:Byte;y:Integer):Integer;begin q:=1; while x>1 Do begin

Page 106: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

106 Tin hoïc & Nhaø tröôøng

inc(q); P[x,y]:=-P[x,y]; case P[x,y] of -1 : Dec(x); -2 : Dec(y); -3 : Inc(y); end; end; P[x,y]:=-P[x,y]; Find:=y;end;procedure Run(y:Integer);begin writeln(s[j],' ',q); i:=1; j:=y; writeln(i,' ',j); while i<m do begin P[i,j]:=-P[i,j]; if P[i+1,j]<0 then Inc(i) else if P[i,j-1]<0 then Dec(j) {P[i,j+1]<0} else Inc(j); Writeln(i,' ',j); end;end;procedure Solve;begin Readln(M,N); for j:=1 to N do Read(S[j]); Readln; for i:=2 to M do begin for j:=1 to N do Read(A[j]); Readln; for j:=1 to N do S[j]:=S[j] + A[j]; for j:=2 to N do if S[j-1]+A[j] < S[j] then begin S[j]:=S[j-1]+A[j]; P[i,j]:=2; end; for j:=N-1 downto 1 do if S[j+1]+A[j]<S[j] then begin S[j]:=S[j+1]+A[j];

Page 107: Bài 101/2002 - Bảng con 5x5 · Web viewTích của 2 số có hai chữ số chia hết cho 121 và là một số có 4 chữ số được viết bằng 2 chữ số, mỗi chữ

Tin hoïc & Nhaø tröôøng 107

P[i,j]:=3; end; end; j:=Min; Run(Find(M,j));end;procedure Fini;begin close(Input); close(Output);end;begin Init; Solve; Fini;end.(Bài giải của bạn Lê Đinh Thuận − Lớp 11 trường PTTH Lê Quý Đôn − Quy Nhơn − Bình Định )