Google Code Jam 2021 - Qualification Round

Bộ đề bài

# Bài tập Điểm Thời gian: Giới hạn bộ nhớ
1 Google Code Jam 2021 - Cheating Detection 31 1.5s 1G
2 Google Code Jam 2021 - Median Sort 100 1.0s 1G
3 Google Code Jam 2021 - Moons and Umbrellas 17 1.0s 1G
4 Google Code Jam 2021 - Reversort 7 1.0s 1G
5 Google Code Jam 2021 - Reversort Engineering 18 1.0s 1G

1. Google Code Jam 2021 - Cheating Detection

Điểm: 31 Thời gian: 1.5s Bộ nhớ: 1G Input: bàn phím Output: màn hình

\(100\) người chơi tham gia một giải đố vui gồm \(10000\) câu hỏi; họ được đánh số từ \(1\) đến \(100\). Người chơi \(i\) có trình độ \(S_i\), còn câu hỏi \(j\) có độ khó \(Q_j\). Mỗi trình độ và độ khó được chọn đều, độc lập với mọi lựa chọn khác, trong đoạn \([-3{,}00,3{,}00]\). Chẳng hạn, một người có thể có trình độ \(2{,}47853\), và một câu hỏi có thể có độ khó \(-1{,}4172\).

Khi người chơi \(i\) trả lời câu hỏi \(j\), xác suất trả lời đúng là \(f(S_i-Q_j)\), trong đó \(f\) là hàm sigmoid:

\[f(x)=\frac1{1+e^{-x}},\]

\(e\) là hằng số Euler (xấp xỉ \(2{,}718\ldots\)). Ta có \(0<f(x)<1\) với mọi \(x\), nên \(f(S_i-Q_j)\) luôn là một xác suất hợp lệ. Kết quả của mỗi lượt trả lời được lấy ngẫu nhiên, độc lập với mọi lựa chọn khác.

Có đúng một ngoại lệ: đúng một người chơi gian lận! Kẻ gian lận được chọn đều trong tất cả người chơi, độc lập với mọi lựa chọn khác. Trước mỗi câu, người đó tung một đồng xu công bằng. Nếu ra ngửa, họ không gian lận và trả lời theo quy tắc bình thường. Nếu ra sấp, họ bí mật tra đáp án trên Internet và trả lời đúng. Nói cách khác, với mỗi câu hỏi, họ quyết định gian lận độc lập với xác suất \(0{,}5\).

Kết quả một giải đấu chỉ gồm kết quả đúng hoặc sai theo từng câu của từng người chơi. Ngoài mô tả tổng quát trên, bạn không biết gì về trình độ của người chơi hay độ khó của câu hỏi.

Bạn phải xác định đúng kẻ gian lận trong ít nhất \(P\) phần trăm số bộ dữ liệu, tức thành công ở ít nhất \(P\cdot T/100\) trong tổng số \(T\) bộ.

Dữ liệu vào

Dòng đầu chứa số bộ dữ liệu \(T\). Dòng thứ hai chứa tỷ lệ phần trăm \(P\) mà lời giải phải trả lời đúng để được chấp nhận. Tiếp theo là \(T\) bộ dữ liệu.

Mỗi bộ gồm \(100\) dòng, mỗi dòng có \(10000\) ký tự. Ký tự thứ \(j\) trên dòng thứ \(i\)1 nếu người chơi \(i\) trả lời đúng câu hỏi \(j\), và là 0 nếu trả lời sai.

Dữ liệu ra

Với mỗi bộ dữ liệu, in Case #x: y, trong đó \(x\) là số thứ tự bộ dữ liệu (bắt đầu từ \(1\)), còn \(y\) là số hiệu kẻ gian lận (người chơi được đánh số từ \(1\)).

Ràng buộc

  • \(T=50\).

Phân nhóm

  • Test Set 1 (Visible Verdict): \(P=10\).
  • Test Set 2 (Visible Verdict): \(P=86\).

Điểm các phân nhóm

Mỗi Test Set tương ứng với một subtask trên LQDOJ. Bảng dưới đây giữ nguyên điểm chính thức của Google Code Jam và quy đổi tỷ lệ trên tổng điểm của bài.

Phân nhóm Điểm Google Code Jam Tỷ lệ điểm của bài
Test Set 1 11/31 35,48%
Test Set 2 20/31 64,52%

Ví dụ

