| # | Bài tập | Điểm | Thời gian: | Giới hạn bộ nhớ |
|---|---|---|---|---|
| 1 | JOI 2013 - Messenger | 100 (p) | 1.0s | 256M |
| 2 | JOI 2013 - Presents | 100 (p) | 1.0s | 256M |
| 3 | JOI 2013 - Spaceships | 100 (p) | 10.0s | 256M |
A và B được chọn vào đội tuyển Nhật Bản dự thi Olympic Tin học Quốc tế. Để rèn luyện khả năng xử lý thông tin, họ chơi trò truyền tin với chủ tịch K.
A, B và K ở ba phòng riêng biệt. Mỗi phòng có điện thoại nội bộ, nhưng chỉ K được gọi điện. A và B không có cách liên lạc nào khác và chỉ được rời phòng khi K gọi. Khi bắt đầu trò chơi, K thông báo riêng cho A một số nguyên dương \(X\). Mục tiêu của A và B là khiến B xác định đúng \(X\) mà không liên lạc trực tiếp với nhau.
Trong phòng K có một bàn cờ \(4 \times 4\). Ô \((i,j)\) nằm ở hàng \(i\) từ trên xuống, cột \(j\) từ trái sang, với \(1 \le i,j \le 4\). Các ô \((1,1)\), \((1,4)\), \((4,1)\) và \((4,4)\) lần lượt là bốn góc trên trái, trên phải, dưới trái và dưới phải. Ban đầu, một quân cờ được đặt ở một ô bất kỳ. K không di chuyển quân cờ trong suốt trò chơi.
K liên tục gọi A hoặc B đến phòng mình. Mỗi lần đến, người được gọi phải di chuyển quân cờ sang một ô kề cạnh ở phía trên, dưới, trái hoặc phải, rồi trở về phòng. Riêng B, nếu đã xác định được \(X\), có thể trả lời K thay cho việc di chuyển. Nếu câu trả lời đúng, hai người thắng; nếu sai, họ thua ngay.
Thứ tự gọi được K chọn trước khi trò chơi bắt đầu, nhưng A và B không biết thứ tự đó, cũng không biết đối phương đã được gọi bao nhiêu lần giữa hai lượt của mình. Bảo đảm K không gọi cùng một người quá \(100\) lần liên tiếp. Nếu sau tổng cộng \(10\,000\) lượt gọi, người được gọi đã di chuyển xong mà B vẫn chưa trả lời, trò chơi kết thúc với kết quả sai.
Cài đặt hai chương trình mô tả chiến lược của A và B để B luôn xác định đúng \(X\) trong giới hạn lượt gọi.
Nộp tệp playerA.c hoặc playerA.cpp, định nghĩa đúng hai hàm:
void InitA(int T, int X);
int GameA(int I, int J);
InitA(T, X) được gọi đúng một lần lúc khởi tạo. T là số hiệu bài toán con; X là số nguyên dương cần truyền cho B. Hàm không trả về giá trị.GameA(I, J) được gọi mỗi khi A đến phòng K. I và J là hàng và cột hiện tại của quân cờ, với \(1 \le I,J \le 4\). Hàm phải trả về một trong bốn số nguyên -1, -2, -3, -4, biểu thị một bước di chuyển.Nộp tệp playerB.c hoặc playerB.cpp, định nghĩa đúng hai hàm:
void InitB(int T);
int GameB(int I, int J);
InitB(T) được gọi đúng một lần lúc khởi tạo. T là số hiệu bài toán con. Phía B không được cung cấp X. Hàm không trả về giá trị.GameB(I, J) được gọi mỗi khi B đến phòng K. I và J là hàng và cột hiện tại của quân cờ, với \(1 \le I,J \le 4\). Hàm phải trả về một trong bốn số -1, -2, -3, -4 để di chuyển, hoặc một số nguyên dương Y để trả lời rằng \(X=Y\).Các giá trị trả về biểu thị di chuyển có cùng ý nghĩa ở cả hai phía:
| Giá trị | Hành động |
|---|---|
-1 |
Di chuyển lên ô \((I-1,J)\). |
-2 |
Di chuyển xuống ô \((I+1,J)\). |
-3 |
Di chuyển sang trái đến ô \((I,J-1)\). |
-4 |
Di chuyển sang phải đến ô \((I,J+1)\). |
Mỗi lượt phải thực hiện đúng một bước di chuyển hợp lệ, trừ lượt B trả lời. Không được đứng yên hoặc đưa quân cờ ra ngoài bàn. Số nguyên dương do GameB trả về là đáp án gửi cho K và làm trò chơi kết thúc ngay, không phải một thông điệp gửi cho A.
Hai tệp phải dùng cùng một ngôn ngữ. Trình chấm cung cấp main và khai báo trực tiếp bốn hàm trên; không có header giao tiếp riêng phải đưa vào mã dự thi.
Khi khởi tạo, grader mẫu gọi InitA(T, X), rồi InitB(T). Sau khi hoàn thành khởi tạo, các lời gọi GameA và GameB diễn ra theo thứ tự K đã chọn. Mỗi lời gọi nhận vị trí quân cờ sau tất cả những bước di chuyển trước đó. Mỗi bên chỉ quan sát được tham số của các lời gọi dành cho mình và có thể giữ trạng thái riêng qua các lượt gọi.
Không hàm nào trong hai hàm GameA, GameB được gọi quá \(100\) lần liên tiếp. Tổng số lời gọi hai hàm không vượt quá \(10\,000\). B phải trả về đáp án dương trong một lời gọi GameB nằm trong giới hạn đó; trả lời ở lượt thứ \(10\,000\) vẫn hợp lệ.
Hai tệp được liên kết cùng trình chấm thành một tệp thực thi, nhưng khi chấm bài, phía A và phía B chạy trong hai tiến trình riêng biệt. Hai phía không chia sẻ biến toàn cục hay bộ nhớ. Bạn được viết các hàm phụ và biến toàn cục, nhưng mọi hàm phụ và biến toàn cục nội bộ trong mỗi tệp phải được khai báo static để tránh xung đột khi liên kết. Bốn hàm giao diện phải giữ nguyên khả năng được trình chấm gọi.
Mã dự thi không được tương tác với đầu vào chuẩn, đầu ra chuẩn hoặc bất kỳ tệp nào bằng bất kỳ cách nào. Kênh truyền thông tin duy nhất giữa hai phía là vị trí quân cờ được quan sát và thay đổi qua những lời gọi nói trên; không có hàm gửi chuỗi, gửi bit hoặc gọi trực tiếp sang phía còn lại.
Dữ liệu dành cho mã dự thi được truyền qua InitA, InitB, GameA và GameB. Chỉ A được nhận \(X\); thứ tự gọi đầy đủ được giữ trong trình chấm.
Để thử chương trình, grader mẫu đọc đầu vào chuẩn theo định dạng:
A và B. Ký tự thứ \(k\) cho biết lời gọi thứ \(k\) sau khi khởi tạo là GameA hay GameB.Chuỗi gọi thỏa mãn giới hạn không có quá \(100\) ký tự giống nhau liên tiếp và các điều kiện của bài toán con tương ứng. Grader mẫu đọc dữ liệu, đóng luồng đầu vào, khởi tạo hai phía rồi lần lượt thực hiện các lời gọi. Nó dừng ngay khi có đáp án hoặc hành động không hợp lệ.
Mã dự thi thực hiện hành động bằng giá trị trả về từ GameA hoặc GameB; B báo đáp án bằng giá trị nguyên dương trả về từ GameB.
Grader mẫu ghi một dòng ra đầu ra chuẩn:
| Kết quả | Dòng được in |
|---|---|
| B trả lời đúng | Accepted |
GameA trả về giá trị khác -1, -2, -3, -4 |
Wrong Answer [1] |
| A di chuyển quân cờ ra ngoài bàn | Wrong Answer [2] |
GameB trả về giá trị không thuộc bốn lệnh di chuyển và cũng không phải số nguyên dương |
Wrong Answer [3] |
| B di chuyển quân cờ ra ngoài bàn | Wrong Answer [4] |
| B trả về số nguyên dương \(Y \ne X\) | Wrong Answer [5] : X = 2, Y = 3 nếu \(X=2,Y=3\); hai giá trị được thay bằng số thực tế. |
| Đã thực hiện hết \(10\,000\) lượt mà B chưa trả lời | Wrong Answer [6] |
Grader mẫu kết thúc với mã thoát \(0\) khi chấp nhận, hoặc mã thoát bằng số lỗi khi chấm sai.
Biên dịch bằng một trong hai lệnh:
gcc -O2 -lm grader.c playerA.c playerB.c -o grader
g++ -O2 -lm grader.cpp playerA.cpp playerB.cpp -o grader
Chạy ./grader, cung cấp dữ liệu cho grader qua đầu vào chuẩn và nhận kết quả của grader qua đầu ra chuẩn. Grader mẫu chạy trong một tiến trình để thử các lời gọi. Khi chấm chính thức, hai phía chạy cách ly trong hai tiến trình như đã mô tả; chiến lược phải tuân thủ sự cách ly này cả khi thử bằng grader mẫu.
GameA và GameB cộng lại.Mỗi nhóm kiểm thử gồm một hoặc nhiều bộ dữ liệu. Chỉ nhận được điểm của một nhóm khi hai chương trình trả lời đúng tất cả bộ dữ liệu trong nhóm, tuân thủ giao diện, cách ly, giới hạn lượt gọi, thời gian và bộ nhớ.
GameA, lượt chẵn gọi GameB.Xét một trò chơi có dòng đầu của dữ liệu dành cho grader là 2 6 1 1. Phần đầu của chuỗi quy định thứ tự gọi là:
ABBAABAAABBBBBABBAABBBABBBBAAAAABABAABAABBBBABAAAA
Bảng sau mô tả quá trình tương tác kết thúc ở lượt chơi thứ \(6\), trước khi cần dùng các ký tự còn lại của chuỗi dài \(10\,000\) ký tự:
| Thứ tự | Lời gọi | Giá trị trả về | Kết quả |
|---|---|---|---|
| Khởi tạo A | InitA(2, 6) |
Không có | A nhận \(X=6\). |
| Khởi tạo B | InitB(2) |
Không có | B nhận số hiệu bài toán con. |
| 1 | GameA(1, 1) |
-2 |
Quân cờ đến \((2,1)\). |
| 2 | GameB(2, 1) |
-4 |
Quân cờ đến \((2,2)\). |
| 3 | GameB(2, 2) |
-2 |
Quân cờ đến \((3,2)\). |
| 4 | GameA(3, 2) |
-3 |
Quân cờ đến \((3,1)\). |
| 5 | GameA(3, 1) |
-1 |
Quân cờ đến \((2,1)\). |
| 6 | GameB(2, 1) |
6 |
B trả lời đúng; grader in Accepted và kết thúc. |
Chuỗi hành động này minh họa giao diện tương tác và không quy định chiến lược phải sử dụng.
Học viện JOI tổ chức một buổi trao đổi bánh kẹo vào dịp ngày Valentine trắng. Có \(N\) học sinh tham gia, được đánh số từ \(1\) đến \(N\). Mỗi học sinh chọn làm một trong hai loại bánh: bánh quy hoặc bánh kem, rồi tặng cho một học sinh khác. Học sinh \(i\) tặng \(B_i\) chiếc bánh mình làm cho học sinh \(A_i\).
Mỗi học sinh có sở thích riêng. Với học sinh \(i\):
Điểm vui vẻ của mỗi học sinh là tổng điểm từ tất cả bánh người đó nhận được. Một học sinh có thể nhận bánh từ nhiều người hoặc không nhận được chiếc nào. Các hệ số \(C_i,D_i\) thuộc về người nhận bánh.
Chọn loại bánh mỗi học sinh làm sao cho tổng điểm vui vẻ của cả \(N\) học sinh lớn nhất, và tính giá trị lớn nhất đó.
Đọc từ đầu vào chuẩn:
Ghi ra đầu ra chuẩn một số nguyên trên một dòng: tổng điểm vui vẻ lớn nhất của \(N\) học sinh.
Mỗi nhóm kiểm thử gồm một hoặc nhiều bộ dữ liệu. Chỉ nhận được điểm của một nhóm khi chương trình trả lời đúng tất cả bộ dữ liệu trong nhóm và đáp ứng giới hạn thời gian, bộ nhớ.
Ví dụ 1
7
3 3 6 5
7 2 8 8
4 5 3 9
1 8 7 2
1 8 8 4
3 7 4 5
2 5 1 2
257
Cho các học sinh \(1,2,5,6\) làm bánh quy và các học sinh \(3,4,7\) làm bánh kem. Khi đó:
Tổng điểm vui vẻ là \(257\).
Trong một thiên hà xa xôi có \(N\) hành tinh được đánh số từ \(1\) đến \(N\). Mỗi hành tinh quản lý một tàu vũ trụ. Mỗi tàu hoặc đang ngừng hoạt động, hoặc đang phục vụ một tuyến đến một hành tinh khác.
Nếu tàu do hành tinh \(a\) quản lý phục vụ tuyến đến hành tinh \(b\), tàu sẽ liên tục đi qua lại giữa hai hành tinh. Tuy nhiên, hành khách thông thường chỉ được đi từ \(a\) đến \(b\); chuyến trở về từ \(b\) đến \(a\) không chở hành khách. Khi ngừng hoạt động, tàu đỗ tại hành tinh quản lý nó.
Ban đầu, tất cả các tàu đều ngừng hoạt động. Lịch thay đổi trạng thái tàu đã được xác định, với hai loại thay đổi:
Hai người đang lên kế hoạch du lịch muốn trả lời các câu hỏi tại những thời điểm trong lịch trình. Nếu một người ở hành tinh \(a\), người kia ở hành tinh \(b\), liệu họ có thể gặp nhau bằng cách sử dụng các tuyến dành cho hành khách hay không? Nếu có, họ nên gặp nhau ở hành tinh nào để tổng số lượt đi tàu của cả hai nhỏ nhất?
Cụ thể, cần tìm một hành tinh \(c\) mà cả hai đều có thể đến từ vị trí của mình, sao cho tổng số lượt đi tàu từ \(a\) đến \(c\) và từ \(b\) đến \(c\) nhỏ nhất. Một người có thể ở nguyên hành tinh đang đứng và sử dụng \(0\) lượt đi tàu. Mỗi câu hỏi xét các tuyến đang hoạt động tại thời điểm đó.
Cho các thay đổi trạng thái và các câu hỏi theo thứ tự thời gian, hãy trả lời tất cả câu hỏi.
Đọc từ đầu vào chuẩn:
Các dạng sự kiện:
1 Ai Bi: Cho tàu của hành tinh \(A_i\) bắt đầu phục vụ tuyến đến hành tinh \(B_i\). Bảo đảm \(1 \le A_i,B_i \le N\), \(A_i \ne B_i\), tàu của \(A_i\) hiện đang ngừng hoạt động, và hành khách hiện chưa thể đi từ \(B_i\) đến \(A_i\).2 Ai: Cho tàu của hành tinh \(A_i\) ngừng hoạt động. Bảo đảm \(1 \le A_i \le N\) và tàu này hiện đang hoạt động.3 Ai Bi: Hỏi nơi gặp nhau tối ưu của hai người hiện ở \(A_i\) và \(B_i\). Bảo đảm \(1 \le A_i,B_i \le N\) và \(A_i \ne B_i\).Gọi \(T_i\) là số đầu tiên trên dòng mô tả sự kiện thứ \(i\).
Với mỗi câu hỏi, theo thứ tự xuất hiện, ghi ra đầu ra chuẩn một dòng:
-1.Mỗi nhóm kiểm thử gồm một hoặc nhiều bộ dữ liệu. Chỉ nhận được điểm của một nhóm khi chương trình trả lời đúng tất cả bộ dữ liệu trong nhóm và đáp ứng giới hạn thời gian, bộ nhớ.
Ví dụ 1
6 5
1 2 4
3 2 6
1 4 3
1 6 4
3 2 6
-1
4
Đầu tiên, tuyến \(2 \to 4\) bắt đầu hoạt động. Hai người ở \(2\) và \(6\) chưa thể gặp nhau, nên câu trả lời đầu tiên là \(-1\).
Sau đó, các tuyến \(4 \to 3\) và \(6 \to 4\) bắt đầu hoạt động. Hai người ở \(2\) và \(6\) có thể gặp nhau tại \(3\) hoặc \(4\). Gặp tại \(4\) cần tổng cộng \(2\) lượt đi tàu, ít hơn so với gặp tại \(3\), nên câu trả lời là \(4\).
Ví dụ 2
8 36
1 1 2
1 6 5
1 7 8
3 5 6
1 5 4
1 8 1
3 7 2
3 3 8
3 1 8
1 3 2
1 4 1
3 8 5
3 4 3
2 4
3 6 8
1 2 5
3 6 8
2 8
3 1 4
3 6 8
3 6 3
2 3
3 1 2
1 4 3
3 2 6
1 8 3
3 1 7
3 1 6
3 5 4
2 2
2 5
1 3 6
1 2 7
3 1 4
3 1 5
3 6 7
5
2
-1
1
1
2
-1
5
4
-1
5
2
5
3
5
4
3
5
6