Loài iShongololo độc

Một phần của tài liệu ĐỀ THI OLYMPIC TIN HỌC QUỐC TẾ potx (Trang 77 - 89)

- .LCN với chương trình LOGO, PAS với chương trình PASCAL

Loài iShongololo độc

"iShongololo" là tên của loài động vật nhiều chân theo ngôn ngữ của người Zulu ở Nam Phị Chúng là loài động vật nhiều chân đốt màu đen, dài và bóng.

Loài iShongololo ăn tất cả những loại quả, theo bài toán, quả bị ăn được biểu diễn dưới dạng một lưới hình hộp chữ nhật có chiều dài L, rộng W và chiều cao H. Mỗi phần quả nó ăn là khối lập phương có kích thước là 1, 1, 1.

Hãy viết chương trình tìm phần quả nhiều nhất mà con iShongololo có thể ăn được mà không phá vỡ các ràng buộc cho trước. Chương trình phải báo cáo hoạt động ăn và di chuyển bên trong quả của con iShongololọ

Con iShongololo bắt đầu từ bên ngoài quả. Phần quả đầu tiên con iShongololo phải ăn là 1, 1, 1 sau đó nó đi qua phần nàỵ Nó sẽ dừng lại khi không còn phần quả nào có thể ăn được nữa và nó sẽ dừng lạị

Input:

Dữ liệu vào của chương trình gồm ba số nguyên xác định chiều dài (L), chiều rộng (W) và chiều cao (H) của khối hộp tượng trưng cho một quả.

Ba số nguyên L, W, H nằm trên các dòng khác nhaụ Ba số này phải nằm trong khoảng từ 1 đến 32.

Sample input:

Output:

Dữ liệu ra gồm nhiều dòng bắt đầu bằng "E" (nếu con côn trùng ăn) hoặc "M" (nếu con côn trùng di chuyển), tiếp đó là đến ba số nguyên chỉ tọa độ của của phần quả con côn trùng ăn hoặc đi qua theo tọa độ ba chiều L, W, H. Ví dụ dướị

Sample output (đây chưa phải là tối ưu):

1. Con iShongololo ở lọt trong một ô phần quả rỗng. 2. Con iShongololo mỗi lần chỉ ăn đúng một phần quả.

3. Con iShongololo không thể đi đến một phần quả rỗng mà nó đã đi quạ

4. Con iShongololo không thể đi đến một phần quả cứng mà nó không ăn được hoặc đi ra ngoài quả.

5. Con iShongololo chỉ có thể ăn hoặc đi tiếp đến hai phần quả có chung mặt. Nó không thể ăn phần quả có mặt tiếp giáp với một phần quả rỗng.

Đánh giá:

• Nếu con iShongololo vi phạm ràng buộc, chương trình của bạn sẽ được 0 điểm. • Tổng số điểm giành được là phần trăm nó ăn hết trong cả quả, đo đó số điểm đạt

được không vượt quá 100%.

Nhận dạng ký tự

Bài toán yêu cầu viết chương trình nhận dạng ký tự.

Cụ thể:

Một ký tự chuẩn dưới dạng ảnh gồm 20 dòng mỗi dòng chứa 20 số trong hai chữ số '0' và '1'.

File FONT.DAT chứa 27 ảnh ký tự chuẩn theo thứ tự: _abcdefghijklmnopqrstuvwxyz trong đó _ là ký tự trống.

File IMAGẸDAT chứa một hoặc nhiều ảnh ký tự có thể bị hỏng. Một ảnh ký tự bị hỏng khi:

• ít nhất một dòng bị nhân bản, • ít nhất một dòng bị mất,

• một vài số '0' bị đổi thành số '1', • một vài số '1' bị đổi thành số '0'.

• không một ảnh ký tự nào cùng có dòng bị nhân bản hoặc bị mất.

• không quá 30% các số '0' và '1' bị thay đổi trong bất kỳ ảnh ký tự nào của dữ liệu đánh giá.

Trong trường hợp có dòng nhân bản, một hoặc cả hai dòng kết quả có thể bị sửa đổi và sự sửa đổi này có thể khác nhaụ