Ví dụ 1

Input
1
0
0011101000101010000010000001000101010000000011000110101000100001100101010000011000010010001000011000010010000000000010010000000000000111000110001010000000011110010000011001111000101011001100010000010000000010000100100000000000001000011010000101010000000000010001001111000100010001000000010011010001001100110000100010001000010100000001001100010000010000011110010000000110000001001100100001000110000001000000100000001011000100010001101000000000000000000000001110010000001010010101101000011000000000000001000100001011000000110100100000000011100000010000000111100001000010000000000000110111101100110000111100100000100000011011010110000011000000001000100101000010000110010010010001000000110101001000001000100000010001010010001000100000000110110001000000110001000000000000000011010000100010000000110100010001001010110000000001000000010000000011100000001010101000000100000110000001000011001100010001111010100101010000000000100000100100000000011101000000000100101100001000000000101000110100000001010001111100001000000100001111000011100001000001100000000011011000001000100110110000000001111000100000001000011011010000000000001011100000000110000011001010000001010000011000100001000001010000010000000001100010000001100000000000001001000010010000000000010000110000000110000000100000100010000100000011010010001000010000001100011001001101110010010110000101111100000011000011011000000010000010101101100100010000001000000101100000010000101000001000100000000100000111010000000011001011011001100010001000000001111000100100001000000010000000100000101000000000000001100000111100100010001010000110000001010100010100011010010000010000100000100000010010010000110000111100100111110000001000100000000001000001000000000000110001100010000000110100001000010011001110010000001000000000000100000010000100000000101000110010001011000001000100111000010101001000011100000010011100000100100111100100000000000011001000110000000000000010110100010001000000000100000100010100001000010000010101000001111000110000010011100000000000000010100000000100000000011010100001100010001000000000111000001100000000010101010000000011001000001010000110110000111010001100000100000001110000000000000001001000000000010001000000000000001100010001100000010000000000000000101000000000000000100010110000010100110001000010010001011100110001000100100000010000001001101010000101000110000101000000010010000000100110000001000000100010000001101001001100010000000100110001100010000000100100001010010000010000001000000000000000001000000001110010010000101110001100010010100000111001000000000000110100110101010100000000101000000001100000000010111001000101010000000001010000000000101000000000010000000000010100101110010100000001101000010100100010000000101000001001100001010110000010000110001000100000000010010001000011011100000001001100100000000111001000100010000011100100000110100001010010001000110001001100100001000000110111010000000001000000000100010100000011010010000000100111000000000000000000010101100011000011101000000000001001000100100010111101000100110111010100010001000000000011011000010000001100000000010100000001001000110001011000100000000011010010000100111101110000011100000110100001000110000100101010100001100010010100000000010001000000001001110000010000000110000100010010000111100100000000000000101000010010001001000110010001001101000001001001000000000100000010001101000000010101010001010001110010100000000010101000011001001100000100101000010000101000001101111001000110000000000001011000011001000000100001000010000000000100000100011001001110010010000111100010000010001000001100010000001000101000010010010000011001101010110001000001001000101110010010100000000000001100010000001010000101000110000001001110010101000000100000000000000010001001000010010000010001001000000000011000110000001000001111000000000000001000101100001000000100010101001111011000100000100000100001110101001000100000000100010011010010000000000000100110000001001010101001110011110000000010001100000101000000000111100000000001100101001000000000000000000000000101000010110000110001000101100000000000000000000100000000001011000011001000000000000011001111001000000001000011000001100011100000000000111100000001000000010001100100000001000010000001010001100010000100001001011101000100100000000011010000100000011001000011101010000010010010100100011000100001000110001110000100100010100100010010110111010001100000100010000000001010111100011001010000000000000100001001011000000100010001111000010000010100001010100001010010101000010100000010001100010000010101000010010100011111110111000010010000010000000000000010100110001000100010000101100100100010001000001000100010000010000101010011000100110000011010000010110000011000000010100010010101100010010000010001101000000000000010001101000000000000000101001000000001011000000000000000101010110001000100000011000000100010000000001101011000000100100000001010000010010010000101000001100001100100110000000100010001010100000011000000001010000000000110010101011000010000000000000100011000000010101011000001011000011000000010000010001010000011100010100000001110000000000001100101000001100110000011000000101000101001000001011000100100000100010100000011100110101000000011010011001100011100011010100010100111100000000010111101000011000010000000001101010100000011000000000000101000000001001000000000100001100001101010001000010001000001000100000000010101000010010000111000010000000000001000000011110011000010010000000000101100000100010001101000000000010110100010100111001000000100000000001100010010000011010110000010100101001000001101000001100001101010000100010011101000000001100100000100010101000000000011000000000100000100010101010010000000010001010000100010000001010000101100001000000001000100000100101101000100111000000000000100110000101001000010000110101000010101000110000010100001000011101111000000110010000110110100000000010000001010001011000100000000000110100000110110010110000100101000000000000001001100010101000000010000000010000110001000000001010001000000101000010010010101101100000001001001001110010001111011000000100000100010000100010111001000000000100010000000110111001001100000000100011100100000000010010001000110010101101011000000100000101011001100000000101000000000010100101100000100110100001000011010010000000000000011101001000111000000000001010001001000000001000000010000000011000000100000110011000001100100010000000100000000010000100000000101010101000001001000011000001010111000000011101101011110000010000000000011000000000100010000110000000010001100011001100000110000000010000000001010011000011010011000010001100000000100011001000010000010010000110100010011000000000000100101000000010111000000000001000001001001010000001000000000000010010000001001001001100010101000000011010010001000100000000100001111000100110000100100000101000100001000001000010000010011000000000100100100010000110000000101001000010100000010000101010000000000101011000000010000000010000000010100001100000000000111000001011101001001000110000100000010000010000100000000010011101000110000010011000100110000100000000000000100100010111010010010010000000111000000001000101110010101000110100111000000001010000100010000000010001000001010000110000100001010011101010010100000000000010100000010000110000010001000001000011000010010000000011100111101011000100010000000000010000000000000100000000100010001110101101010111000000101101100000111001010000000011010110100000000010000000001100000000001000010100100010010000011100001100110100000010100010100000000000010100010001010000110001000000001000010100011000000100000011000100000000100000110000001000101000000011001001010000000101000000001000100010010000100011100001010000001100010000000100000100101100101000000000010001000000111100110000101100000110000000100010000010010010100000111000011001001100000110000100000001101011011010000100000100000100110000100101000010000010100000001001000000100011000000110011001100000010000001001010001000100001000000000100000100001000000001001001001011001010011100100001000101011001001101100110000000000000000000000010000000010001000100010000101101000010001001001111000000001000001110000000001000000000011000011000000000000011000000000000110000000001001101000000100000001000001100010010010000010000000010100010010000011001001010010000000000000000000001100111011000000001010111100000000000000101001010000100100000011000001111000010001000001100010001011000000100110000100000101000000001001000000000010111000100100000100010000000000000010100000100010000000001011010110010101000001000000000000001011011001100000001000000000000000000000101000001001110100000000001000000111101001100000000010011000100010001000001100100100001100100010001100001010101010001010001001000010100000000000000000000000000010100100101000110000001001000001001110110001000001001000000010000111001111001010001101010111000010010001101001000100101100000110000000010010010000100100000000011001001011000001000001110010011000000110000000001010000100001000010010001010111001000001010000001111000100100100000110010000101100000110100000000010000000100100010000010000101110001000000000000100101000000000110011001011100111000001100000001000111000011000000100101000001010010110000000000000110010001010001010110100000001101100111011111000000010000001100001001110001001101011000000000100000010001000000101001001000001000000000000111000100010000000010001000000001000000000000000101000000000000110010100010001001001000001100010000000101100000000000110010000100010000000000010111101110001011100000001011000101011010001100001100101000000000100000000000100000010000100000001000000010001000100100001110100010101100000100010001000010110000000000000101000000000001001000000111001000011011010101110010100000000011110000100000110010000000010011110001011010000000000100011001000000010000010011000000001011000000000000011010001000101000010111000001001001001011000000000000010011000000101000010100100000001011110000100001100010110000011001010001010100000010011101100010000000100100000000101101000100100001000000010001000000000000010100110000000100010110000000000000100001011010001111100000010000011000000110000000000100000100001000100000001001100100101010101010000101000100110
-------------------------------
99 lines of input omitted.
Use the download button above
to view the full sample input.
-------------------------------
Output
Case #1: 59
Note

