| # | 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 |
Có \(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:
và \(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ò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\) là 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.
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\)).
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ụ 1
1
0
0011101000101010000010000001000101010000000011000110101000100001100101010000011000010010001000011000010010000000000010010000000000000111000110001010000000011110010000011001111000101011001100010000010000000010000100100000000000001000011010000101010000000000010001001111000100010001000000010011010001001100110000100010001000010100000001001100010000010000011110010000000110000001001100100001000110000001000000100000001011000100010001101000000000000000000000001110010000001010010101101000011000000000000001000100001011000000110100100000000011100000010000000111100001000010000000000000110111101100110000111100100000100000011011010110000011000000001000100101000010000110010010010001000000110101001000001000100000010001010010001000100000000110110001000000110001000000000000000011010000100010000000110100010001001010110000000001000000010000000011100000001010101000000100000110000001000011001100010001111010100101010000000000100000100100000000011101000000000100101100001000000000101000110100000001010001111100001000000100001111000011100001000001100000000011011000001000100110110000000001111000100000001000011011010000000000001011100000000110000011001010000001010000011000100001000001010000010000000001100010000001100000000000001001000010010000000000010000110000000110000000100000100010000100000011010010001000010000001100011001001101110010010110000101111100000011000011011000000010000010101101100100010000001000000101100000010000101000001000100000000100000111010000000011001011011001100010001000000001111000100100001000000010000000100000101000000000000001100000111100100010001010000110000001010100010100011010010000010000100000100000010010010000110000111100100111110000001000100000000001000001000000000000110001100010000000110100001000010011001110010000001000000000000100000010000100000000101000110010001011000001000100111000010101001000011100000010011100000100100111100100000000000011001000110000000000000010110100010001000000000100000100010100001000010000010101000001111000110000010011100000000000000010100000000100000000011010100001100010001000000000111000001100000000010101010000000011001000001010000110110000111010001100000100000001110000000000000001001000000000010001000000000000001100010001100000010000000000000000101000000000000000100010110000010100110001000010010001011100110001000100100000010000001001101010000101000110000101000000010010000000100110000001000000100010000001101001001100010000000100110001100010000000100100001010010000010000001000000000000000001000000001110010010000101110001100010010100000111001000000000000110100110101010100000000101000000001100000000010111001000101010000000001010000000000101000000000010000000000010100101110010100000001101000010100100010000000101000001001100001010110000010000110001000100000000010010001000011011100000001001100100000000111001000100010000011100100000110100001010010001000110001001100100001000000110111010000000001000000000100010100000011010010000000100111000000000000000000010101100011000011101000000000001001000100100010111101000100110111010100010001000000000011011000010000001100000000010100000001001000110001011000100000000011010010000100111101110000011100000110100001000110000100101010100001100010010100000000010001000000001001110000010000000110000100010010000111100100000000000000101000010010001001000110010001001101000001001001000000000100000010001101000000010101010001010001110010100000000010101000011001001100000100101000010000101000001101111001000110000000000001011000011001000000100001000010000000000100000100011001001110010010000111100010000010001000001100010000001000101000010010010000011001101010110001000001001000101110010010100000000000001100010000001010000101000110000001001110010101000000100000000000000010001001000010010000010001001000000000011000110000001000001111000000000000001000101100001000000100010101001111011000100000100000100001110101001000100000000100010011010010000000000000100110000001001010101001110011110000000010001100000101000000000111100000000001100101001000000000000000000000000101000010110000110001000101100000000000000000000100000000001011000011001000000000000011001111001000000001000011000001100011100000000000111100000001000000010001100100000001000010000001010001100010000100001001011101000100100000000011010000100000011001000011101010000010010010100100011000100001000110001110000100100010100100010010110111010001100000100010000000001010111100011001010000000000000100001001011000000100010001111000010000010100001010100001010010101000010100000010001100010000010101000010010100011111110111000010010000010000000000000010100110001000100010000101100100100010001000001000100010000010000101010011000100110000011010000010110000011000000010100010010101100010010000010001101000000000000010001101000000000000000101001000000001011000000000000000101010110001000100000011000000100010000000001101011000000100100000001010000010010010000101000001100001100100110000000100010001010100000011000000001010000000000110010101011000010000000000000100011000000010101011000001011000011000000010000010001010000011100010100000001110000000000001100101000001100110000011000000101000101001000001011000100100000100010100000011100110101000000011010011001100011100011010100010100111100000000010111101000011000010000000001101010100000011000000000000101000000001001000000000100001100001101010001000010001000001000100000000010101000010010000111000010000000000001000000011110011000010010000000000101100000100010001101000000000010110100010100111001000000100000000001100010010000011010110000010100101001000001101000001100001101010000100010011101000000001100100000100010101000000000011000000000100000100010101010010000000010001010000100010000001010000101100001000000001000100000100101101000100111000000000000100110000101001000010000110101000010101000110000010100001000011101111000000110010000110110100000000010000001010001011000100000000000110100000110110010110000100101000000000000001001100010101000000010000000010000110001000000001010001000000101000010010010101101100000001001001001110010001111011000000100000100010000100010111001000000000100010000000110111001001100000000100011100100000000010010001000110010101101011000000100000101011001100000000101000000000010100101100000100110100001000011010010000000000000011101001000111000000000001010001001000000001000000010000000011000000100000110011000001100100010000000100000000010000100000000101010101000001001000011000001010111000000011101101011110000010000000000011000000000100010000110000000010001100011001100000110000000010000000001010011000011010011000010001100000000100011001000010000010010000110100010011000000000000100101000000010111000000000001000001001001010000001000000000000010010000001001001001100010101000000011010010001000100000000100001111000100110000100100000101000100001000001000010000010011000000000100100100010000110000000101001000010100000010000101010000000000101011000000010000000010000000010100001100000000000111000001011101001001000110000100000010000010000100000000010011101000110000010011000100110000100000000000000100100010111010010010010000000111000000001000101110010101000110100111000000001010000100010000000010001000001010000110000100001010011101010010100000000000010100000010000110000010001000001000011000010010000000011100111101011000100010000000000010000000000000100000000100010001110101101010111000000101101100000111001010000000011010110100000000010000000001100000000001000010100100010010000011100001100110100000010100010100000000000010100010001010000110001000000001000010100011000000100000011000100000000100000110000001000101000000011001001010000000101000000001000100010010000100011100001010000001100010000000100000100101100101000000000010001000000111100110000101100000110000000100010000010010010100000111000011001001100000110000100000001101011011010000100000100000100110000100101000010000010100000001001000000100011000000110011001100000010000001001010001000100001000000000100000100001000000001001001001011001010011100100001000101011001001101100110000000000000000000000010000000010001000100010000101101000010001001001111000000001000001110000000001000000000011000011000000000000011000000000000110000000001001101000000100000001000001100010010010000010000000010100010010000011001001010010000000000000000000001100111011000000001010111100000000000000101001010000100100000011000001111000010001000001100010001011000000100110000100000101000000001001000000000010111000100100000100010000000000000010100000100010000000001011010110010101000001000000000000001011011001100000001000000000000000000000101000001001110100000000001000000111101001100000000010011000100010001000001100100100001100100010001100001010101010001010001001000010100000000000000000000000000010100100101000110000001001000001001110110001000001001000000010000111001111001010001101010111000010010001101001000100101100000110000000010010010000100100000000011001001011000001000001110010011000000110000000001010000100001000010010001010111001000001010000001111000100100100000110010000101100000110100000000010000000100100010000010000101110001000000000000100101000000000110011001011100111000001100000001000111000011000000100101000001010010110000000000000110010001010001010110100000001101100111011111000000010000001100001001110001001101011000000000100000010001000000101001001000001000000000000111000100010000000010001000000001000000000000000101000000000000110010100010001001001000001100010000000101100000000000110010000100010000000000010111101110001011100000001011000101011010001100001100101000000000100000000000100000010000100000001000000010001000100100001110100010101100000100010001000010110000000000000101000000000001001000000111001000011011010101110010100000000011110000100000110010000000010011110001011010000000000100011001000000010000010011000000001011000000000000011010001000101000010111000001001001001011000000000000010011000000101000010100100000001011110000100001100010110000011001010001010100000010011101100010000000100100000000101101000100100001000000010001000000000000010100110000000100010110000000000000100001011010001111100000010000011000000110000000000100000100001000100000001001100100101010101010000101000100110
-------------------------------
99 lines of input omitted.
Use the download button above
to view the full sample input.
-------------------------------
Case #1: 59
Dữ liệu mẫu dùng \(T=1\) và \(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ự.
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.
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\}\) và \(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.
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.
Đâ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.
Để 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.
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ụ 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. |
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.
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 CJ và JC. 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ò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.
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.
C, J hoặc ?.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ụ 1
4
2 3 CJ?CC?
4 2 CJCJ
1 3 C?J
2 5 ??J???
Case #1: 5
Case #2: 10
Case #3: 1
Case #4: 0
CJ và một JC.? 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.J. Vì xâu đó không chứa CJ hay JC, chi phí bản quyền bằng \(0\).??? "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`.
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.
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]\):
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\) và \(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ò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ự.
Đố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.
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ụ 1
3
4
4 2 1 3
2
1 2
7
7 6 5 4 3 2 1
Case #1: 6
Case #2: 1
Case #3: 12
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.
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]\):
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\) và \(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ò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\) và \(C\), lần lượt là kích thước danh sách cần tìm và chi phí mong muốn.
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.
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ụ 1
5
4 6
2 1
7 12
7 2
2 1000
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
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\).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.