APIO 2017 - Koala Game
Xem PDFKoala đã tạo ra một trò chơi mới và thách đấu bạn! Cô ấy bắt đầu bằng cách đặt xuống \(N\) vật phẩm, được đánh số từ \(0\) đến \(N-1\). Sau đó, cô bí mật gán cho mỗi vật phẩm một giá trị nguyên từ \(1\) đến \(N\) sao cho không có hai vật phẩm nào nhận cùng một giá trị. Vật phẩm \(i\) có giá trị \(P_i\). Cô thách bạn xác định một số tính chất của dãy giá trị \(P = P_0,P_1,\ldots,P_{N-1}\).
Để làm điều đó, bạn sẽ yêu cầu Koala chơi một số vòng. Trong mỗi vòng, bạn có \(W\) viên đá xanh lam và Koala có \(W\) viên đá đỏ. Bạn đi trước bằng cách đặt một số (có thể là tất cả) đá của mình cạnh những vật phẩm tùy chọn. Sau khi nhìn thấy cách sắp xếp của bạn, Koala cũng đặt một số (có thể là tất cả) đá của cô ấy cạnh các vật phẩm. Koala giành được tất cả các vật phẩm có số đá đỏ đặt cạnh nhiều hơn số đá xanh lam. Koala luôn phân phối đá sao cho tổng giá trị các vật phẩm cô giành được là lớn nhất. Nếu có nhiều cách đạt tổng giá trị lớn nhất, cô chọn cách giành được tổng số vật phẩm lớn nhất. Nếu vẫn còn nhiều cách, cô chọn một cách bất kỳ trong số đó.
Koala rất lười và sẽ ngủ quên nếu bạn yêu cầu cô chơi quá nhiều vòng. Nhiệm vụ của bạn là nhận biết các tính chất trong dãy \(P\) của Koala bằng cách chơi càng ít vòng càng tốt.
Chi tiết cài đặt
Thí sinh được khuyến nghị dùng mã mẫu của ngôn ngữ mình chọn làm điểm bắt đầu. Thí sinh phải cài đặt cả bốn hàm sau, kể cả khi chỉ làm một số subtasks; những hàm không dùng đến có thể để trống. Chương trình không được đọc từ đầu vào chuẩn, ghi ra đầu ra chuẩn hoặc tương tác với bất kỳ tệp nào.
Trong mỗi hàm, tham số N là số vật phẩm và W là số đá mà cả bạn lẫn Koala có trong mỗi vòng.
int minValue(int N, int W);
- Trả về số hiệu \(i\) của vật phẩm có giá trị nhỏ nhất, tức là \(P_i = 1\).
int maxValue(int N, int W);
- Trả về số hiệu \(i\) của vật phẩm có giá trị lớn nhất, tức là \(P_i = N\).
int greaterValue(int N, int W);
- So sánh giá trị của vật phẩm \(0\) và \(1\), rồi trả về số hiệu của vật phẩm có giá trị lớn hơn. Cụ thể, trả về \(0\) nếu \(P_0 > P_1\), ngược lại trả về \(1\).
void allValues(int N, int W, int *P);
- Xác định toàn bộ dãy và ghi vào mảng
P: với mọi \(0 \le i \le N-1\),P[i]phải chứa giá trị \(P_i\) của vật phẩm \(i\). - Hàm không trả về giá trị.
Trong mỗi testcase, trình chấm gọi chính xác một trong bốn hàm trên một hoặc nhiều lần. Mỗi lời gọi hàm được coi là một ván chơi riêng. Hàm nào được gọi và số lần tối đa hàm đó có thể được gọi phụ thuộc vào subtask. Có thể giả sử Koala đã cố định dãy \(P\) trước mỗi lời gọi hàm và dãy không thay đổi trong suốt lời gọi đó. Cô ấy có thể thay đổi dãy trước lời gọi hàm tiếp theo.
Mỗi hàm do thí sinh cài đặt có thể gọi hàm sau để lấy thông tin về dãy của Koala:
void playRound(int *B, int *R);
- Hàm này yêu cầu Koala chơi một vòng với bạn và không trả về giá trị.
- Mảng
Bmô tả số đá xanh lam bạn đặt cạnh từng vật phẩm. Với mọi \(0 \le i \le N-1\),B[i]viên đá xanh lam được đặt cạnh vật phẩm \(i\). MỗiB[i]phải là số nguyên không âm vàB[0] + B[1] + ... + B[N-1]không được vượt quá \(W\). - Trình chấm điền vào mảng
Rđể mô tả câu trả lời của Koala. Với mọi \(0 \le i \le N-1\), Koala đặtR[i]viên đá đỏ cạnh vật phẩm \(i\). - Mỗi subtask quy định một giới hạn cứng cho số lần gọi
playRoundtrong mỗi ván. Dùng ít lời gọi hơn giới hạn này có thể đem lại điểm cao hơn.
Phân nhóm
Gọi \(C_{max}\) là số lần gọi playRound lớn nhất trong tất cả các ván của một testcase, và \(C\) là số lần gọi playRound trong ván duy nhất của testcase thuộc Subtask 5.
| Subtask | Điểm tối đa | Hàm được gọi và số lần gọi | Điều kiện | Giới hạn lời gọi playRound mỗi ván |
Cách tính điểm |
|---|---|---|---|---|---|
| Sample Data | 0 | Mỗi testcase gọi đúng một trong bốn hàm đúng một lần; có tổng cộng \(5\) testcase mẫu | \(N=6\), \(P=(5,3,2,1,6,4)\) | 3200 | Không tính điểm. |
| 1 | 4 | Chỉ gọi minValue, nhiều nhất \(100\) lần mỗi testcase |
\(N=100\), \(W=100\) | 2 | 4 điểm nếu đúng. |
| 2 | 15 | Chỉ gọi maxValue, nhiều nhất \(100\) lần mỗi testcase |
\(N=100\), \(W=100\) | 13 | 15 điểm nếu \(C_{max} \le 4\); 7 điểm nếu \(5 \le C_{max} \le 13\). |
| 3 | 18 | Chỉ gọi greaterValue, nhiều nhất \(1100\) lần mỗi testcase |
\(N=100\), \(W=100\) | 14 | 18 điểm nếu \(C_{max} \le 3\); 14 điểm nếu \(C_{max}=4\); 11 điểm nếu \(C_{max}=5\); 5 điểm nếu \(6 \le C_{max} \le 14\). |
| 4 | 10 | Chỉ gọi allValues, đúng một lần mỗi testcase |
\(N=100\), \(W=200\) | 700 | 10 điểm nếu đúng. |
| 5 | 53 | Chỉ gọi allValues, đúng một lần mỗi testcase |
\(N=100\), \(W=100\) | 3200 | 53 điểm nếu \(C \le 100\); \(\lfloor 53-8\log_2(C/100)\rfloor\) điểm nếu \(101 \le C \le 3200\). Đặc biệt, nếu \(C=3200\) thì được 13 điểm. |
Trong công thức trên, \(\lfloor x\rfloor\) là số nguyên lớn nhất không vượt quá \(x\).
Trong mỗi testcase, chương trình phải luôn chạy trong giới hạn thời gian và bộ nhớ. Điều này bao gồm cả thời gian và bộ nhớ mà trình chấm sử dụng khi thiết lập, kết thúc và trả lời các lời gọi playRound. Khi ước lượng phần chi phí này, có thể giả sử trình chấm dùng để chấm có chức năng giống hệt và cách cài đặt tương tự trình chấm mẫu được cung cấp.
Nếu gọi playRound với mảng B không hợp lệ, hoặc số lời gọi playRound vượt giới hạn cứng của bất kỳ ván nào trong testcase, toàn bộ testcase bị chấm Not Correct và nhận \(0\) điểm.
Nếu một hàm không xác định đúng tính chất được yêu cầu của dãy \(P\) trong một ván bất kỳ của testcase, toàn bộ testcase bị chấm Not Correct và nhận \(0\) điểm.
Cả Subtask 4 và Subtask 5 đều yêu cầu cài đặt allValues, nhưng có giá trị \(W\) khác nhau. Có thể dùng điều này để phân biệt hai subtasks trong chương trình.
Bạn được nộp bài tối đa \(60\) lần và khoảng cách giữa hai lần nộp liên tiếp phải ít nhất \(2\) phút.
Ví dụ
Xét dãy \(P\) sau:
| \(i\) | 0 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|---|
| \(P_i\) | 5 | 3 | 2 | 1 | 6 | 4 |
Dưới đây là một số lời gọi mẫu đến playRound và một câu trả lời hợp lệ của trình chấm cho mỗi lời gọi. Có thể có nhiều hơn một câu trả lời hợp lệ cho một lời gọi playRound.
| \(W\) | Lời gọi mẫu | Câu trả lời có thể của trình chấm | Giải thích |
|---|---|---|---|
| 6 | playRound([0, 3, 0, 2, 1, 0], R) |
R = [1, 1, 1, 0, 2, 1] |
Bạn đặt lần lượt ba, hai và một viên đá xanh cạnh các vật phẩm \(1\), \(3\), \(4\), và không đặt đá cạnh các vật phẩm \(0\), \(2\), \(5\). Koala đặt một viên đá đỏ cạnh các vật phẩm \(0\), \(1\), \(2\), \(5\), hai viên cạnh vật phẩm \(4\), và không đặt viên nào cạnh vật phẩm \(3\). Cô giành được các vật phẩm \(0\), \(2\), \(4\), \(5\) với tổng giá trị \(5+2+6+4=17\), là tổng lớn nhất có thể. |
| 6 | playRound([1, 2, 3, 1, 2, 0], R) |
Lời gọi không hợp lệ; chương trình bị dừng và testcase bị chấm Not Correct, nhận \(0\) điểm | Bạn đã đặt \(1+2+3+1+2=9>6=W\) viên đá, nên lời gọi không hợp lệ. |
| 12 | playRound([1, 2, 3, 1, 2, 0], R) |
R = [2, 3, 0, 2, 3, 1] |
Bạn không cần dùng hết \(W\) viên đá xanh và Koala cũng không cần dùng hết \(W\) viên đá đỏ. |
| 6 | playRound([0, 1, 0, 0, 1, 0], R) |
R = [1, 0, 1, 1, 2, 1] |
Nếu có nhiều câu trả lời giúp Koala đạt tổng giá trị lớn nhất, cô chọn câu trả lời làm số vật phẩm giành được lớn nhất. Vì vậy R = [1, 2, 0, 0, 2, 1] không phải câu trả lời hợp lệ. |
Phản hồi cho từng hàm mà trình chấm gọi dưới đây (đúng một hàm trong mỗi testcase) được cung cấp theo thứ tự dưới dạng "Sample Data" khi nộp bài. Trong mỗi testcase này, được gọi playRound nhiều nhất \(3200\) lần.
| STT | Lời gọi của trình chấm | Giá trị trả về mong đợi | Giải thích |
|---|---|---|---|
| 1 | minValue(6, 6) |
3 | \(P_3=1\), nên vật phẩm \(3\) có giá trị nhỏ nhất. |
| 2 | maxValue(6, 6) |
4 | \(P_4=6=N\), nên vật phẩm \(4\) có giá trị lớn nhất. |
| 3 | greaterValue(6, 6) |
0 | \(P_0=5>3=P_1\), nên vật phẩm \(0\) có giá trị lớn hơn vật phẩm \(1\). |
| 4 | allValues(6, 12, P) |
Không có; P = [5, 3, 2, 1, 6, 4] |
allValues không trả về giá trị mà ghi các giá trị đúng vào mảng P. |
| 5 | allValues(6, 6, P) |
Không có; P = [5, 3, 2, 1, 6, 4] |
Giống lời gọi trước. |
Trình chấm mẫu
Trình chấm mẫu đọc dữ liệu vào theo định dạng sau:
- Dòng \(1\): hai số nguyên \(F\), \(G\).
- Các dòng từ \(2\) đến \(G+1\): mỗi dòng chứa hai số nguyên \(N\), \(W\), theo sau bởi \(N\) số nguyên \(P_0,P_1,\ldots,P_{N-1}\) mô tả một ván.
Số nguyên \(F\) xác định hàm mà trình chấm mẫu sẽ gọi:
| \(F\) | Hàm được gọi |
|---|---|
| 1 | minValue |
| 2 | maxValue |
| 3 | greaterValue |
| 4 | allValues |
Số nguyên \(G\) xác định số lần gọi hàm đã chọn. Mỗi dòng sau đó mô tả một ván với dãy của Koala.
Với mỗi lời gọi hàm, trình chấm mẫu ghi hai dòng ra đầu ra chuẩn. Dòng đầu chứa số lần gọi playRound.
- Nếu \(F=4\), dòng thứ hai chứa nội dung mà hàm
allValuesđã ghi vào mảngP. - Nếu \(F=1\), \(2\) hoặc \(3\), dòng thứ hai chứa một số nguyên duy nhất là giá trị trả về của hàm tương ứng.
Ví dụ, testcase thứ tư trong "Sample Data", gọi allValues với \(N=6\) và \(W=12\), có thể được mô tả bằng tệp đầu vào mẫu sau:
Ví dụ 1
Input
4 1
6 12 5 3 2 1 6 4
Nguồn
Đề bài chính thức của Ban tổ chức APIO 2017: Koala Game.
Kỳ thi:
- APIO 2017 (13 Tháng năm, 2017)
Bình luận