Dữ liệu mẫu dùng \(T=1\)\(P=0\), nên không thỏa ràng buộc của bất kỳ Test Set nào. Đáp án mẫu chính là kẻ gian lận thật sự.

Nguồn

Google Code Jam 2021, Vòng loại, bài Cheating Detection.

Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.

2. Google Code Jam 2021 - Median Sort

Điểm: 100 Thời gian: 1.0s Bộ nhớ: 1G Input: bàn phím Output: màn hình

Median Sort

Bạn muốn sắp xếp \(N\) phần tử phân biệt \(x_1,x_2,\ldots,x_N\). Không may, bạn không thể so sánh hai phần tử; với ba phần tử, bạn chỉ có thể hỏi phần tử nào là trung vị, tức không nhỏ nhất cũng không lớn nhất.

Ví dụ, với \(N=5\), biết \(x_1\) là trung vị của \(\{x_1,x_2,x_3\}\), \(x_2\) là trung vị của \(\{x_2,x_3,x_4\}\)\(x_3\) là trung vị của \(\{x_3,x_4,x_5\}\) thì thứ tự được bảo đảm là \(x_4,x_2,x_1,x_3,x_5\) hoặc thứ tự đảo \(x_5,x_3,x_1,x_2,x_4\).

Chỉ từ trung vị, không thể phân biệt một thứ tự với thứ tự đảo của nó vì mọi truy vấn ba phần tử cho cùng kết quả trong cả hai.