Hãy viết chương trình nhận dạng ký tự trong ảnh ở file IMAGẸDAT dùng các phông ở tệp FONT.DAT.

Cho trước các quy ước dòng nhân bản và dòng bị loại bỏ, hãy nhận dạng một hình ảnh ký tự bằng cách chọn các hình ảnh ký tự phông cần tổng số ký tự 0 và 1 bị thay đổi ít nhất để sửa thành hình ảnh phông cho trước. Chỉ tính các sửa chữa trong các dòng bị sửa ít nhất trong trường hợp có các dòng nhân bản. Tất cả các ký tự trong ví dụ và trong hình ảnh đánh giá có thể được một chương trình phù hợp nhận biết từng ký tự một. Chỉ có duy nhất một kết quả đúng với mỗi bộ dữ liệu đánh giá.

Một kết quả đúng sẽ dùng toàn bộ dữ liệu từ tệp IMAGẸDAT.

Input:

Cả hai tệp input đều bắt đầu bằng một số nguyên N (19<N<1200) chỉ số dòng như sau: N

(digit1)(digit2)(digit3) ... (digit20) (digit1)(digit2)(digit3) ... (digit20) ...

Mỗi dòng dữ liệu có độ rộng 20 chữ số, không có các ký tự trống ngăn cách các số 0 và số 1.

Tệp FONT.DAT mô tả phông. FONT.DAT luôn chứa 541 dòng. Tệp FONT.DAT có thể khác nhau với mỗi bộ dữ liệu đánh giá khác nhaụ

Ví dụ Input:

Output:

Chương trình phải tạo ra tệp IMAGẸOUT chứa một chuỗi ký tự được nhận dạng dưới dạng văn bản ASCIỊ Output không chứa các ký tự ngăn cách. Nếu chương trình không nhận dạng được một ký tự nào, hãy in ra dấu '?' ở vị trí thích hợp.

Chú ý: định dạng dữ liệu ra ở trên không phải là dữ liệu ra chuẩn vì có các ký tự ngăn

cách.

Ví dụ Output:

Vẽ bản đồ

Bạn là trợ lý cho một người chuyên vẽ bản đồ, bạn có nhiệm vụ là điền tên cho các thành phố trên một bản đồ mớị

Bản đồ là một lưới ô vuông kích thước 1000 x 1000. Mỗi thành phố chiếm một ô vuông trên bản đồ. Tên thành phố được điền vào một hộp gồm nhiều ô vuông trên bản đồ. Mỗi hộp đó được gọi là nhãn.

Hình 1: Một thành phố với bốn hộp nhãn Vị trí hộp nhãn phải thỏa mãn điều kiện:

1. Nhãn thành phố phải nằm ở một trong bốn vị trí như trong hình 1. 2. Nhãn thành phố không được gối lên nhaụ

3. Nhãn thành phố không gối lên các thành phố. 4. Nhãn thành phố phải nằm gọn trong bản đồ.

Mỗi nhãn chứa tất cả các ký tự trong tên thành phố cùng với một ký tự trống. Chiều rộng và chiều dài ký tự tên được cho trước; ký tự trống có cùng kích thước.

Hình 2: Một phần bản đồ

Cột cận trái của bản đồ có tọa độ ngang là 0 và hàng dưới cùng có tọa độ dọc là 0. Hình 2 biểu diễn phần dưới bên trái bản đồ các thành phố Langa tọa độ (0,3), Ceres tọa độ (6,1) và Paarl tọa độ (7,3).

Chương trình phải đọc dữ liệu vị trí các thành phố trên bản đồ, tiếp sau là kích thước ký tự và tên thành phố. Chương trình phải xếp được nhiều nhất số nhãn vào bản đồ mà không phá vỡ các ràng buộc trên và báo cáo vị trí các nhãn trong dữ liệu rạ

Input:

File input bắt đầu bằng dòng chứa số nguyên (N) chỉ số thành phố trên bản đồ. Mỗi thành phố được thể hiện trên một dòng với các thông số:

