| # | Bài tập | Điểm | Thời gian: | Giới hạn bộ nhớ |
|---|---|---|---|---|
| 1 | Google Code Jam 2021 - Hidden Pancakes | 31 | 2.5s | 1G |
| 2 | Google Code Jam 2021 - Matrygons | 20 | 1.0s | 1G |
| 3 | Google Code Jam 2021 - Minimum Sort | 100 | 3.5s | 1G |
| 4 | Google Code Jam 2021 - Retiling | 34 | 1.0s | 1G |
Ta nấu tổng cộng \(N\) chiếc bánh kếp: một chiếc bán kính \(1\) cm, một chiếc \(2\) cm, ..., một chiếc \(N\) cm, theo thứ tự bất kỳ. Chiếc đầu đặt lên đĩa; mỗi chiếc sau đặt lên chiếc trước, đồng tâm. Khi vừa thêm, một bánh luôn nhìn thấy từ trên. Nó chỉ bị che khi về sau có bánh bán kính lớn hơn.
Ví dụ với \(4\) bánh: nấu bán kính \(3\) trước, có một bánh thấy được; thêm bán kính \(1\), cả hai thấy được; thêm bán kính \(2\), nó che bánh \(1\) nhưng không che bánh \(3\), còn hai bánh thấy được; cuối cùng bánh \(4\) che tất cả, chỉ còn một. Trong hình, bánh tô kín là thấy được, bánh bán trong suốt là bị che.
Gọi \(V_i\) là số bánh nhìn thấy khi chồng có đúng \(i\) bánh. Ví dụ có \(V=(1,2,2,1)\). Cho \(V_1,\ldots,V_N\), có bao nhiêu trong \(N!\) thứ tự nấu tạo đúng dãy đó? In kết quả modulo \(10^9+7\).
Dòng đầu chứa \(T\). Mỗi bộ gồm hai dòng: \(N\), rồi \(N\) số \(V_1,\ldots,V_N\).
Với mỗi bộ, in Case #x: y, với \(y\) là số thứ tự nấu hợp lệ modulo \(1000000007\).
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 | 10/31 | 32,26% |
| Test Set 2 | 21/31 | 67,74% |
Ví dụ 1
3
4
1 2 2 1
3
1 1 2
3
1 1 3
Case #1: 1
Case #2: 2
Case #3: 0
1
24
1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2Case #1: 234141013
??? "Giải thích"
Có $316234143225$ thứ tự nấu tạo dãy; modulo $10^9+7$ là $234141013$. Ví dụ không chạy trên lời giải nộp.
Google Code Jam 2021, Vòng 2, bài Hidden Pancakes.
Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.
Matryoshka là một loại búp bê xuất xứ từ Nga hơn một thế kỷ trước. Đặc trưng của chúng là một bộ búp bê có kích thước khác nhau, trong đó búp bê nhỏ nằm vừa vặn bên trong búp bê lớn.
Trong bài này, ta làm việc với matrygon: các bộ đa giác lồi đều có kiểu lồng nhau tương tự. Một matrygon gồm các đa giác lồi đều có diện tích dương \(p_1,p_2,\ldots,p_k\) sao cho với mọi \(i\), các đỉnh của \(p_{i+1}\) trùng với một tập con thực sự các đỉnh của \(p_i\); tức \(p_{i+1}\) có ít đỉnh hơn hẳn \(p_i\).
Hai hình sau minh họa hai matrygon. Hình thứ nhất có ba đa giác lồi đều: một đa giác \(24\) cạnh, một lục giác đều \(6\) cạnh và một tam giác đều \(3\) cạnh. Hình thứ hai có hai đa giác: một đa giác đều \(22\) cạnh và một đa giác đều \(11\) cạnh. Tổng số cạnh của các đa giác trong mỗi matrygon đều bằng \(33\).
Cho tổng số cạnh cố định \(N\), hãy tính số đa giác lớn nhất có thể thuộc một matrygon sao cho tổng số cạnh của mọi đa giác đúng bằng \(N\).
Dòng đầu chứa số bộ dữ liệu \(T\). Mỗi dòng tiếp theo chứa một số nguyên \(N\), là tổng số cạnh mục tiêu của một bộ dữ liệu.
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ố đa giác lớn nhất trong một matrygon có tổng số cạnh đúng bằng \(N\).
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/20 | 35% |
| Test Set 2 | 13/20 | 65% |
Ví dụ 1
3
33
15
41
Case #1: 3
Case #2: 2
Case #3: 1
Google Code Jam 2021, Vòng 2, bài Matrygons.
Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.
Trong bài này, bạn phải sắp xếp một danh sách gồm \(N=100\) số nguyên phân biệt theo thứ tự tăng nghiêm ngặt. Bạn có thể hoán đổi nội dung của hai vị trí bất kỳ; chúng không cần kề nhau. Tuy nhiên, bạn không thể đọc trực tiếp các nội dung đó.
Bạn lấy thông tin về danh sách bằng truy vấn giá trị nhỏ nhất của một đoạn. Truy vấn trả về vị trí của giá trị nhỏ nhất trong một đoạn vị trí liên tiếp. Ví dụ, trong danh sách \([51,33,100,11]\), giá trị nhỏ nhất trên đoạn vị trí \(2\) đến \(4\) (đánh số từ \(1\)) nằm ở vị trí \(4\); còn giá trị nhỏ nhất trên đoạn \(1\) đến \(3\) nằm ở vị trí \(2\).
Các truy vấn này bị giới hạn bởi ngân sách xu của từng bộ dữ liệu. Đoạn càng dài thì càng rẻ: hỏi vị trí nhỏ nhất giữa \(i\) và \(j\) với \(i<j\) tốn
xu, trong đó \(\lceil x\rceil\) là số nguyên nhỏ nhất không nhỏ hơn \(x\). Trái lại, thao tác hoán đổi không tốn xu.
Hãy viết chương trình sắp xếp danh sách bằng số lần hoán đổi tùy ý và tổng chi phí không quá \(6\times10^8\) xu cho các truy vấn giá trị nhỏ nhất trong mỗi bộ dữ liệu.
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 chứa hai số nguyên \(T,N\): số bộ dữ liệu và số phần tử cần sắp xếp trong mỗi bộ. Bộ chấm đã cố định các danh sách trước khi nhận đầu vào từ chương trình; trong quá trình trao đổi, chúng chỉ thay đổi bởi những phép hoán đổi bạn yêu cầu.
Sau đó, bạn phải xử lý \(T\) bộ dữ liệu. Mỗi bộ gồm một chuỗi lượt trao đổi và một dòng bổ sung để báo đã hoàn tất. Trong mỗi lượt, chương trình in một dòng, rồi bộ chấm in một dòng phản hồi.
Ở mỗi lượt, chương trình phải in đúng một trong các lệnh sau:
M i j, với \(i<j\), biểu diễn truy vấn giá trị nhỏ nhất. Bộ chấm trả về một số nguyên là vị trí của giá trị nhỏ nhất trong đoạn vị trí \([i,j]\), đánh số từ \(1\).S i j, với \(i<j\), biểu diễn thao tác hoán đổi. Bộ chấm đổi hai phần tử tại vị trí \(i,j\) và trả về 1.D, báo rằng bạn đã sắp xếp xong danh sách. Bộ chấm kiểm tra danh sách và trả 1 nếu nó tăng nghiêm ngặt, hoặc -1 nếu không.Sau khi bộ chấm trả 1 cho lệnh D, nếu đây là bộ cuối thì phiên làm việc kết thúc; nếu không, bộ chấm lập tức chờ lệnh đầu tiên của bộ tiếp theo. Sau khi nhận phản hồi cho bộ dữ liệu thứ \(T\), chương trình phải kết thúc.
Nếu tại bất cứ lúc nào bộ chấm nhận một dòng sai định dạng, một giá trị không hợp lệ, hoặc một truy vấn M làm vượt ngân sách còn lại, nó in -1 và không in thêm gì nữa. Sau khi nhận -1, chương trình phải thoát ngay; nếu tiếp tục chờ, chương trình sẽ bị treo. Hãy nhớ xả bộ đệm đầu ra sau mỗi lệnh.
Ví dụ tương tác
Ví dụ sau dùng \(T=2,N=4\) chỉ để minh họa và không thỏa ràng buộc chính thức.
| Bộ chấm | Chương trình | Diễn giải |
|---|---|---|
2 4 |
Bộ chấm cung cấp \(T,N\). Bộ 1 có danh sách \([51,33,100,11]\). | |
M 2 4 |
Hỏi min trên \([2,4]\), tốn \(\lceil10^8/3\rceil=33333334\) xu. | |
4 |
Min của đoạn nằm ở vị trí \(4\). | |
M 1 3 |
Hỏi min trên \([1,3]\), tốn \(33333334\) xu. | |
2 |
Min của đoạn nằm ở vị trí \(2\). | |
S 1 4 |
Đổi vị trí \(1,4\). | |
1 |
Danh sách thành \([11,33,100,51]\). | |
M 3 4 |
Hỏi min trên \([3,4]\), tốn \(50000000\) xu. | |
4 |
Min của đoạn nằm ở vị trí \(4\). | |
S 3 4 |
Đổi vị trí \(3,4\). | |
1 |
Danh sách thành \([11,33,51,100]\). | |
D |
Báo hoàn tất; tổng chi phí \(116666668\) xu. | |
1 |
Danh sách đã tăng nghiêm ngặt. Bộ 2 có danh sách \([30,20,10,40]\). | |
M 1 4 |
Hỏi min trên \([1,4]\), tốn \(25000000\) xu. | |
3 |
Min nằm ở vị trí \(3\). | |
S 1 3 |
Đổi vị trí \(1,3\). | |
1 |
Danh sách thành \([10,20,30,40]\). | |
M 3 4 |
Hỏi min trên \([3,4]\), tốn \(50000000\) xu. | |
3 |
Min nằm ở vị trí \(3\). | |
M 2 4 |
Hỏi min trên \([2,4]\), tốn \(33333334\) xu. | |
2 |
Min nằm ở vị trí \(2\). | |
D |
Báo hoàn tất; tổng chi phí \(108333334\) xu. | |
1 |
Danh sách đã tăng nghiêm ngặt; cả hai bộ hoàn tất. |
Kho bài gốc cung cấp công cụ để kiểm thử cục bộ hoặc trên nền tảng Code Jam. Khi chạy cục bộ, cần chạy công cụ song song với lời giải, chẳng hạn qua interactive runner. Hướng dẫn sử dụng nằm trong phần chú thích của công cụ; bạn được khuyến khích tự thêm bộ dữ liệu.
Công cụ chỉ mô phỏng hệ thống chấm, không phải hệ thống chấm thật và có thể hành xử khác. Việc vượt qua công cụ không bảo đảm vượt qua bộ chấm. Bản chuyển thể LQDOJ dùng interactor đi kèm gói bài thay cho công cụ tải xuống này.
Google Code Jam 2021, Vòng 2, bài Minimum 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.
Tác phẩm mới nhất của Cody-Jamal là một sàn bếp lát gạch có thể đổi sang nhiều hoa văn. Sàn là ma trận \(R\) hàng, \(C\) cột các viên gạch vuông. Mỗi viên có thể lật: một mặt màu magenta (M), mặt kia màu xanh (G).
Có hai thao tác:
Xem sàn miễn phí, nhưng thao tác thì không: một lần lật tốn \(F\) xu, một lần đổi chỗ tốn \(S\) xu. Bạn biết trạng thái hiện tại và hoa văn đích. Cần ít nhất bao nhiêu xu?
Dòng đầu chứa số bộ dữ liệu \(T\). Dòng đầu mỗi bộ chứa \(R,C,F,S\). Tiếp theo là \(2R\) dòng, mỗi dòng \(C\) ký tự. \(R\) dòng đầu là trạng thái hiện tại; \(R\) dòng cuối là trạng thái mong muốn. Ký tự M nghĩa là mặt magenta đang hiện, G nghĩa là mặt xanh.
Với mỗi bộ dữ liệu, in Case #x: y, trong đó \(y\) là số xu ít nhất để biến trạng thái hiện tại thành trạng thái đích.
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/34 | 32,35% |
| Test Set 2 | 23/34 | 67,65% |
Ví dụ 1
2
2 4 1 1
MGMG
MMMG
GMGM
MMMM
3 3 1 1
MGG
GMG
MMM
MMM
MGM
MMG
Case #1: 3
Case #2: 4
Mẫu #1 có \(5\) ô khác màu giữa đầu và đích. Mỗi thao tác đổi nhiều nhất \(2\) ô, nên cần ít nhất \(3\) thao tác. Một cách đạt \(3\) xu: đổi hai ô trái nhất hàng trên; đổi hai ô phải nhất hàng trên; lật ô góc phải dưới.
Mẫu #2 có \(6\) ô cần đổi. Muốn dùng \(3\) thao tác thì cả ba phải là đổi chỗ, nhưng không thể cho cả \(6\) ô mỗi ô tham gia đúng một đổi chỗ, nên cần ít nhất \(4\). Một cách: đổi hai ô trên cùng cột giữa; lật góc phải trên; đổi hai ô dưới cùng cột phải; lật ô giữa cột trái.
??? "Giải thích"
Ví dụ này không được chạy trên lời giải nộp.
!!! question "Ví dụ 2"
???+ "Input"
```sample
1
1 5 1000 1
MGGGG
GGGMM
```
???+ success "Output"
```sample
Case #1: 1003
```
??? "Giải thích"
Lật rất đắt nên phải tránh tối đa. Tuy nhiên, đích có nhiều ô magenta hơn hiện tại nên cần ít nhất một lần lật, vì đổi chỗ không thay đổi số lượng. Cách tối ưu: đổi hai ô trái nhất; lật ô phải nhất; đổi ô thứ hai và ba từ trái; đổi ô thứ ba và tư từ trái.

Google Code Jam 2021, Vòng 2, bài Retiling.
Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.