Chương trình phải tìm thứ tự của \(T\) danh sách, mỗi danh sách có \(N\) phần tử, bằng tổng không quá \(Q\) truy vấn (trung bình \(Q/T\) mỗi danh sách). Thứ tự đúng hoặc đảo của nó đều được chấp nhận. Thứ tự mỗi bộ được sinh đều ngẫu nhiên trong mọi hoán vị, độc lập với mọi thông tin khác.

Giao thức tương tác

Các mục Dữ liệu vào và Dữ liệu ra dưới đây quy định đầy đủ cuộc đối thoại giữa chương trình và bộ chấm.

Dữ liệu vào

Đây là bài tương tác. Ban đầu bộ chấm gửi một dòng \(T,N,Q\). Sau đó xử lý \(T\) bộ; mỗi bộ gồm các lượt hỏi và một lượt trả lời.

Dữ liệu ra

Để hỏi, in ba số nguyên phân biệt \(i,j,k\) trong \([1,N]\), nghĩa là hỏi trung vị của \(\{x_i,x_j,x_k\}\). Bộ chấm trả một số \(L\in\{i,j,k\}\), nghĩa là \(x_L\) là trung vị. Nếu thực hiện truy vấn thứ \(Q+1\), bộ chấm trả -1.

Khi sẵn sàng, in \(N\) chỉ số theo thứ tự tăng hoặc giảm. Bộ chấm trả 1 nếu đúng, -1 nếu sai. Sau phản hồi của bộ thứ \(T\), chương trình phải kết thúc và không in thêm gì; nếu in thêm sẽ bị Wrong Answer.

Nếu bộ chấm nhận dòng sai định dạng hoặc giá trị không hợp lệ, nó trả -1 và không xuất thêm. Sau mọi -1, chương trình phải thoát ngay; tiếp tục chờ sẽ bị treo. Hãy xả bộ đệm sau mỗi dòng.

Ràng buộc

  • \(T=100\).

Phân nhóm

  • Test Set 1 (Visible Verdict): \(N=10\), \(Q=300T\).
  • Test Set 2 (Visible Verdict): \(N=50\), \(Q=300T\).
  • Test Set 3 (Hidden Verdict): \(N=50\), \(Q=170T\).

Công cụ kiểm thử

Kho chính thức cung cấp công cụ mô phỏng để chạy cục bộ song song với lời giải qua interactive runner; hướng dẫn nằm trong chú thích của công cụ và người dùng được khuyến khích thêm bộ dữ liệu. Công cụ không phải bộ chấm thật và có thể hành xử khác; vượt qua nó không bảo đảm vượt bộ chấm. Bản LQDOJ dùng interactor đi kèm gói bài.

Ví dụ

Ví dụ tương tác