• chỉ số ngang (X) của thành phố, • chỉ số dọc (Y) của thành phố,

• chiều rộng (W) của các ký tự trong tên, • chiều cao (H) của ký tự trong tên và • tên thành phố.

Tên thành phố là các từ đơn. Số thành phố không quá 1000. Tên thành phố không dài hơn 200 ký tự.

Ví dụ Input:

Output:

File output gồm N dòng. Mỗi dòng chứa tọa độ ngang và tọa độ dọc của ô vuông phía trên bên trái bản đồ thành phố. Nếu chương trình của bạn không đặt được nhãn cho bản đồ, thì chương trình phải in ra -i -ị Các dòng báo cáo ra theo thứ tự các thành phố được cho trong file input. Giữa hai chữ số bất kỳ có một ký tự trống.

Ví dụ Output:

Với mỗi bộ dữ liệu thử nghiệm:

• Số điểm được cho dựa trên số phần trăm thành phố được chương trình điền tên so với số thành phố được diền tên do ban tổ chức đưa rạ

• Số điểm thấp nhất là 0% và cao nhất là 100%.

• Nếu một tên nào đó vi phạm ràng buộc, chương trình được 0 điểm. • Nếu tên thành phố điền không đúng, chương trình cũng được 0 điểm.

Sắp xếp container

Chú ý: Bạn cần download module mô phỏng để giải bài toán nàỵ

Công ty vận tải hàng hóa Neptune quản lý một kho chứa container. Kho chứa hàng được dùng để tạm chứa container đợi giải phóng.

Cứ mỗi giờ, container được đưa đến kho chứa hàng. Chúng được lưu ở kho trong một số dương giờ. Khi một container được đưa đến kho, trong vận đơn có ghi ngày dự kiến container sẽ được giải phóng. Container đầu tiên được đưa đến kho vào thời gian 1. Thời gian tối đa một container được lưu kho không quá 5 giờ.

Trong bài toán này, thời gian (tính bằng giờ) là một số dương tăng dần nhưng không lớn hơn 150.

Một chiếc cần cẩu hoạt động trong kho hàng có nhiệm vụ đưa container ra vào kho hàng, có lúc nó còn sắp xếp lại vị trí các container trong khọ

Bài toán:

Hãy viết chương trình thực hiện việc tiếp nhận, lưu kho và giải phóng container một cách hợp lý. Một chương trình hợp lý là số lần cần cẩu phải di chuyển container là ít nhất. Kho hàng là một hình hộp chữ nhật. Chiều dài (X), chiều rộng (Y) và chiều cao (Z) của kho hàng được cho trước. Mỗi container là một khối lập phương kích thước 1 x 1 x 1. Container có thể được để chồng lên những chiếc container khác hoặc để trên sàn khọ Cần cẩu chỉ có thể di chuyển chiếc container trên cùng.

Chuyển một chiếc container từ vị trí này đến vị trí khác tức là cần cẩu đã di chuyển một lần. Cần cẩu di chuyển liên tục. Khi kho hàng hết chỗ, chương trình phải từ chối nhận tiếp container. Chương trình của bạn có thể hoạt động không hợp lý hoặc không hoạt động được nữa khi kho hàng gần đầỵ Chương trình có thể từ chối nhận tiếp container mới vào bất cứ lúc nàọ

Input:

Chương trình của bạn phải tương tác với một module mô phỏng để lấy dữ liệu và chương trình của bạn phải khai báo hoạt động và thông báo qua module đó. Kho hàng chưa có container nào khi chương trình bắt đầu chạỵ

Khi chương trình chạy, chương trình mô phỏng sẽ cung cấp số lần di chuyển hợp lý nhất với mỗi bộ dữ liệu thử nghiệm. Mỗi container được xác định bằng một số nguyên dương duy nhất. Chương trình của bạn có thể gọi các hàm sau bất cứ lúc nào:

int GetX();

function CetX: integer;

DECLARE FUNCTION GetX CDECL ()

Trả lại chiều dài cho kho hàng (số nguyên).

int GetY();

function GetY: integer;

