Tổng hợp các đề Olympic tin học quốc tế từ năm 1989 đến 2006
Trang 1
Đây là cuộc thi Olympiad Quốc tế môn Tin học đầu tiên được tổ chức tại thành phố Pravetz, Bulgaria từ ngày 16 đến
Tìm cách hoán chuyển sao cho tất cả các hộp chứa vật A nằm bên trái các hộp chứa vật
B, không cần biết các hộp rỗng nằm ở đâu
Bài toán đặt ra
Hãy viết chương trình:
1 Xây dựng mô hình hoán chuyển các hộp với số hộp và trạng thái ban đầu của các hộp được nhập từ bàn phím Mỗi hoán chuyển được nhập bằng số (thuộc từ 1 đến N-1) của hai hộp liền nhau đầu tiên sẽ được đổi chỗ cho các hộp rỗng Chương trình phải tìm và báo cáo trạng thái các hộp sau khi hoán chuyển
2 Cho trước hiện trạng các hộp, tìm ít nhất một cách hoán chuyển đạt mục tiêu cuối cùng của bài toán Chương trình phải báo cáo cả trạng thái ban đầu và trạng thái hiện tại sau mỗi bước hoán chuyển
3 Tìm những cách hoán chuyển để số hộp bị di chuyển ít nhất và vẫn đạt được mục đích
Bài toán 2
Các tầng trong một tòa nhà được đánh số tuần tự từ 0, 1, 2, , N (N<=15) Trong tòa nhà có tất cả K (1<=K<=4) thang máy Thang máy được điều khiển từ một trung tâm và chỉ chấp nhận hai lệnh được nhập vào bằng cách bấm nút Các nút ngoài thang máy (một nút ra lệnh lên và một nút ra lệnh xuống) có ở tất cả các tầng Các nút trong (ra lệnh đến một tầng cụ thể) có trong mỗi thang máy
Hãy viết chương trình mô phỏng quá trình điều khiển thang máy với các lệnh sau:
1 Trong tòa nhà có một thang máy (K=1) và mỗi lần nó chỉ chấp nhận một lệnh Các lệnh khác chỉ được chấp nhận khi lệnh trước đó được hoàn thành
2 Trong tòa nhà có nhiều thang máy (K>=1) Mỗi thang máy chỉ chấp nhận lệnh từ nút trong nếu không có lệnh nào đang được xử lý Thiết bị điều khiển có thể nhận nhiều lệnh cùng lúc Các lệnh trong luôn được thang máy thực hiện mỗi khi ra lệnh Thiết bị điều khiển sẽ chọn chiếc thang máy đang rỗi phù hợp nhất để thực hiện lệnh ngoài
3 Xét trường hợp tương tự trong yêu cầu 2 với điều kiện các thang máy số chẵn chỉ có thể dừng ở các tầng số chẵn và các thang máy số lẻ chỉ dừng ở các tầng số lẻ Tất cả các thang máy đều có thể dừng ở tầng 0
Trang 24 Xét trường hợp trong yêu cầu 3 và giả sử tại mỗi thang máy có nhiều lệnh đang đợi thực hiện Tất cả các lệnh trong đều được chấp nhận dù cho thang máy có rỗi hay không
Các lệnh có thể nhập vào bất cứ lúc nào, các lệnh có định dạng sau:
a, Lệnh ngoài - <số tầng, hướng di chuyển (lên hoặc xuống)>;
b, Lệnh trong - <số tháng máy, số tầng>
Tại mỗi thời điểm có thể nhập nhiều lệnh hoặc không nhập lệnh nào
Tại mỗi thời điểm chương trình báo vị trí của mỗi chiếc thang máy
Thang máy đủ lớn và không bị quá tải
Chương trình phải điều khiển thang máy sao cho tối ưu nhất
Bài toán 3
Cho trước một nhóm N người Mỗi người là bạn của hơn [N/2] người còn lại và là kẻ thù của không quá K người Một người có một cuốn sách mà tất cả mọi người đều muốn đọc
và thảo luận với một số người khác
Hãy viết chương trình:
1 Tìm cách truyền tay nhau cuốn sách sao cho tất cả mọi người đều được đọc nó một lần và chuyển nó cho bạn mình và cuối cùng cuốn sách về tay người chủ
2 Chia nhóm người thành S tổ để thảo luận về cuốn sách Mỗi người phải có không quá P kẻ thù trong cùng tổ
Giả sử S*P >= K
Bài toán 4
Xét đoạn văn bản được soạn thảo bằng các ký tự viết hoa /A-Z/ và 8 ký tự , + - : / ? ! Đoạn văn bản đó được gửi qua kênh giao tiếp dưới dạng chuỗi byte Số ký tự 1 trong mỗi byte phải là số chẵn
1 Đưa ra cách mã hóa các ký tự trên bằng các chuỗi nhị phân sao cho cách mã hóa rõ ràng và số bit được gửi qua kênh giao tiếp là ít nhất
2 Hãy viết chương trình:
2.1 Cho trước đoạn văn bản, hãy in ra đoạn văn bản dưới dạng một chuỗi các số thập lục phân
2.2 Cho trước đoạn văn bản đã mã hóa nhận được, hãy giải mã và hiển thị đoạn văn bản lên màn hình
Bài toán 5
Xét một hình phẳng gồm n đỉnh, mỗi đỉnh đều bậc 3
Ví dụ:
Trang 3
Để các đỉnh X,Y và Z liền kề đỉnh T Ta nói Y là đỉnh lân cận trái và Z là đỉnh lân cận phải của T tính theo X, nếu góc XTZ nhỏ hơn góc XTY
Ví dụ, E là đỉnh lân cận phải và G là đỉnh lân cận trái của H tính theo A vì góc
AHE nhỏ hơn góc AHG
Hãy viết chương trình:
1 Nhập tọa độ của các đỉnh và các cạnh của hình phẳng, hãy vẽ hình đó lên màn hình theo một tỷ lệ phù hợp Các cạnh được biểu diễn bằng các đoạn thẳng
2 Cho trước một cặp đỉnh X0 và X1 và một chuỗi các ký tự L và R Hãy tìm một đường đi X0X1X2 Xn trên hình đó sao cho:
- X0 và X1 là hai đỉnh bắt đầu;
- Xi+1 là đỉnh lân cận trái hoặc đỉnh lân cận phải của Xi tính theo Xi-1 tuỳ theo
ký tự thứ (i-2) trong chuỗi điều khiển là L và R
Ví dụ:
Đường đi tìm được trong ví dụ trên với A và H là các đỉnh bắt đầu và chuỗi LRRLLR là AHGFEDCB
3 Vẽ đường đi trong yêu cầu 2 lên màn hình
4 Dùng một đỉnh bắt đầu và một đỉnh kết thúc, hãy vẽ một đường đi qua số đỉnh ít nhất, vẽ đường đi đó lên màn hình và báo cáo các đỉnh bắt đầu cùng chuỗi điều khiển tạo
ra đường đi như trong yêu cầu 2
Bài toán 6
Cho trước một đa giác có 20 cạnh Các cạnh được đánh số từ 1 đến 20 Hãy tìm đường đi trên hình đa giác 20 cạnh sao cho chỉ đến mỗi cạnh duy nhất 1 lần Đường đi giá trị C được định nghĩa là tích vô hướng:
trong đó fi là số cạnh đi qua ở bước thứ i
Chỉ có thể đi từ cạnh này sang cạnh khác nếu hai cạnh đó nằm lân cận
A Hai cạnh lân cận nhau nếu có một đỉnh chung;
B Hai cạnh lân cận nhau nếu có một đỉnh chung hoặc có một điểm chung
Hãy tìm các đường đi có giá trị nhỏ nhất cho ví dụ trên
Chú ý:
Vì tính phức tạp về thời gian và không gian của thuật toán nên bạn không cần tìm kết quả chính xác mà chỉ cần đưa ra một kết quả tương đối
Trang 4Cuộc thi Olympiad Tin học Quốc tế lần thứ hai được tổ chức tại
MINSK,BYELLORUSSIA năm 1990
Ngày thứ nhất
Bài toán 1 Hãy lập chương trình biến đổi bảng số trong hình A thành bảng số trong hình
B Mỗi số trong một ô vuông có thể di chuyển đến một trong các ô trống khác; lúc này ô vuông chứa số đó sẽ trở thành trống
Bài toán 2
Trò chơi với các hộp, yêu cầu người chơi nối các chấm trên lưới Người chơi hoàn thành một hộp sẽ ghi được 1 điểm và chuyển đến lượt người kia Trò chơi kết thúc khi lưới được hoàn thành và người thắng cuộc là người nhiều điểm hơn Chỉ cho phép nối khoảng cách giữa hai điểm theo hàng ngang và hàng dọc Ví dụ dưới minh họa trò chơi giữa Red
và Blue mới được hoàn thành một nửa:
Lưới trong trò chơi được minh họa bằng ký tự R và B chỉ các dòng tương ứng Red và Blue điền được, còn số 0 chỉ dòng trống:
Trang 5
Trò chơi được thu gọn lại dưới dạng một ma trận như sau:
2 Sửa lại chương trình, tiếp tục trò chơi chỉ dành cho Blue Hãy hoàn thành nhiều hộp nhất với một lần di chuyển Không cần thực hiện lần di chuyển cuối cùng Chương trình phải báo cáo: x hộp được hoàn thành Lần di chuyển cuối cùng = L, C trong đó L và C là hàng và cột minh họa ký tự trong ma trận và x là số hộp mới được hình thành nhưng không nằm trong số hộp được hoàn thành trong lưới
có thể không đọc liên tục tức là trong quá trình đọc sách, người đọc có thể dừng đọc ở một thời điểm nguyên nào đó sau đó lại tiếp tục từ thời điểm ngừng đó Trong khoảng thời gian nghỉ đó, người đọc có thể đọc bất kì cuốn sách khác mà người đó chưa đọc xong hoặc đọc tiếp một cuốn sách mới (hoàn toàn chưa đọc gì) mà người đó được quyền đọc
Trang 61 Nhập giá trị N và xác định xem người chơi thứ nhất có chiến thắng được không Đưa
ra thông báo "Player 1 has winning strategy" hoặc "Player 1 doesn't have winning
strategy" ('Người chơi thứ nhất có thể chiến thắng' hoặc 'Người chơi thứ nhất không thể
chiến thắng')
2 Với N cho trước, hãy xác định xem người chơi thứ nhất có thể chiến thắng không nếu lần chọn đầu tiên của anh ta được nhập từ bàn phím
3 Hãy viết chương trình mô phỏng người chơi thứ hai với N cho trước và người thứ nhất
đi trước Các nước đi của người chơi thứ nhất được nhập từ bàn phím Các nước đi được
mô phỏng bằng chỉ số của ô giấy L (1<=L<=N-K+1) Các ô giấy từ L đến L+K-1 được chọn và lấy đi trong quá trình chơi Sau mỗi nước đi, vị trí hiện thời của trò chơi được in
ra theo mẫu:
1 2* 3* N
Chỉ số được in ra ở phía trên, các ô giấy bị lấy đi được đánh dấu bằng biểu tượng '*' Khi trò chơi kết thúc hãy in ra báo cáo 'Victory of Player 1 (Player 2)' Khi nhập giá trị c ủa N
và K, in ra 'N>' và 'K>' Khi nhập nước đi hãy in ra 'Move of Player 1>'
Giả sử dữ liệu nhập vào là chính xác
Bài toán 5 [ PROLAN/M ]
Giả sử công ty phần cứng NePhihhan đang phát triển một bộ vi xử lý mới mang tên RISC
có khả năng xử lý một kiểu thông tin đơn giản - chuỗi ký tự - và thực hiện một lệnh thay thế đơn giản (tìm kiếm các chuỗi con và thay thế nó bằng các chuỗi con khác) Người ta
sử dụng hai vùng bộ nhớ, một vùng chứa chương trình (danh sách các mô tả các thay thế), còn vùng kia (ta sẽ gọi là R với kích thước gần như không giới hạn) được dùng để lưu trữ dữ liệu vào, các kết quả trung gian và kết quả cuối cùng
Các chương trình điều khiển bộ vi xử lý được viết bằng ngôn ngữ được gọi là PROLAN/M Trước khi mô tả chính thức, ta xét chương trình ví dụ dưới:
(aa,b) (ba,a) (bc,a) (c,start) (d,) (b,finish) (,)
Trang 7Khi xử lý chuỗi dữ liệu vào 'abcabcd', chương trình in chuỗi dữ liệu ra 'finish', còn nội dung của R lần lượt là một trong các chuỗi abcabcd, aaabcd, babcd, abcd, aad, db, b, finish
Mô tả cú pháp chính thức của ngôn ngữ PROLAN/M (dùng "::=" để chỉ "được định nghĩa là" và ":" để chỉ "hoặc"):
<'PROLAN/M'-program> ::= <substitut.sequence>(,)
<substitut.sequence> ::= <substitution>:
::= <substitut.sequence><substitution>
<substitution> ::= (<left part>,<right part>)
<left-hand part> ::= <string>
<right-hand part> ::= <string>:<empty>
<string> ::= <string symbol>:<string><string symbol>
<empty string> ::=
<string symbol> ::= <any ASCII character except ',' , ')' >
Sau khi chuỗi dữ liệu được nhập vào R, chương trình được thực hiện như sau: bộ vi xử
lý tìm kiếm <substitution> đầu tiên trong <substitut.sequence> trong đó <left-hand part>
là chuỗi con của chuỗi trong R Nếu tìm kiếm thành công, <right-hand part> của cùng
<substitution> sẽ thay thế chuỗi con tương ứng trong R (chuỗi tận cùng bên trái nếu kết quả tìm kiếm không là duy nhất) Thủ tục này được lặp lại từ đầu với giá trị R mới đến khi <left-hand part> trong <'PROLAN/M'-program> được tìm thấy là một chuỗi con với giá trị R hiện tại, đây là kết quả cuối cùng và quá trình xử lý kết thúc
1990+123=2113 sau quá trình xử lý Lưu chương trình của bạn vào tệp SUM.PRM
Câu 2
Viết chương trình sửa lỗi theo ngôn ngữ PROLAN/M thực hiện nhiệm vụ sau:
(a) Lưu tên tệp văn bản theo ngôn ngữ PROLAN/M;
(b) Tìm nội dung ban đầu của R;
(c) Biểu diễn quá trình chuyển chuỗi dữ liệu vào bằng chương trình trong tệp văn bản; (d) hiển thị kết quả lên màn hình;
(e) Tìm sơ đồ chuyển đổi
Bài toán 6
Cho trước các số nguyên a và n (n<100) Giả sử một ngôn ngữ lập trình tưởng tượng chứa chỉ lệnh và phép nhân Hãy viết chương trình tạo 1 văn bản bằng ngôn ngữ đó cho
Trang 8biểu thức b=a^n, với số phép nhân ít nhất Ví dụ dưới xét đoạn văn bản được tạo ra với n=13, trong đó giữa cặp dấu {} chứa chú giải:
Mỗi nhân viên bảo vệ trong một triển lãm nghệ thuật phải làm nhiệm vụ trong một
khoảng thời gian Chương trình bảo vệ được biểu diễn bằng các cặp [T1(i),T2(i)] - chỉ thời điểm bắt đầu và kết thúc ca làm việc của nhân viên bảo vệ thứ i Cho trước một chương trình bảo vệ, hãy:
(a) Kiểm tra xem có ít nhất hai người bảo vệ nào làm nhiệm vụ trong khoảng thời gian [0, EndTime]
Nếu điều kiện (a) không thỏa mãn, hãy
(b) Xác định tất cả các khoảng thời gian thiếu nhân viên bảo vệ (ít hơn 2 người đang làm nhiệm vụ)
(c) Xác định số nhân viên bảo vệ cần bổ sung ít nhất làm nhiệm vụ trong một khoảng thời gian bắt buộc theo chương trình bảo vệ, ví dụ, bổ xung nhân viên thỏa mãn điều kiện (a)
INPUT
(Tất cả thời gian đều là số nguyên tính bằng phút)
EndTime - thời điểm kết thúc nhiệm vụ canh gác, triển lãm cần canh gác trong khoảng thời gian [0, EndTime]
N - số nhân viên bảo vệ
T1[i] T2[i], i=1, , N - thời gian bắt đầu và kết thúc ca trực của nhân viên thứ i
Length - thời gian làm việc bắt buộc đối với một nhân viên bổ sung
OUTPUT
(1) Câu trả lời cho yêu cầu (a) theo định dạng "Yes/No"
(2) Nếu câu trả lời trước là "no", hãy kiệt kê các cặp số (k,1) - chỉ thời gian bắt đầu và kết thúc của tất cả các khoản thời gian thiếu nhân viên bảo vệ và số số nhân viên thiếu trong mỗi khoảng thời gian đó (0 hoặc 1 người)
(3) Số nhân viên bổ sung và danh sách các thời gian bắt đầu và kết thúc trong khoảng thời gian bắt buộc của mỗi nhân viên bổ sung
Trang 9Bài toán 2
N đoạn được đặt trên mặt phẳng theo tọa độ các điểm cuối, N>0 Các điểm cuối của một đoạn được biểu diễn bằng hai cặp (x1[i], y1[i]) và (x2[i], y2[i]), 1<=i<=N Điểm cuối của một đoạn bất kỳ đều thuộc đoạn đó Hãy viết chương trình để:
1 Biểu diễn dữ liệu vào theo mẫu
Các robot được điều khiển theo cách sao cho tổng thời gian để các robot gặp nhau là ít nhất Hãy xác định thời gian T nhỏ nhất để sau đó tất cả các robot có thể gặp nhau tại 1 điểm, hoặc nếu không xác định thời gian T nhỏ nhất để các robot không thể gặp nhau tại cùng một điểm với bất kỳ thời gian t >= 0 nào
Định dạng dữ liệu vào như sau:
<Nhập vào N:>
<Nhập số đường phố K:>
< Đường 1 nối với các điểm:>
< Đường K nối với các điểm:>
(Các cặp điểm được nhập vào: I J)
<Vị trí ban đầu của robot 1:>
(Tất cả các số trên đều là số nguyên không âm)
Định dạng dữ liệu ra như sau:
<Thời gian = >
Trang 10Bài toán 4
Tất cả các con phố của một thành phố dạng hình chữ nhật nằm trên một vùng không bằng phẳng Các con phố được ký hiệu từ Nam ngược lên Bắc (các phố N) hoặc từ Tây sang Đông (các phố M), do đó thành phố được chia thành các ô vuông với kích thước đều bằng 1 Các đoạn phố nằm giữa hai điểm giao liền nhau chỉ chạy theo xuống hoặc lên hoặc có thể nằm ngang Ma trận K[y,x] (kích thước M x N) chứa độ cao của các điểm giao cắt so với mực nước biển
Hãy viết chương trình thực hiện:
1 Nhập kích thước ma trận M và N
2 Nhập các phần tử của ma trận H[i,j]; (i=1,M , j=1,N)
3 Nhập tọa độ của hai điểm giao A và B
4 Trả lời câu hỏi: Có thể đi từ A sang B hoặc từ B sang A mà chỉ đi theo hướng xuống? Nếu câu trả lời với dữ liệu câu 3 là luôn khẳng định, chương trình còn phải:
5 Xác định ít nhất một đường đi như vậy và hiển thị tọa độ của điểm giao lên màn hình
6 Xác định tất cả các đường đi như vậy
Trang 11
Cuộc thi Olympiad Quốc tế môn Tin học lần thứ ba tổ chức tại ATHENS, GREECE từ ngày 19 đến ngày 25
tháng 5 năm 1991
I Bài toán chơi bài
Một bộ bài gồm 52 quân với 13 giá trị khác nhau: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K và bốn chất khác nhau: Bích, Nhép, Rô và Cơ (quân Bích và quân Nhép màu đen, quân Rô
và quân Cơ màu đỏ) Sau khi xáo kỹ bộ bài, ta lần lượt rút 12 quân và xếp thành 3 hàng mỗi hàng 4 quân trên bàn
Trong những lần này, nếu ta rút được các quân J, Q hoặc K, ta đặt các quân đó xuống cuối bộ bài và tiếp tục rút cho đến khi đủ 3 hàng mỗi hàng 4 quân Ta tiếp tục kiểm tra những quân bài đã xếp trên bàn xem có các cặp bài có tổng giá trị bằng 10 Nếu có hai quân bài với mỗi quân có giá trị bằng 10, ta coi một trong hai quân đó có giá trị là 0 (tức
là với hai quân 10 ta coi như một cặp có tổng giá trị bằng 10)
Trong số những cặp bài trên bàn, ta đặt hai quân bài trong bộ còn lại, mỗi quân lên một quân trong cặp đó Trong quá trình đặt, nếu ta rút ra được một trong các quân J, Q hoặc
K, ta đặt quân bài đó lên một quân trong cặp và quân này không được tham gia vào bất
kỳ một thủ tục nào khác
Quá trình được tiếp tục thực hiện đến khi toàn bộ mặt 12 quân bài đều là J, Q, K hoặc không còn cặp nào có tổng giá trị bằng 10
Hãy viết chương trình mô phỏng quá trình trên với những yêu cầu sau:
1 Số N - số lần lặp lại thủ tục trên phải được nhập từ bàn phím Khi N = 1, một trong các trường hợp 2,3 và 4 dưới đây xảy ra
2 (a) Bộ bài phải được tạo mới, với mỗi lần lặp lại chương trình phải xáo lại bài
(b) Bộ bài được hiển thị ra màn hình
3 (a) 12 quân bài hiển thị trên màn hình theo quá trình mô tả trên
(b) Các quân bài còn lại trong bộ bài phải được hiển thị trên màn hình
4 (a) Các quân bài bị phủ lên trong quá trình trên phải được thay bằng các quân bài thay chúng và phải được hiển thị trên màn hình
(b) Sau mỗi lần thay thế, các quân bài còn lại trong bộ cũng được hiển thị trên màn hình
5 Sau 5 lần lặp lại, cần phải đưa ra một biểu đồ mà trong đó sẽ hiển thị số quân bài còn lại trong bộ bài sau khi kết thúc mỗi thủ tục
Trang 12II Bài toán rào cây
Một nông dân muốn bảo tồn một loại cây bách cổ quý hiếm Để làm điều này, ông ta ghi nhớ vị trí của mỗi cây và quyết định dùng dây kim loại rào quanh cây theo một hình đa giác để cây nằm toàn bộ trong đó Để giảm chi phí, ông ta cần tính chiều dài dây kim loại tối thiểu nhất Người nông dân muốn xây một ngôi nhà hình chữ nhật, một trong các cạnh nhà song song với trục X và ông ta cần biết vị trí tương đối của ngôi nhà:
(1) Ngôi nhà nằm bên ngoài hàng rào hình đa giác
(2) Ngôi nhà nằm trong hàng rào hình đa giác
(3) Hàng rào chia ngôi nhà thành hai phần có diện tích khác 0
Hãy viết chương trình thực hiện các công việc sau:
(A) Tìm các cây nằm ở đỉnh đa giác
(B) Tính chiều dài của dây kim loại cần sử dụng
(C) Chỉ ra vị trí của ngôi nhà trong ba trường hợp (1,2,3) trên
Dữ liệu vào:
- Dòng đầu tiên là N - số cây (N <= 20)
- N dòng tiếp theo, mỗi dòng là hai số (Xi,Yi), 1 <= i <= N, Xi, Yi > 0 - là tọa độ của cây thứ i
- Dòng cuối cùng là các số (a,b), (c,d); a, b, c, d > 0 - cho biết toạ độ điểm bắt đầu và kết thúc của đường chéo ngôi nhà
Kết quả:
- Đưa ra một dãy M điểm (1 <= M <= N) với tính chất là nếu ta đi theo các điểm này theo thứ tự mà chúng xuất hiện, ta sẽ được một hình đa giác ngoài (đa giác gồm M đỉnh là vị trí của M cây và bao quanh toàn bộ N điểm - vị trí của N cây)
- Chiều dài kim loại cần sử dụng
- Vị trí ngôi nhà theo dạng "1","2" hoặc "3"
III Liệt kê các vị trí trong ma trận vuông 5 x5
Liệt kê các vị trí trong ma trận kích thước 5x5 theo cách sau: nếu số i (1<=i<=25) được gán cho một vị trí trong ma trận với tọa độ (x,y), thì số i+1 có thể được gán cho một vị trí trong ma trận với tọa độ (z,w) theo một trong các quy tắc sau:
(1) (z, w) = (x+-3, y)
(2) (z, w) = (x, y+-3)
(3) (z, w) = (x+-2, y+-2)
Bài toán đặt ra như sau:
(A) Hãy viết chương trình liệt kê các vị trí trong một ma trận kích thước 5x5 bắt đầu từ
vị trí số 1
(B) Liệt kê số vị trí có thể từ một điểm bắt đầu bất kỳ ở phần trên bên phải ma trận, bao gồm cả đường chéo chính
Trang 13Ví dụ: Nếu vị trí trong ma trận có tọa độ (2,2) được chọn làm điểm bắt đầu thì vị trí tiếp
theo được gán số 2 sẽ là một trong các vị trí với tọa độ: (2,5) hoặc (5,2) hoặc (4,4) Các vị trí đó được đánh dấu hoa thị (*) trong hình 1
Chú ý: Bài làm được đánh giá tốt nếu kết quả ra trông giống như trong hình 1
Sắp xếp các ký tự theo tần số xuất hiện giảm dần và in danh sách đó ra
(C) Sửa chương trình trong yêu cầu (B) để có thể xác định tần số xuất hiện của các ký tự Tiêu chuẩn hóa việc đếm, ví dụ chia tần số xuất hiện của mỗi ký tự cho tổng số ký tự đã đọc sẽ được tỷ lệ xuất hiện tương đối phụ thuộc vào tổng số ký tự trong văn bản Viết tỷ
lệ này vào tệp dữ liệu
(D) Mở rộng chương trình ở (C) sao cho nó có thể đọc tệp văn bản và so sánh nó với một văn bản bằng một ngôn ngữ đã biết Phương pháp so sánh do bạn tự nghĩ ra Kết quả báo cáo ra cần cho biết ngôn ngữ sử dụng để viết văn bản ban đầu
V S-TERMS
S-term là một chuỗi gồm các ký tự S và dấu ngoặc đơn được định nghĩa một cách đệ quy
như sau: S là một S-term, và nếu M và N là các s-term, thì (MN) cũng là một s-term
Ví dụ:
((((SS)(SS))S)(SS))
Trang 14Các dấu ngoặc đơn bên phải không chứa thông tin gì mới, do đó có thể bỏ chúng đi, ví dụ (MN thay cho (MN), do đó chuỗi ban đầu trở thành:
((((SS(SSS(SS
1 Hãy viết một thủ tục "tạo chuỗi" để tạo ra các S-term: thủ tục của bạn phải sinh ra n (n
= độ dài = số ký tự S trong chuỗi) tệp văn bản chứa tất cả các S-term có độ dài lần lượt là 1, , n Các S-term được ngăn cách bằng dấu chấm phảy";" Kết thúc S-term cuối cùng trong mỗi tệp văn bản là một dấu chấm"."
Hãy viết chương trình nhập một số nguyên N (<=10), sử dụng thủ tục trên để hiển thị tất
cả các S-term trên màn hình
Xét một phép tính với các S-term Quy tắc S duy nhất được sử dụng là: bất kỳ chuỗi con nào của một S-term có dạng (((SA)B)C), trong đó A, B và C là các s-term đều có thể viết dưới dạng: ((AC)(BC))
ứng dụng của quy tắc này trên một S-term được gọi là rút gọn S-term
Có nhiều cách khác nhau để chọn một chuỗi con để áp dụng quy tắc S Một ứng dụng khác của quy tắc trên với một S-term được gọi là "chuẩn hóa" S-term
Ví dụ về một chuỗi thu nhỏ:
((((SS)(SS))S)(SS)) -> (((SS)((SS)S))(SS)) -> ((S(SS))(((SS)S)(SS))) -> ((S(SS))((S(SS))(S(SS))))
2 Chọn một cấu trúc dữ liệu phù hợp để biểu diễn S-term có thể hỗ trợ áp dụng quy tắc
S Hãy viết hai thủ tục "đọc chuỗi" và "in chuỗi" chuyển S-term từ cách biểu diễn "tạo chuỗi" sang cách biểu diễn của bạn và ngược lại Chương trình của bạn phải thể hiện được quá trình chuyển đó
3 Hãy viết thủ tục "thu nhỏ" biểu diễn một bước thu nhỏ theo quy tắc S trên một chuỗi con của một S-term Chương trình phải minh họa được điều này
4 Hãy viết thủ tục "chuẩn hóa": cho trước một S-term, hãy chọn một chuỗi con để áp dụng quy tắc S đến khi không thu nhỏ được nữa hoặc khi số lần thu nhỏ đã vượt quá mức tối đa, ví dụ 30 Chương trình phải minh họa được quá trình này
5 Cuối cùng, kết hợp tất cả các thủ tục trên thành một chương trình có thể:
a) yêu cầu người dùng nhập độ dài n,
b) Dùng các S-term độ dài n do quy trình "tạo chuỗi" tạo ra,
c) Chuyển các S-term sang cách biểu diễn của bạn,
d) Chuẩn hóa (nếu có thể),
e) Ghi ra kết quả chuẩn hóa các s-term,
f) Ghi ra số bước thu nhỏ với mỗi s-term, hoặc đoạn thông điệp 'not normalized' khi
không chuẩn hóa được sau 30 bước, Và
g) Báo cáo tỉ số giữa số lần không chuẩn hóa được trên tổng số của S-term với độ dài n cho trước
VI Nhóm tội phạm đông nhất
Trang 15Một cảnh sát trưởng biết rõ về số tội phạm trong thành phố mình quản lý cũng như tất cả những người cộng tác với chúng Hãy xác định tất cả các nhóm tội phạm có thể trong thành phố
Trong trường hợp này, nhóm tội phạm là một bộ phận của tất cả những kẻ phạm tội Nhóm tội phạm lớn nhất là không còn nhóm nào có số phần tử đông hơn nhóm này Hãy viết chương trình thực hiện các công việc sau:
(A) Nhập dữ liệu của cảnh sát trưởng với số tội phạm không quá 41 người Dữ liệu ra là một tệp văn bản ASCII có cấu trúc như sau:
Trong đó a(i,j) = 1, nếu người i cộng tác với người j hoặc i = j, và a(i,j) = 0 nếu ngược lại
Ví dụ trong trường hợp có 6 người:
Trong ví dụ này, kết quả ra sẽ là một trường hợp sau:
Nhóm tội phạm đông nhất là: 1 3 4 6 (tổng số phần tử trong nhóm là 4)
(B) Mở rộng phần dữ liệu vào của chương trình để tạo dữ liệu theo cách ngẫu nhiên với
Quy tắc lên kế hoạch cho cuộc hẹn như sau:
1 Một cuộc gặp dài ít nhất 70 phút, trình dược viên cần ít nhất 30 phút giữa hai cuộc hẹn để di chuyển giữa hai nơi
Trang 162 Tất cả thời gian trong dữ liệu vào đều nằm trong ngày, và trình dược viên không được gặp một bác sỹ hai lần trong ngày
3 Hai cuộc hẹn gặp liền nhau không diễn ra ở cùng một bệnh viện
4 Trong số các bác sỹ, trình dược viên thích đến bác sỹ có thể gặp sớm nhất
5 Nếu có hơn một bác sỹ có thể gặp cùng một lúc, trình dược viên thích gặp bác sỹ có thời gian còn lại trong ngày ít hơn (nhưng tất nhiên thời gian còn lại này đủ lớn hơn 70 phút)
6 Để có thể gặp càng nhiều bác sỹ càng tốt, trình dược viên luôn nghĩ đến thời gian bắt đầu của cuộc hẹn tiếp theo, do đó nếu cần, anh ta có thể chấm dứt cuộc gặp đang diễn ra ngay sau khoảng thời gian 70 phút để được 30 phút đi đường và chuẩn bị cho cuộc gặp tiếp
7 Nếu không vội vì cuộc gặp tiếp theo, trình dược viên có thể gặp bác sỹ đến lúc nào anh ta muốn
Dữ liệu vào: gồm nhiều dòng, mỗi dòng chứa các thông số của một bác sỹ được mô tả
như sau: tên của bác sỹ (theo tiếng Anh), một ký tự trống, điểm thời gian (giờ, phút, giây) chỉ thời điểm có thể bắt đầu một cuộc hẹn gặp, một dấu gạch ngang ('-'), điểm thời gian cuối cùng có thể bắt đầu cuộc gặp, tên bệnh viện của bác sỹ đó (theo tiếng Anh) Dữ liệu vào không chứa các dòng trống
Ví dụ, dữ liệu vào có dạng sau:
Kết quả ra: chứa một bảng liệt kê danh sách các cuộc gặp theo thứ tự thời gian Bảng
gồm các dòng chứa điểm thời gian bắt đầu và kết thúc của các cuộc hẹn gặp, địa điểm gặp (tên bệnh viện) và tên bác sỹ Ví dụ, kết quả ra tương ứng với ví dụ trên có dạng sau: 08.00-09.10 Cross Don
Trang 178 Giải bài toán trên với hai trình dược viên A và B theo đúng quy tắc trên và thêm giới hạn sau: họ không cùng gặp một bác sỹ Mỗi khi có sẵn cuộc gặp thì người gặp sẽ là trình dược viên có khoảng thời gian rỗi dài hơn Nếu cả hai trình dược viên đều có khoảng thời gian rỗi như nhau, A sẽ thực hiện cuộc gặp đó Kết quả ra gồm hai danh sách các cuộc gặp
Trang 18
Một bản đồ hình chữ nhật có kích thước theo hệ tọa độ là 48 x 16 Hai tọa độ được gọi là
nối với nhau nếu chúng liền nhau theo cả hướng Bắc-Nam và hướng Đông-Tây Ban đầu,
mỗi tọa độ chỉ được biết là Mặt nước W (WATER) hoặc Đất liền G (GROUND)
Có bốn kiểu tọa độ Đất liền (GT): G, M, P và C Và có bốn kiểu tọa độ Mặt nước (WT):
W, O, B và L Giả sử bên ngoài bản đồ là Đại dương (O)
Các quy tắc địa lý cho việc chuyển kiểu tọa độ, có thể là một:
- Núi (M): Nếu 1 tọa độ GT được nối với 4 tọa độ GT khác
- Bán đảo (P): Nếu 1 tọa độ GT được nối với 3 tọa độ WT; hoặc 2 tọa độ WT và ít nhất 1
tọa độ P; hoặc 1 tọa độ WT và ít nhất 2 tọa độ P
- Bờ biển (C): Nếu 1 tọa độ GT không phải là tọa độ M hay P
- Đại dương (O): Nếu 1 tọa độ WT nối với ít nhất một tọa độ O
- Vịnh (B): Nếu 1 tọa độ O được nối với ít nhất 2 tọa độ B và nhiều nhất 1 tọa độ O, hoặc
với 1 tọa độ B và ít nhất 2 tọa độ GT, hoặc ít nhất 2 tọa độ GT và ít nhất 1 tọa độ O
- Hồ (L): Nếu 1 tọa độ W không đổi đến khi không thực hiện được phép chuyển kiểu tọa
độ nào nữa
Điều này có thể xảy ra sau khi một tọa độ cụ thể đã được chuyển kiểu thì nó có thể được
chuyển kiểu một lần nữa vì kiểu của một số tọa độ lân cận có thể thay đổi trong lúc đó
Một bản đồ được khám phá nếu không thực hiện được phép chuyển tọa độ nào nữa
Yêu cầu: Hãy viết chương trình thực hiện công việc sau:
1 Đọc bản đồ một lục địa chưa được biết đến từ tệp dữ liệu vào theo định dạng ASCII và
hiển thị nó lên màn hình cùng với kiểu tọa độ ban đầu như trong ví dụ 1
2 Khám phá bản đồ và đổi kiểu tọa độ với M, P, C, O, B hoặc L theo quy tắc địa lý
3 Hiển thị bản đồ đã được khám phá lên màn hình với kiểu tọa độ cuối cùng như trong ví
dụ 2
4 Viết một bản sao màn hình biểu diễn bản đồ đã được khám phá và kiểu tọa độ cuối
cùng trong một tệp kết quả ra định dạng ASCII
Yêu cầu kỹ thuật
Yêu cầu 1: Lưu chương trình kết quả vào một tệp văn bản ASCII đặt tên là
"C:\IOI\DAY-1\411-PROG.xxx" Phần mở rộng xxx là:
- BAS với chương trình BASIC, C với chương trình C,
- LCN với chương trình LOGO, PAS với chương trình PASCAL
Yêu cầu 2: Tên tệp dữ liệu vào theo định dạng ASCII chứa bản đồ chưa dược khám phá
được lưu ở "C:\IOI\DAY-1\411-MAP.IN"
Yêu cầu 3: Tên tệp kết quả ra theo định dạng ASCII chứa bản đồ đã được khám phá và
các thống kê được lưu ở "C:\IOI\DAY-1\411-MAP.OU"
Ví dụ
Trang 19Ví dụ 1: Màn hình hiển thị một bản đồ chưa được khám phá và kiểu tọa độ ban đầu:
biểu diễn bằng các ô vuông)
Một Đường đi là một chuỗi các ô vuông liền nhau (nằm giữa hai bức tường), Đường đi bắt đầu bằng Lối vào và kết thúc tại một Điểm cuối Chiều dài của Đường đi là số ô
vuông nằm trong nó gồm cả điểm đầu và điểm cuối
Mê cung gồm các con đường phân nhánh nhưng không nối với nhau do đó hai con đường
bất kỳ không có cùng điểm cuối Lối vào nằm ở một nơi nào đó ở đỉnh mê cung Vật quý nằm ở Điểm cuối Đường đi có độ dài lớn nhất
Trang 20Vùng kích thước N x M chứa số Đường đi tối đa có thể Vì thuật toán thực hiện rất nhanh nên cần có Thời gian chờ sau mỗi lần qua một ô vuông
Yêu cầu: Viết bộ công cụ thực hiện các công việc với mê cung Các công cụ có thể thực
hiện theo thứ tự khác nhau:
Công cụ 1: Thiết lập các tham số chính N và M của mê cung
Công cụ 2: Thiết lập Thời gian chờ
Công cụ 3: Tạo ngẫu nhiên một mê cung mới và hiển thị trên màn hình khi đang được tạo
ra
Công cụ 4: Lưu mê cung được tạo ra và đường dẫn kích thước vào một tệp văn bản
ASCII như trong hình 2
Công cụ 5: Đọc một mê cung chưa biết đến từ tệp văn bản ASCII và nhấn mạnh đường dẫn từ Lối vào đến Vật quý
Yêu cầu kỹ thuật
Yêu cầu 1: Biểu diễn mỗi ô vuông bằng một chuỗi hai ký tự:
- Bức tường bằng 2 lần chuỗi ký tự ASCII #219 "[["
- Đường đi và Lối đi bằng hai ký tự trống " "
- BAS với chương trình BASIC, C với chương trình C,
- LCN với chương trình LOGO, PAS với chương trình PASCAL
Yêu cầu 4: Tên tệp văn bản ASCII để đọc và lưu các mê cung là
Trang 21Biển được biểu diễn bằng một lưới kích thước N x N Mỗi hòn đảo là một dấu "*" trên lưới Hãy xây dựng một bản đồ đảo từ các thông tin đã được mã hóa mô tả sự phân bố đảo theo hàng ngang và hàng dọc Để minh họa, hãy xét ví dụ dưới:
Các số ở bên phải mỗi hàng chỉ thứ tự và kích thước của nhóm đảo trên hàng đó Ví dụ,
"1 2" ở hàng 1 nghĩa là trên hàng đó có một nhóm gồm một hòn đảo và một nhóm gồm hai hòn đảo Tương tự, chuỗi số ở bên dưới "1 1 1" ở cột 1 nghĩa là có ba nhóm với mỗi nhóm có một hòn đảo
Yêu cầu: Viết chương trình đọc tệp dữ liệu vào gồm nhiều khối dữ liệu thực hiện lặp lại
các bước dưới đây:
1 Đọc các khối dữ liệu liên tiếp từ tệp dữ liệu vào theo ASCII (với cấu trúc như trong ví
dụ dưới) và hiển thị lên màn hình Mỗi khối dữ liệu chứa kích thước lưới ô vuông, sau đó đến các ràng buộc hàng và ràng buộc cột Mỗi ràng buộc với một hàng hoặc một cột nằm trên một dòng riêng dưới dạng các chuỗi số được ngăn cách bằng ký tự trống và kết thúc bằng số 0
2 Xây dựng lại bản đồ và hiển thị chúng lên màn hình
3 Lưu các bản đồ vào cuối một tệp kết quả kiểu ASCII Mỗi chỗ trống được biểu diễn bằng hai ký tự trống Mỗi hòn đảo được biểu diễn bằng một dấu '*' sau đó đến một ký tự trống Các bản đồ khác nhau thỏa mãn cùng điều kiện được ngăn cách bằng một dòng trống Nếu không có bản đồ nào thảo mãn điều kiện, hãy in ra dòng "No map" Lời giải cho mỗi khối dữ liệu khác nhau được ngăn cách bằng một dòng "next problem"
Yêu cầu kỹ thuật
Yêu cầu 1: 1 < N < 8
Yêu cầu 2: Lưu lời giải vào tệp văn bản ASCII tên là
"C:\IOI\DAY-1\413-PROG.xxx" Phần mở rộng xxx là:
- BAS với chương trình BASIC, C với chương trình C,
- LCN với chương trình LOGO, PAS với chương trình PASCAL
Yêu cầu 3: Tệp văn bản ASCII chứa các thông tin mã hóa được lưu trong
Trang 221 1 1 0 < Bắt đầu cột đầu tiên của ràng buộc
1 Chu trình Hamilton của Robot
Trên máy bay có tất cả N vị trí P1, P2, , PN với tọa độ nguyên (X1,Y1), (X2,Y2), , (XN,YN)
Một robot sẽ di chuyển qua tất cả các vị trí bắt đầu từ điểm P1 Nó chỉ qua mỗi vị trí một lần trừ vị trí P1, đây cũng là điểm kết thúc của chuyến đi
Di chuyển của robot tuân theo một số ràng buộc sau Nó chỉ có thể di chuyển theo đường thẳng Từ điểm P1 nó có thể di chuyển theo bất kỳ hướng nào Đến một trong các điểm
Pi, trước khi đến điểm khác, robot phải quay sang phải hoặc trái một góc 90 độ
Một chương trình cho robot mô tả gồm 5 trạng thái sau:
1 "ORIENTATION Xk Yk": được dùng cho trạng thái đầu tiên Robot quay sang hướng đến vị trí Pk (k nằm giữa 2 và N)
2 "MOVE-TO Xj Yj": nếu robot có thể đến điểm Pj mà không cần thay đổi hướng đi hiện tại, thì nó sẽ đi đến vị trí Pj (j nằm giữa 1 và N) Nếu không trạng thái này không thực hiện được
3 "TURN-LEFT": robot chuyển hướng đi sang trái một góc 90 độ
Trang 234 "TURN-RIGHT": robot chuyển hướng đi sang phải một góc 90 độ
5 "STOP": cho robot dừng lại Đây là lệnh cuối cùng phải có trong một chương trình hoạt động cho robot
Yêu cầu: Hãy viết chương trình thực hiện các nhiệm vụ sau:
1 Đọc giá trị của N và tọa độ của N vị trí cho trước từ một tệp ASCII (xem ví dụ) và hiển thị dữ liệu lên màn hình
2 Phát triển chương trình điều khiển robot thực hiện một chuyến đi qua tất cả các vị trí nếu có tồn tại
3 Nếu không tồn tại chuyến đi đó, chương trình robot phải chứa lệnh "STOP"
4 Nếu có tồn tại chuyến đi qua được tất cả các vị trí, hãy hiển thị lên màn hình chiều dài
lộ trình đi (làm tròn đến 2 chữ số sau dấu thập phân) Chiều dài lộ trình đi là tổng chiều dài của các đường thẳng robot đi qua
5 Viết chương trình điều khiển robot vào một tệp kết quả theo bảng mã ASCII như trong
ví dụ dưới
Yêu cầu kỹ thuật
Yêu cầu 1: Lưu chương trình kết quả vào một tệp văn bản ASCII với tên:
"C:\IOI\DAY-2\421-PROG.xxx" Phần mở rộng xxx là:
- BAS với chương trình BASIC, C với chương trình C,
- LCN với chương trình LOGO, PAS với chương trình PASCAL
Yêu cầu 2: Tên tệp input là "C:\IOI\DAY-2\421-ROBO.IN"
Yêu cầu 3: Tên tệp output là "C:\IOI\DAY-2\421-ROBO.OU"
Yêu cầu 4: Chương trình loại bỏ các giá trị input N nhỏ hơn 4 hoặc lớn hơn 16
2 Câu lạc bộ leo núi
Một câu lạc bộ leo núi có P thành viên được đánh số từ 1 đến P Tất cả các thành viên đều leo núi với cùng vận tốc; vận tốc leo và vận tốc leo xuống là như nhau Vận động
Trang 24viên leo núi i mỗi ngày dùng hết C(i) đơn vị đồ dùng và anh ta có thể mang theo toàn bộ
số đồ dùng S(i) được cấp đó C(i) và S(i) đều là số nguyên
Giả sử một người leo núi với số đồ dùng được cấp đủ mất N ngày để lên đến đỉnh núi Đỉnh núi có thể quá cao khiến người leo núi không thể mang theo tất cả đồ dùng lên đến đỉnh Do đó, một nhóm người leo núi cùng xuất phát ở một chỗ tại cùng một thời điểm Một người leo núi xuống sức trước khi lên đến đỉnh sẽ chuyển toàn bộ số đồ dùng mang theo cho người khác Nhóm leo núi không nghỉ trong suốt chuyến đi
Bài toán yêu cầu lập kế hoạch giúp câu lạc bộ leo núi Ít nhất một người leo núi phải lên đến dỉnh núi và tất cả những người còn lại sẽ trở lại điểm khởi hành
Yêu cầu
Hãy viết chương tình thực hiện các nhiệm vụ sau:
1 Nhập từ bàn phím số nguyên N chỉ số ngày cần thiết để lên đến đỉnh núi, số người leo núi P của câu lạc bộ, số đồ dùng được cấp S(i) và số đồ dùng cần thiết C(i) của người thứ
i (i nằm từ 1 đến P) Giả sử dữ liệu vào đều là số nguyên
2 Lập kế hoạch cho câu lạc bộ leo núi Xác định các nhóm leo núi a(1), , a(k) và số đồ dùng được cấp M(j) mà người leo núi (j) mang theo lúc khởi hành (j nằm từ 1 đến k) Chú ý, có thể không tồn tại một kế hoạch cho cho sự kết hợp N, S(i) và C(i)
3 Báo cáo các thông tin sau ra màn hình:
a) số người leo núi thực tế k tham gia leo núi,
b) tổng số đồ dùng cần được cấp,
c) số người leo núi a(1), , a(k),
d) với mọi a(j), j nằm giữa 1 và k, tổng số đồ dùng được cấp M(j) được người a(j) mang theo
e) ngày D(j) khi số người leo núi a(j) xuống sức
4 Kế hoạch là tối ưu nếu
a) số người tham leo núi là tối thiểu và
b) trong số tất cả các nhóm thỏa mãn điều kiện a), tổng số đồ dùng dùng hết là ít nhất Hãy cố tìm kế hoạch gần tối ưu
Yêu cầu kỹ thuật
Yêu cầu 1: Lưu chương trình lập kế hoạch vào tệp văn bản ASCII với tên gọi
"C:\IOI\DAY-2\422-PROG.xxx" Phần mở rộng xxx là:
- BAS với chương trình BASIC, C với chương trình C,
- LCN với chương trình LOGO, PAS với chương trình PASCAL
Yêu cầu 2: Chương trình loại bỏ dữ liệu vào với N nhỏ hơn 1 hoặc lớn hơn 100
P phải lớn hơn 1 và nhỏ hơn 20
Ví dụ
Có thể so sánh với chương trình của bạn:
Số ngày cần để lên đến đỉnh: 4
Số thành viên câu lạc bộ: 5
Số đồ dùng tối đa cấp cho người leo núi 1 : 7
Mức tiêu thụ hàng ngày của người leo núi 1 : 1
Số đồ dùng tối đa cấp cho người leo núi 2 : 8
Mức tiêu thụ hàng ngày của người leo núi 2 : 2
Số đồ dùng tối đa cấp cho người leo núi 3 : 12
Mức tiêu thụ hàng ngày của người leo núi 3 : 2
Số đồ dùng tối đa cấp cho người leo núi 4 : 15
Trang 25Mức tiêu thụ hàng ngày của người leo núi 4 : 3
Số đồ dùng tối đa cấp cho người leo núi 5 : 7
Mức tiêu thụ hàng ngày của người leo núi 5 : 1
Cần 2 người leo núi, tổng số đồ dùng cần cung cấp là 10
Người leo núi 1 và 5 sẽ leo tiếp
Người leo núi 1 mang theo 7 đơn vị đồ dùng mất xuống sau 4 ngày
Người leo núi 5 mang theo 3 đơn vị đồ dùng mất xuống sau 1 ngày
Có lập kế hoạch tiếp không (Y/N) Y
Số ngày cần lên đến đỉnh: 2
Số thành viên trong câu lạc bộ: 1
Số đồ dùng tối đa cấp cho người leo núi 1: 3
Mức tiêu thụ hàng ngày của người leo núi 1: 1
Không có ai leo núi
Có lập kế hoạch tiếp không (Y/N) Y
Good bye
3 Quay Rubik
Hình lập phương Rubik gồm 3 x 3 x 3 hình lập phương nhỏ hơn Ban đầu, mỗi trong số 6 mặt của hình lập phương Rubik được sơn một màu khác nhau Tất cả các mặt của hình lập phương Rubik gồm 3 x 3 mặt của lớp 9 hình lập phương nhỏ hơn
Hãy tưởng tượng, bạn đang nhìn vào một trong 6 mặt của hình lập phương Rubik Lớp gồm 3 x 3 hình lập phương nhỏ hơn bạn nhìn thấy có thể quay một góc là bội số của 90
độ, trong đó trục quay là đường trực giao của mặt đó và đi qua tâm của nó Kết quả là một mặt khác gồm 3 x 3 x 3 hình lập phương nhỏ với sơ đồ màu bị quay và màu trên bốn mặt xung quanh thay đổi
Trong bài toán này, các mặt hình lập phương được đặt tên thay vì sơn màu: U = Lên, R = Phải, F = Trước, B = Sau, L = Trái và D = Dưới Bất kỳ một chuỗi hành động quay mặt lập phương nào đều có thể biểu diễn bằng một chuỗi ký tự {U, R, F, B, L, D} trong đó mỗi ký tự thay thế một lần quay góc 90 độ theo chiều kim đồng hồ của một mặt tương ứng
Yêu cầu
Hãy viết chương trình cho phép người sử dụng giải lặp lại một trong ba bài toán nhỏ đưa
ra theo thứ tự bất k ỳ Bạn có thể giả sử độ dài của mỗi chuỗi nhập vào không quá 35 ký
tự
1 Bài toán nhỏ này là bản dịch từ của một chuỗi hành động quay cho trước sang một chuỗi hành động quay mà không một hành động quay nào được lặp lại quá 3 lần trong chuỗi Thuật toán phải loại bỏ những chuỗi dữ liệu vào không đúng
Ví dụ minh họa:
Trang 262 Bài toán nhỏ thứ hai yêu cầu tìm xem hai chuỗi hành động quay cho trước có cho cùng kết quả khi áp dụng vào cùng một hình lập phương Rubik không?
Yêu cầu kỹ thuật
Lưu lời giải vào một tệp văn bản ASCII có tên "C:\IOI\DAY-2\423-PROG.xxx" Phần
mở rộng xxx là:
- BAS với chương trình BASIC, C với chương trình C,
- LCN với chương trình LOGO, PAS với chương trình PASCAL
Trang 27
Đây là cuộc thi Olympiad Quốc tế
môn Tin học lần thứ năm
Đề thi ngày thứ nhất
Bài toán 1- Chuỗi hạt (The necklace of beads)
Bạn có một chuỗi hạt gồm n hạt (n <100), một số hạt màu đỏ, một số hạt màu xanh và các hạt còn lại màu trắng nằm ngẫu nhiên trong chuỗi Xét ví dụ với n = 29:
Hình a Hình b
o - hạt màu đỏ
x - hạt màu xanh @ - hạt màu trắng
Hình a có thể biểu diễn bằng một chuỗi các ký tự b và r trong đó b là hạt màu xanh và r là hạt màu đỏ như sau: brbrrrbbbrrrrrbrrbbrbbbbrrrrb
Giả sử bạn tháo chuỗi hạt duỗi thẳng nó ra, bạn nhặt các hạt cùng màu từ một đầu chuỗi hạt đến khi gặp hạt khác màu và làm như vậy từ đầu còn lại của chuỗi (có thể không cùng màu với hạt thu thập trước đó) Xác định chỗ chuỗi hạt bị ngắt ra để tất cả các hạt đều được thu lại
Hãy viết chương trình thực hiện yêu cầu sau:
1 Đọc các bộ dữ liệu về chuỗi hạt từ tệp NECKLACE.DAT định dạng ASCII Lưu dữ liệu ra vào tệp NECKLACE.SOL cũng định dạng ASCII Ví dụ, tệp input:
NECKLACE.DAT
Trang 28Bài toán 2 - Cổ phiếu của các Công ty (The companies's shares)
Một số công ty chỉ sở hữu một phần tài sản của chính nó vì họ chỉ nắm giữ một phần cổ phiếu của công ty mình Ví dụ, hãng Ford sở hữu 12% cổ phiếu của Mazda Ta nói rằng công ty A kiểm soát công ty B nếu thoả mãn ít nhất một trong các điều kiện sau:
a) A = B
b) A sở hữu hơn 50% cổ phiếu của B
c) A kiểm soát k (k > 1) công ty C(1), , C(k), thì:
C(i) sở hữu x(i)% cổ phiếu của B với 1 < i < k và x(1) + + x(k) > 50
Bài toán đặt ra là: Cho trước các bộ ba (i,j,p) hàm ý công ty i sở hữu p% cổ phiếu của
công ty j, xác định các cặp số (h,s) sao cho công ty h kiểm soát được công ty s Số công
ty tối đa là 100
Hãy viết chương trình để:
1 Đọc từ tệp input COMPANY.DAT theo định dạng ASCII danh sách các bộ dữ liệu ba
số (i,j,p) trong đó i, j và p là các số nguyên dương Giữa các bộ dữ liệu có một dòng trống
Ví dụ:
Trang 29Bài toán 3 Các hình chữ nhật với các màu khác nhau (Rectangles of different
colours)
Có N hình chữ nhật màu sắc khác nhau được đặt chồng lên một tờ giấy trắng Kích thước
tờ giấy trắng là: rộng a cm và dài b cm Các hình chữ nhật được xếp sao cho các cạnh của chúng song song với các cạnh tờ giấy Tất cả các hình chữ nhật đều nằm trong tờ giấy Kết quả là, ta sẽ nhìn thấy những hình nhiều màu khác nhau Hai vùng cùng màu được coi là một phần của cùng một hình nếu chúng có ít nhất 1 điểm chung; ngược lại chúng sẽ
bị coi là hai hình khác nhau
Bài toán yêu cầu tính những vùng màu khác nhau trong mỗi hình a, b là các số nguyên dương chẵn nhỏ hơn 30
Thứ tự các dòng dữ liệu tương ứng với thứ tự xếp các hình chữ nhật vào tờ giấy Giữa các
bộ dữ liệu khác nhau có một dòng trống
Hãy viết chương trình thực hiện:
1 Đọc bộ dữ liệu tiếp theo từ tệp RECTANG.DAT
2 Tính diễn tích mỗi vùng màu khác nhau trên tờ giấy
Trang 303 Lưu vào tệp RECTANG.SOL theo định dạng ASCII màu sắc và diện tích các vùng màu như trong ví dụ dưới Các dòng kết quả được lưu theo thứ tự tăng dần của các màu sắc Kết quả xử ký mỗi bộ dữ liệu khác nhau được ngăn cách bằng một dòng trống
Không thành phố nào được đến thăm hơn một lần trừ thành phố khởi hành phải đến hai lần (lúc khởi hành và lúc kết thúc chuyến đi) Bạn không được dùng máy bay của hãng hàng không khác và không được đi phương tiện khác
Cho trước một danh sách các thành phố có đường bay của hãng và một danh sách các chuyến bay trực tiếp giữa hai thành phố, hãy tìm hành trình có thể đến thăm càng nhiều thành phố càng tốt và thỏa mãn các điều kiện bắt đầu từ thành phố đầu tiên, đến thăm được thành phố cuối cùng và trở lại thành phố đầu tiên
Input chứa nhiều bộ dữ liệu là một tệp C:\IOI\ITIN.DAT theo định dạng ASCII
Trang 31Mỗi bộ dữ liệu gồm:
• Dòng đầu tiên chứa số thành phố N có đường bay của hãng và số đường bay trực tiếp V
N là một số nguyên dương nhỏ hơn 100 V là một số nguyên dương
• Trên mỗi dòng trong trong số N dòng tiếp theo chứa tên 1 thành phố có đường bay của hãng Tên thành phố được xếp theo thứ tự từ Tây sang Đông nghĩa là thành phố thứ i nằm
ở phía Tây thành phố thứ j nếu và chỉ nếu i < j (không có hai thành phố nào có cùng kinh tuyến) Tên mỗi thành phố là một chuỗi chứa tối đa 15 ký tự số và ký tự Latin khác, ví dụ: AGR34 hoặc BEL4 (trong tên thành phố không có ký tự trống)
• Trên mỗi dòng trong số V dòng tiếp theo chứa tên hai thành phố được ngăn cách bằng một ký tự trống trong danh sách tên thành phố Cặp thành phố (city1 city2) nghĩa là có một chuyến bay trực tiếp từ thành phố city1 đến city2 và một chuyến bay trực tiếp ngược lại
Kết quả xử lý bộ dữ liệu trên:
Trang 32A millionaire called the gardener to design his garden so that:
* each of the N beautiful fountains of his garden, numbered from 1 to N, had to be a vertex of at least one of the triangles No fountain could be on the side of a triangle of which it was not a vertex
* a bee could fly in a straight line from any fountain to any other fountain flying
continuously over flowers or fountains
* two adjacent triangles (those with a common side) always had to be planted with
Trang 33m (the number of triangles drawn)
p (the number of colours used)
r1 s1 t1 C1 (r1,s1,t1 are the fountains at the vertices of triangle 1, and C1, a number between 1 and p, is the colour of triangle 1)
rm sm tm Cm (rm,sm,tm are the fountains at the vertices of triangle m and Cm, a number between 1 and p, is the colour of triangle m)
The input may be assumed correct, no checking is necessary
The solutions to different data sets must be separated by an empty record
The following example is stored in file C:\IOI\GARDEN.DAT
Trang 34Imagine you are at a social get-together with at most 500 guests The host invites you all
to have dinner There are several tables in the dining-room The way the guests sit down
at the tables is the following: each one sitting not alone at a certain table must know at least one person sitting at the same table and no one else sitting at other tables
It is supposed that if a person knows a second person, the second one knows the first person too
No one introduces himself to the other persons sitting in the same table That means that
if two persons are sitting at the same table, but initially they do not know each other, they
do not know each other afterwards either
a) Determine how many tables are necessary and the persons sitting at each table
At each table there is only one person who will talk to the waiter, he is called the leader
of the table Each person relays his wishes concerning the menu to the persons he knows The time allotted to each person to relay his wishes to each person he knows is supposed
to be the same for each person
b) Find the most suitable person as leader of each table in order to receive information from all the persons sitting at the same table in the shortest possible period of time; produce at output the leader of each table
Afterwards, the host wishes to unify the tables For this purpose, he calls some friends Each of them, when coming, is introduced to the leaders of two tables, links the tables, sits down at the new formed table and becomes the leader of this table
c) What is the order of linking the tables in this way, so that at last all tables are unified into a single one and the conditions of point b) are satisfied? Specify the minimum necessary period of time for the leader to get information from all the other persons After the complete linking, the friends of the host are leaving and the tables get their initial structure until the end of the dinner
When dinner is over, the persons start leaving the tables
d) Determine, for each table, the minimum number of persons and the order in which they are leaving the table, until the persons who are still at the table do not know each other
Different data sets will be separated by an empty record (that is, a line containing only the end of line character) There will be no empty record after the last data set
The following example is stored in file C:\IOI\MEETING.DAT
8
1 2
1 3
2 4
Trang 35Persons leaving table 1: 2 3
Persons leaving table 2: 6
Persons leaving table 3:
Persons leaving table 1: 1 2
Persons leaving table 2: 5 6
Put your program solution into an ASCII file named C:\IOI\DDD.xxx Extension xxx is BAS for Qbasic, LCN for LOGO, C for C, PAS for PASCAL
Trang 36The 6th International Olympiad in Informatics Held in Haninge, Sweden
* Tại mỗi bước đi, lộ trình có thể đi xuống phía bên trái hoặc xuống phía bên phải
* Số hàng trong tam giác lớn hơn 1 và nhỏ hơn hoặc bằng 100
* Các số nằm trong tam giác đều là số nguyên trong đoạn từ 0 đến 99
Trong ví dụ trên, lộ trình đi qua các điểm 7,3,8,7,5 có tổng các số là lớn nhất bằng 30
Trang 37Hình 1 là bản đồ một lâu đài Hãy viết chương trình tính:
1) Số phòng trong lâu đài
2) Kích thước của căn phòng lớn nhất
3) Bỏ đi bức tường nào (ngăn cách hai phòng) để được căn phòng lớn nhất có thể
* Lâu đài luôn có ít nhất hai phòng
Trang 382) Diện tích căn phòng lớn nhất tính theo số ô vuông
3) Gợi ý bỏ bức tường nào để nối hai căn phòng liền nhau thành căn phòng lớn nhất có thể (gợi ý gồm: đầu tiên là hàng và cột của ô vuông nằm đằng sau bức tường và sau đó là hướng chỉ đến bức tường)
Có thể có nhiều gợi ý nhưng chỉ cần báo cáo một
Dòng cuối chỉ bức tường cần bỏ đi
Hình 2 (bỏ bức tường trên bức tường phía đông của ô vuông
Trang 39Hình 1 mô tả một hình vuông Trên mỗi hàng, mỗi cột và hai đường chéo đều chứa một
số nguyên tố có 5 chữ số Các hàng được đọc từ trái sang phải Các cột được dọc từ trên xuống dưới Hai đường chéo được đọc từ trái sang phải Dùng dữ liệu trong tệp
INPUT.TXT, hãy viết chương trình xây dựng các hình vuông như trên
Trang 40bị tác động gì 9 di chuyển được minh họa trong hình 2
Hình 2
Ví dụ, thứ tự các dịch chuyển dưới có ảnh hưởng đến các la bàn (chúng đều kết thúc ở 12 giờ)