Bộ chấm Chương trình Diễn giải
2 5 600 Cung cấp \(T,N,Q\); bắt đầu bộ 1.
1 2 3 Hỏi trung vị \(\{x_1,x_2,x_3\}\).
2 Trung vị là \(x_2\).
4 2 3 Hỏi trung vị \(\{x_4,x_2,x_3\}\).
3 Trung vị là \(x_3\).
5 4 3 Hỏi trung vị \(\{x_5,x_4,x_3\}\).
4 Trung vị là \(x_4\).
5 4 3 2 1 Xuất danh sách đã sắp.
1 Đáp án đúng; bắt đầu bộ 2.
1 2 3 Hỏi trung vị.
3 Trung vị là \(x_3\).
2 3 4 Hỏi trung vị.
4 Trung vị là \(x_4\).
3 4 5 Hỏi trung vị.
5 Trung vị là \(x_5\).
1 3 5 4 2 Xuất danh sách đã sắp.
1 Đáp án đúng.

Nguồn

Google Code Jam 2021, Vòng loại, bài Median Sort.

Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.

3. Google Code Jam 2021 - Moons and Umbrellas

Điểm: 17 Thời gian: 1.0s Bộ nhớ: 1G Input: bàn phím Output: màn hình

Cody-Jamal đang thực hiện tác phẩm nghệ thuật trừu tượng mới nhất của mình: một bức tranh tường gồm một hàng trăng khuyết và những chiếc ô đóng. Không may, những kẻ săn bản quyền tham lam cho rằng trăng khuyết trông giống chữ C viết hoa, ô đóng trông giống chữ J, và chúng nắm bản quyền đối với CJJC. Vì vậy, với mỗi lần CJ xuất hiện trong bức tranh, Cody-Jamal phải trả \(X\); với mỗi lần JC xuất hiện, anh phải trả \(Y\).

Cody-Jamal không muốn để chúng làm tổn hại tác phẩm nên sẽ không thay đổi bất cứ thứ gì đã vẽ. Tuy nhiên, anh quyết định có thể tô những chỗ còn trống một cách có chiến lược để giảm thiểu chi phí bản quyền.

Ví dụ, giả sử CJ?CC? là trạng thái hiện tại của bức tranh, trong đó C biểu diễn trăng khuyết, J biểu diễn ô đóng, còn ? biểu diễn một chỗ vẫn cần được vẽ thành trăng khuyết hoặc ô đóng. Anh có thể hoàn thiện bức tranh thành CJCCCC, CJCCCJ, CJJCCC hoặc CJJCCJ. Phương án thứ nhất và thứ ba phải trả \(X+Y\), còn phương án thứ hai và thứ tư phải trả \(2X+Y\).

Cho các chi phí \(X\), \(Y\) và một xâu biểu diễn trạng thái hiện tại của bức tranh, Cody-Jamal phải trả ít nhất bao nhiêu tiền bản quyền nếu hoàn thiện bức tranh theo cách tối ưu?

Dữ liệu vào

Dòng đầu chứa số lượng bộ dữ liệu \(T\). Tiếp theo là \(T\) dòng; mỗi dòng chứa hai số nguyên \(X\), \(Y\) và một xâu \(S\), lần lượt biểu diễn hai chi phí và trạng thái hiện tại của bức tranh.

Dữ liệu ra

Với mỗi bộ dữ liệu, in một dòng Case #x: y, trong đó \(x\) là số thứ tự bộ dữ liệu (bắt đầu từ \(1\)), còn \(y\) là chi phí bản quyền nhỏ nhất Cody-Jamal phải trả cho một bức tranh đã hoàn thiện.

Ràng buộc

  • \(1\le T\le100\).
  • Mỗi ký tự của \(S\)C, J hoặc ?.

Phân nhóm

  • Test Set 1 (Visible Verdict): \(1\le |S|\le10\); \(1\le X\le100\); \(1\le Y\le100\).
  • Test Set 2 (Visible Verdict): \(1\le |S|\le1000\); \(1\le X\le100\); \(1\le Y\le100\).
  • Thử thách thêm! Điều gì xảy ra nếu một số chủ bản quyền trả tiền cho Cody-Jamal để được quảng cáo thay vì nhận tiền? Việc Cody-Jamal được trả tiền được biểu diễn bằng chi phí âm.
  • Test Set 3 (Hidden Verdict): \(1\le |S|\le1000\); \(-100\le X\le100\); \(-100\le Y\le100\).

Điểm các phân nhóm

Mỗi Test Set tương ứng với một subtask trên LQDOJ. Bảng dưới đây giữ nguyên điểm chính thức của Google Code Jam và quy đổi tỷ lệ trên tổng điểm của bài.