DECLARE FUNCTION GetY CDECL ()

Trả lại chiều rộng cho kho hàng (số nguyên).

int GetZ();

function GetZ: integer;

DECLARE FUNCTION GetZ CDECL ()

Trả lại chiều cao cho kho hàng (số nguyên). X,Y,Z không lớn hơn 32.

Các hàm trên cung cấp thông tin về thứ tự các hoạt động (container đến hoặc giải phóng).

int GetNevtContainer();

function GerNexrConrainer: integer;

DECLARE FUNCTION GetNextContainer CDECL ()

Trả lại số hiệu của các container (số nguyên dương) tiếp theo container được lưu khọ Nếu không còn container nào được lưu kho, chương trình sẽ trả về số 0 để nhắc chương trình của bạn nên thoát rạ

int GetNewtAction();

function CetNextAction: integer;

Trả lại một số nguyên chỉ hành động: số 1 để lưu kho một container mới, số 2 để giải phóng một container.

int GetNextStorageTime();

function GetNextStorageTime: integer;

DECLARE FUNCTIOIN GetNextStorageTime CDECL ()

Trả lại thời gian tính bằng giờ từ khi chương trình bắt đầu chạy đến khi một container được giải phóng. Giá trị này được trả lại nhằm mục đích sắp kế hoạch cho chương trình của bạn; lệnh giải phóng hàng phải bắt đầu sau không quá 5 giờ. Hàm này chỉ trả lại giá trị có nghĩa khi hàm GetNextAction trả về 1.

Thứ tự gọi ba hàm trên không quan trọng.

Output:

Khi chương trình của bạn tìm thấy thông tin nó cần về container tiếp theo, hãy dùng các hàm dưới đây để vận hành kho hàng:

int MoveContainer(int xl, int yl, int x2, int y2);

function MoveContainer(xl, yl, xZ, y2: integer): integer;

DECLARE FUNCTION MoveContainer CDECL (BYVAL xl AS INTEGER, BYVAL yl AS INTEGER, BYVAL x2 AS INTEGER, BYVAL y2 AS INTEGER)

Di chuyển container trên đỉnh chồng container tại vị trí x1, y1 sang đỉnh chồng container tại vị trí x2, y2. Trả lại giá trị 1 nếu hoạt động thực hiện được, trả lại giá trị 0 nếu hoạt động không thực hiện được.

void RefuseContainer(); procedure RefuseContainer;

DECLARE SUB RefuseContainer CDECL ()

Từ chối tiếp nhận container tiếp theọ

void StoreArrivingContainer(int x, int y);

procedure StoreArrivingContainer(x, y: integer);

DECLARE SUB StoreArrivingContainer CDECL (BYVAL x AS INTEGER, BYVAL y AS INTEGER)

Lưu container tiếp theo trên đỉnh chồng container tại vị trí x, ỵ

void RemoveContainer(int x, int y);

procedure RemoveContainer(x, y: integer);

DECLARE SUB RemoveContainer CDECL (BYVAL x AS INTEGER, BYVAL y AS INTEGER)

Giải phóng container trên đỉnh chồng container tại vị trí x, y ra khỏi kho hàng. Nếu chương trình của bạn không thực hiện được yêu cầu, thì nó sẽ thoát rạ

Những di chuyển không thực hiện được sẽ không được module mô phỏng download về chấp nhận và do đó di chuyển cũng không được thực hiện và bạn không được điểm. Chương trình của bạn không cần báo cáo tệp output. Module mô phỏng mà chương trình của bạn tương tác khi hoạt động sẽ tự tạo ra tệp chứa các bản ghi về thông tin các hoạt động. Tệp này sẽ được dùng để cho điểm.

Sắp xếp:

Chương trình của bạn đọc lệnh với container tiếp theọ Sau đó, di chuyển các container đến chỗ lưu kho hay giải phóng.

Module mô phỏng:

Module mô phỏng này mang tên StackLib chứa các thông tin liên quan đến việc lập trình của bạn. Nếu bạn lập trình bằng ngôn ngữ C và C++ thì module này sẽ tự động kết nối với chương trình của bạn khi bạn thêm file đầu trang. Nếu bạn dùng ngôn ngữ