Phân nhóm Điểm Google Code Jam Tỷ lệ điểm của bài
Test Set 1 5/17 29,41%
Test Set 2 11/17 64,71%
Test Set 3 1/17 5,88%

Ví dụ

Ví dụ 1

Input
4
2 3 CJ?CC?
4 2 CJCJ
1 3 C?J
2 5 ??J???
Output
Case #1: 5
Case #2: 10
Case #3: 1
Case #4: 0
Giải thích
  • Bộ dữ liệu mẫu #1 chính là ví dụ trong đề. Chi phí nhỏ nhất là \(X+Y=2+3=5\).
  • Trong bộ dữ liệu mẫu #2, Cody-Jamal đã hoàn thành tác phẩm nên không có lựa chọn nào khác. Bức tranh có hai CJ và một JC.
  • Trong bộ dữ liệu mẫu #3, thay ? bằng C hay J đều tạo đúng một CJ, tương ứng ở ký tự thứ hai và thứ ba hoặc ký tự thứ nhất và thứ hai.
  • Trong bộ dữ liệu mẫu #4, Cody-Jamal có thể hoàn thiện bức tranh hoàn toàn bằng J. Vì xâu đó không chứa CJ hay JC, chi phí bản quyền bằng \(0\).

Ví dụ bổ sung — Test Set 3

??? "Giải thích"
    Ví dụ bổ sung sau thỏa ràng buộc Test Set 3 và **không** được chạy trên lời giải nộp.

    !!! question "Ví dụ 2"
        ???+ "Input"
            ```sample
            1
            2 -5 ??JJ??
            ```
        ???+ success "Output"
            ```sample
            Case #1: -8
            ```
        ??? "Giải thích"
            Trong bộ dữ liệu này, Cody-Jamal có thể hoàn thiện tối ưu thành `JCJJCC` hoặc `JCJJJC`. Cả hai đều có một `CJ` và hai `JC`.

Nguồn

Google Code Jam 2021, Vòng loại, bài Moons and Umbrellas.

Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.

4. Google Code Jam 2021 - Reversort

Điểm: 7 Thời gian: 1.0s Bộ nhớ: 1G Input: bàn phím Output: màn hình

Lưu ý: Các phần chính của đề bài cho các bài "Reversort" và "Reversort Engineering" là giống hệt nhau, ngoại trừ đoạn cuối cùng. Ngoài ra, hai bài toán có thể được giải độc lập.

Reversort là một thuật toán để sắp xếp một danh sách các số nguyên phân biệt theo thứ tự tăng dần. Thuật toán dựa trên thao tác "Reverse" (đảo ngược). Mỗi lần áp dụng thao tác này sẽ đảo ngược thứ tự của một phần liên tiếp trong danh sách.

Mã giả của thuật toán như sau:

Reversort(L):
  for i := 1 to length(L) - 1
    j := position with the minimum value in L between i and length(L), inclusive
    Reverse(L[i..j])

Sau \(i-1\) lần lặp, các vị trí \(1, 2, \dots, i-1\) của danh sách chứa \(i-1\) phần tử nhỏ nhất của \(L\), theo thứ tự tăng dần. Trong lần lặp thứ \(i\), quá trình này đảo ngược danh sách con đi từ vị trí thứ \(i\) đến vị trí hiện tại của phần tử nhỏ thứ \(i\). Điều đó làm cho phần tử nhỏ thứ \(i\) kết thúc ở vị trí thứ \(i\).

Ví dụ, đối với một danh sách có \(4\) phần tử, thuật toán sẽ thực hiện \(3\) lần lặp. Đây là cách nó xử lý \(L = [4, 2, 1, 3]\):

  1. \(i = 1, j = 3 \longrightarrow L = [1, 2, 4, 3]\)
  2. \(i = 2, j = 2 \longrightarrow L = [1, 2, 4, 3]\)
  3. \(i = 3, j = 4 \longrightarrow L = [1, 2, 3, 4]\)

Phần tốn kém nhất khi thực thi thuật toán trên kiến trúc của chúng tôi là thao tác Reverse. Do đó, thước đo chi phí của mỗi lần lặp đơn giản là độ dài của danh sách con được truyền vào Reverse, tức là giá trị \(j - i + 1\). Chi phí của toàn bộ thuật toán là tổng chi phí của mỗi lần lặp.

Trong ví dụ trên, các lần lặp có chi phí lần lượt là \(3, 1\)\(2\), tổng cộng là \(6\).

Cho danh sách ban đầu, hãy tính chi phí thực thi Reversort trên danh sách đó.

Dữ liệu vào

Dòng đầu tiên của dữ liệu vào cho biết số lượng bộ dữ liệu, \(T\). Tiếp theo là \(T\) bộ dữ liệu.
Mỗi bộ dữ liệu gồm 2 dòng. Dòng đầu tiên chứa một số nguyên duy nhất \(N\), đại diện cho số lượng phần tử trong danh sách đầu vào. Dòng thứ hai chứa \(N\) số nguyên phân biệt \(L_1, L_2, \dots, L_N\), đại diện cho các phần tử của danh sách đầu vào \(L\), theo thứ tự.

Dữ liệu ra

Đối với mỗi bộ dữ liệu, hãy xuất một dòng chứa Case #$x$: $y$, trong đó \(x\) là số thứ tự bộ dữ liệu (bắt đầu từ 1) và \(y\) là tổng chi phí thực thi Reversort trên danh sách được cung cấp ở đầu vào.

Ràng buộc

  • \(1 \le T \le 100\).
  • \(2 \le N \le 100\).
  • \(1 \le L_i \le N\), với mọi \(i\).
  • \(L_i \ne L_j\), với mọi \(i \ne j\).

Phân nhóm

  • Test Set 1 (Visible Verdict): Các ràng buộc như trên.

Điểm các phân nhóm

Mỗi Test Set tương ứng với một subtask trên LQDOJ. Bảng dưới đây giữ nguyên điểm chính thức của Google Code Jam và quy đổi tỷ lệ trên tổng điểm của bài.

Phân nhóm Điểm Google Code Jam Tỷ lệ điểm của bài
Test Set 1 7/7 100%

Ví dụ

Ví dụ 1

Input
3
4
4 2 1 3
2
1 2
7
7 6 5 4 3 2 1
Output
Case #1: 6
Case #2: 1
Case #3: 12
Note
  • Bộ dữ liệu mẫu #1 đã được mô tả trong đề bài ở trên.
  • Trong bộ dữ liệu mẫu #2, chỉ có một lần lặp duy nhất, trong đó Reverse được áp dụng cho một danh sách con có kích thước 1. Do đó, tổng chi phí là 1.
  • Trong bộ dữ liệu mẫu #3, lần lặp đầu tiên đảo ngược toàn bộ danh sách, với chi phí là 7. Sau đó, danh sách đã được sắp xếp, nhưng vẫn còn 5 lần lặp nữa, mỗi lần đóng góp một chi phí là 1.

Nguồn

Google Code Jam 2021, Vòng loại, bài Reversort.

Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.

5. Google Code Jam 2021 - Reversort Engineering

Điểm: 18 Thời gian: 1.0s Bộ nhớ: 1G Input: bàn phím Output: màn hình

Lưu ý: Các phần chính của đề bài cho các bài "Reversort" và "Reversort Engineering" là giống hệt nhau, ngoại trừ đoạn cuối cùng. Ngoài ra, hai bài toán có thể được giải độc lập.

Reversort là một thuật toán để sắp xếp một danh sách các số nguyên phân biệt theo thứ tự tăng dần. Thuật toán dựa trên thao tác "Reverse" (đảo ngược). Mỗi lần áp dụng thao tác này sẽ đảo ngược thứ tự của một phần liên tiếp trong danh sách.

Mã giả của thuật toán như sau:

Reversort(L):
  for i := 1 to length(L) - 1
    j := position with the minimum value in L between i and length(L), inclusive
    Reverse(L[i..j])

Sau \(i-1\) lần lặp, các vị trí \(1, 2, \dots, i-1\) của danh sách chứa \(i-1\) phần tử nhỏ nhất của \(L\), theo thứ tự tăng dần. Trong lần lặp thứ \(i\), quá trình này đảo ngược danh sách con đi từ vị trí thứ \(i\) đến vị trí hiện tại của phần tử nhỏ thứ \(i\). Điều đó làm cho phần tử nhỏ thứ \(i\) kết thúc ở vị trí thứ \(i\).