QuickBasic bạn phải gõ thêm lệnh QB /L STACKLIB

Đánh giá:

Chương trình sẽ được kiểm tra bằng nhiều bộ dữ liệu và với mỗi bộ dữ liệu chương trình sẽ được cho điểm theo giải pháp tối ưu nhất dựa trên các tiêu thức:

• Tổng số lần di chuyển của cần cẩụ

• Mỗi lần từ chối một container chương trình sẽ bị tính thêm 5 di chuyển.

• Mỗi container không được lưu kho hay giải phóng thì chương trình của bạn sẽ bị tính thêm 5 lần di chuyển (chương trình thoát ra trước khi quá trình hoạt động hoàn thành).

• Tổng số điểm của chương trình bạn viết sẽ được tính theo tỷ lệ so với chương trình tối ưu nhất được biết đến.

• Nếu chương trình của bạn thực hiện số lần di chuyển gấp đôi số lần cần thiết, nó sẽ được cho 0 điểm.

The 10th International Olympiad in Informatics, 1998.

1. Contact

Tiến sỹ Astro Insky làm việc ở một trung tâm thiên văn học. Gần đây, bà ta phát hiện thấy những sóng ngắn rất kỳ lạ phát ra trực tiếp từ trung tâm giải ngân hà. Liệu những sóng kỳ lạ này có mang theo những sinh vật sống thông minh từ ngoài hành tinh đến không? Hay đó chỉ là những hoạt động bình thường của tâm các hành tinh?

Bài toán

Bạn phải giúp tiến sỹ Insky tìm ra câu trả lời bằng cách cung cấp các công cụ phân tích mẫu bit dữ liệu trong các file bà ghi lại được. Tiến sỹ Insky muốn tìm các chiều dài chuỗi bit giữa A và B, chúng được lặp lại nhiều lần trong file dữ liệu mỗi ngàỵ Trong mỗi trường hợp, người ta đều thấy số lần lặp lại (N) là lớn nhất. Trong bài này, ta chỉ xét số lần lặp lại ít nhất là 1.

Input

File CONTACT.IN chứa nhiều dữ liệu dưới dạng:

• Dòng đầu tiên chứa số nguyên A chỉ chiều dài chuỗi bit tối thiểụ • Dòng thứ hai chứa số nguyên B chỉ chiều dài chuỗi bit tối đạ • Dòng thứ 3 chứa số nguyên N chỉ số lần lặp lại lại của chuỗi bit. • Dòng thứ 4 chứa một chuỗi các ký tự 0 và 1, kết thúc dòng là ký tự 2. Sample Input 2 4 10 010100100100010001111011000010100110011110000100100111100100 000002

Dữ liệu nào cho thấy 10 mẫu chiều dài bít giữa 2 và 4 xuất hiện trong bảng bit

010100100100010001111011000010100110011110000100100111100100 00000

Trong ví dụ này, mẫu bit 100 xuất hiện 12 lần, mẫu bit 1000 xuất hiện 5 lần, mẫu xuất hiện nhiều nhất là 00.

Output

File CONTACT.OUT là một báo cáo với N dòng, chỉ ra số các chuỗi bit lặp lại nhiều nhất và các mẫu bit đó. Danh sách chuỗi bit tìm được được xếp theo thứ tự lặp lại ít dần và các dòng hiển thị có dạng trong ví dụ dướị Các mẫu có số lần lặp lại bằng nhau được xếp theo thứ tự ngược lạị Nếu số các dạng chuỗi lặp nhỏ hơn N thì Output có số dòng ít hơn N.

Sample Output

Dữ liệu ra cho Dữ liệu vào ở trên 23 00 15 10 01 12 100 11 001 000 11 10 010 8 0100 7 1001 0010 6 0000 111 5 1000 110 011

Một phần của tài liệu ĐỀ THI OLYMPIC TIN HỌC QUỐC TẾ potx (Trang 77 - 89)

Tải bản đầy đủ (DOC)

(187 trang)
w