Ví dụ, đối với một danh sách có \(4\) phần tử, thuật toán sẽ thực hiện \(3\) lần lặp. Đây là cách nó xử lý \(L = [4, 2, 1, 3]\):

  1. \(i = 1, j = 3 \longrightarrow L = [1, 2, 4, 3]\)
  2. \(i = 2, j = 2 \longrightarrow L = [1, 2, 4, 3]\)
  3. \(i = 3, j = 4 \longrightarrow L = [1, 2, 3, 4]\)

Phần tốn kém nhất khi thực thi thuật toán trên kiến trúc của chúng tôi là thao tác Reverse. Do đó, thước đo chi phí của mỗi lần lặp đơn giản là độ dài của danh sách con được truyền vào Reverse, tức là giá trị \(j - i + 1\). Chi phí của toàn bộ thuật toán là tổng chi phí của mỗi lần lặp.

Trong ví dụ trên, các lần lặp có chi phí lần lượt là \(3, 1\)\(2\), tổng cộng là \(6\).

Cho kích thước \(N\) và chi phí \(C\). Hãy tìm một danh sách gồm \(N\) số nguyên phân biệt từ \(1\) đến \(N\) sao cho chi phí áp dụng Reversort lên nó đúng bằng \(C\), hoặc cho biết không tồn tại danh sách như vậy.

Dữ liệu vào

Dòng đầu chứa số lượng bộ dữ liệu \(T\). Tiếp theo là \(T\) dòng; mỗi dòng mô tả một bộ dữ liệu bằng hai số nguyên \(N\)\(C\), lần lượt là kích thước danh sách cần tìm và chi phí mong muốn.

Dữ liệu ra

Với mỗi bộ dữ liệu, nếu không có danh sách kích thước \(N\) mà Reversort có chi phí đúng bằng \(C\), in Case #x: IMPOSSIBLE, trong đó \(x\) là số thứ tự bộ dữ liệu (bắt đầu từ \(1\)).

Nếu có, in Case #x: y_1 y_2 ... y_N, trong đó mỗi \(y_i\) là một số nguyên phân biệt từ \(1\) đến \(N\), biểu diễn phần tử thứ \(i\) của một danh sách hợp lệ. Nếu có nhiều đáp án, có thể in bất kỳ đáp án nào. Quy ước về nhiều đáp án này sẽ không được nhắc lại trong phần còn lại của Code Jam 2021.

Ràng buộc

  • \(1\le T\le100\).
  • \(1\le C\le1000\).

Phân nhóm

  • Test Set 1 (Visible Verdict): \(2\le N\le7\).
  • Test Set 2 (Visible Verdict): \(2\le N\le100\).

Điểm các phân nhóm

Mỗi Test Set tương ứng với một subtask trên LQDOJ. Bảng dưới đây giữ nguyên điểm chính thức của Google Code Jam và quy đổi tỷ lệ trên tổng điểm của bài.

Phân nhóm Điểm Google Code Jam Tỷ lệ điểm của bài
Test Set 1 7/18 38,89%
Test Set 2 11/18 61,11%

Ví dụ

Ví dụ 1

Input
5
4 6
2 1
7 12
7 2
2 1000
Output
Case #1: 4 2 1 3
Case #2: 1 2
Case #3: 7 6 5 4 3 2 1
Case #4: IMPOSSIBLE
Case #5: IMPOSSIBLE
Giải thích
  • Bộ dữ liệu mẫu #1 chính là ví dụ được mô tả ở trên.
  • Trong bộ dữ liệu mẫu #2, thuật toán chỉ chạy một vòng lặp trên đáp án đề xuất. Reverse được áp dụng lên danh sách con kích thước \(1\), nên chi phí là \(1\).
  • Trong bộ dữ liệu mẫu #3, vòng lặp đầu đảo toàn bộ danh sách với chi phí \(7\). Sau đó danh sách đã được sắp xếp, nhưng vẫn còn \(5\) vòng lặp, mỗi vòng có chi phí \(1\). Một đáp án hợp lệ khác là 7 5 4 3 2 1 6: vòng đầu có chi phí \(6\), vòng cuối có chi phí \(2\), và mọi vòng còn lại có chi phí \(1\).
  • Trong bộ dữ liệu mẫu #4, Reversort nhất thiết thực hiện \(6\) vòng lặp, mỗi vòng có chi phí ít nhất \(1\), nên tổng chi phí không thể nhỏ như yêu cầu.

Nguồn

Google Code Jam 2021, Vòng loại, bài Reversort Engineering.

Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.