| # | Bài tập | Điểm | Thời gian: | Giới hạn bộ nhớ |
|---|---|---|---|---|
| 1 | Google Code Jam 2021 - Binary Search Game | 35 | 4.0s | 1G |
| 2 | Google Code Jam 2021 - Build-A-Pair | 15 | 5.0s | 1G |
| 3 | Google Code Jam 2021 - Fence Design | 30 | 20.0s | 1G |
| 4 | Google Code Jam 2021 - Square Free | 20 | 1.0s | 1G |
Alice và Bob chơi trò Binary Search trên một bảng một hàng gồm \(2^L\) ô. Mỗi ô chứa một số nguyên từ \(1\) đến \(N\). Ngoài ra có \(N\) lá bài đánh số \(1\) đến \(N\). Trước mỗi ván, trọng tài ghi lên mỗi lá một số từ \(1\) đến \(M\), theo một trong \(M^N\) cách. Alice và Bob biết mọi số trên bảng và trên bài trước khi chơi.
Hai người luân phiên, Alice đi trước. Có tổng cộng \(L\) lượt: Alice đi \(\lceil L/2\rceil\) lượt, Bob đi \(\lfloor L/2\rfloor\) lượt. Mỗi lượt, người chơi loại nửa trái hoặc nửa phải của các ô còn lại.
Ví dụ, với bảng \([2,4,1,1,4,5,2,5]\), Alice đầu tiên phải để lại \([2,4,1,1]\) hoặc \([4,5,2,5]\). Nếu cô loại nửa trái và để \([4,5,2,5]\), Bob chọn giữa \([4,5]\) và \([2,5]\). Nếu Bob để \([2,5]\), lượt cuối Alice chọn giữa \([2]\) và \([5]\).
Khi kết thúc, gọi \(X\) là số trong ô duy nhất còn lại. Điểm là số trọng tài ghi trên lá bài số \(X\). Trong ví dụ, nếu Alice loại \([5]\) và để \([2]\), điểm là số trên lá bài \(2\).
Alice chơi tối ưu để tối đa hóa điểm, Bob chơi tối ưu để tối thiểu hóa. Bảng cố định chứa \(A_1,\ldots,A_{2^L}\). Để công bằng tối đa, họ chơi đủ \(M^N\) ván, mỗi ván dùng một cách ghi số khác nhau lên các lá; mỗi cách xuất hiện đúng một lần. Hãy tính tổng điểm của mọi ván, lấy modulo số nguyên tố \(10^9+7\).
Dòng đầu chứa \(T\). Mỗi bộ đúng hai dòng: dòng đầu chứa \(N,M,L\); dòng sau chứa \(2^L\) số \(A_1,\ldots,A_{2^L}\) từ trái sang phải.
Với mỗi bộ, in Case #x: y, trong đó \(y\) là tổng điểm của \(M^N\) ván 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 | 9/35 | 25,71% |
| Test Set 2 | 26/35 | 74,29% |
Ví dụ 1
3
2 2 2
2 1 1 1
4 3 2
3 1 1 4
5 100 3
2 4 1 1 4 5 2 5
Case #1: 6
Case #2: 144
Case #3: 991661422
Mẫu #1 có bốn cách ghi bài: \([1,1],[1,2],[2,1],[2,2]\). Với hai cách đầu, dù Alice chọn gì ở lượt đầu, Bob luôn có thể làm ô cuối là \(1\); lá \(1\) ghi \(1\), nên mỗi ván được \(1\). Với hai cách cuối, Alice loại nửa trái, để \([1,1]\) cho Bob; Bob buộc để \([1]\). Lá \(1\) ghi \(2\), nên mỗi ván được \(2\). Tổng là \(1+1+2+2=6\).
Google Code Jam 2021, Vòng 3, bài Binary Search Game.
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 dựng một cặp số nguyên dương. Bạn được cho một danh sách chữ số thập phân và phải dùng mỗi chữ số đúng một lần, nhưng được chọn chữ số nào thuộc số thứ nhất, chữ số nào thuộc số thứ hai.
Bạn cũng được chọn thứ tự chữ số trong mỗi số, ngoại trừ việc chữ số có nghĩa lớn nhất (bên trái nhất) của mỗi số không được là \(0\). Đặc biệt, không thể chọn riêng một chữ số \(0\) làm một số, vì số đó không dương.
Ví dụ, với danh sách \([1,0,2,0,4,3]\), hai cặp hợp lệ là \((200,143)\) và \((3,12400)\). Các cặp sau không hợp lệ:
Với danh sách chữ số, hãy tìm hiệu tuyệt đối nhỏ nhất có thể giữa hai số được dựng.
Dòng đầu chứa số bộ dữ liệu \(T\). Mỗi dòng tiếp theo chứa một xâu chữ số \(D\); mỗi ký tự của \(D\) là một chữ số bắt buộc phải dùng.
Với mỗi bộ dữ liệu, in Case #x: y, trong đó \(x\) là số thứ tự (bắt đầu từ \(1\)), còn \(y\) là hiệu tuyệt đối nhỏ nhất giữa hai số được dựng từ \(D\) theo các quy tắc trên.
0.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 | 3/15 | 20% |
| Test Set 2 | 12/15 | 80% |
Ví dụ 1
4
1234
0011
07080
0899
Case #1: 7
Case #2: 0
Case #3: 620
Case #4: 1
Các cặp tối ưu lần lượt là \((31,24)\), \((10,10)\), \((700,80)\) và \((89,90)\).
Google Code Jam 2021, Vòng 3, bài Build-A-Pair.
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 được Công ty Xây dựng Hàng rào thuê làm nhân viên tạm thời và được giao hoàn thiện thiết kế hàng rào cho một cánh đồng. Mỗi hàng rào phải là một đoạn thẳng nối hai cọc. Mỗi cọc chiếm một điểm duy nhất và có vị trí cố định. Không có ba cọc nào thẳng hàng. Các hàng rào không được giao nhau, trừ trường hợp chúng gặp nhau tại đầu mút (các cọc).
Một người khác đã bắt đầu bản thiết kế nhưng bỏ dự án sau khi thêm đúng hai hàng rào. Bạn cần hoàn thiện thiết kế của họ. Để gây ấn tượng với cấp trên và khách hàng, bạn muốn thiết kế có nhiều hàng rào nhất có thể, bất kể độ dài của chúng.
Cho vị trí các cọc và những hàng rào đã dựng, hãy tìm cách thêm nhiều hàng rào nhất sao cho không có hai hàng rào nào (mới hoặc có sẵn) giao nhau, ngoại trừ có thể tại đầu mút (các cọc).
Dòng đầu tiên chứa số bộ test \(T\). Mỗi bộ test bắt đầu bằng một dòng chứa số nguyên \(N\), số lượng cọc. Sau đó là \(N\) dòng; dòng thứ \(i\) chứa hai số nguyên \(X_i,Y_i\), là tọa độ X và Y của cọc thứ \(i\). Hai dòng cuối của mỗi bộ test mô tả hai hàng rào có sẵn. Mỗi dòng chứa hai số nguyên \(P_k,Q_k\), nghĩa là hàng rào có sẵn thứ \(k\) nối cọc thứ \(P_k\) và cọc thứ \(Q_k\) (các cọc được đánh số từ \(1\)).
Với mỗi bộ test, in một dòng theo dạng Case #x: y, trong đó \(x\) là số thứ tự bộ test (bắt đầu từ \(1\)), còn \(y\) là số hàng rào lớn nhất có thể thêm vào thiết kế (không tính hai hàng rào có sẵn). Sau đó in thêm \(y\) dòng. Mỗi dòng chứa hai số nguyên phân biệt \(i,j\) (đều từ \(1\) đến \(N\)), biểu diễn một hàng rào riêng nối cọc thứ \(i\) và cọc thứ \(j\). Không có cặp nào trong \(y+2\) hàng rào (gồm cả hàng rào có sẵn và hàng rào bạn thêm) được chồng lấn, ngoại trừ có thể tại đầu mút.
| Phân nhóm | Điểm Google Code Jam | Tỷ lệ điểm của bài |
|---|---|---|
| Phân nhóm 1 | 11/30 | 36,67% |
| Phân nhóm 2 | 19/30 | 63,33% |
Ví dụ 1
2
4
0 0
0 1
1 1
1 0
1 2
3 4
5
0 0
0 1
1 1
1 0
2 3
1 2
3 5
Case #1: 3
1 4
2 3
4 2
Case #2: 6
5 4
2 4
5 2
1 4
4 3
3 2
Google Code Jam 2021, Vòng 3, bài Fence Design.
Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.
Ta có một ma trận gồm các ô vuông với \(R\) hàng và \(C\) cột. Cần vẽ một đường chéo trong mỗi ô. Mỗi ô phải chứa đúng một trong hai đường chéo có thể có: đường chéo xuôi /, nối góc dưới trái với góc trên phải của ô, hoặc đường chéo ngược \, nối góc trên trái với góc dưới phải.
Với mỗi hàng và mỗi cột, ta muốn vẽ một số lượng cụ thể đường chéo của từng loại. Ngoài ra, sau khi vẽ xong, ma trận phải không có hình vuông (square free), nghĩa là không được tồn tại hình vuông nào tạo bởi các đường chéo đã thêm.
Ví dụ, giả sử ma trận có \(4\) hàng và \(4\) cột. Số bên cạnh mỗi hàng là số đường chéo / chính xác phải có trong hàng đó. Số bên dưới mỗi cột là số đường chéo / chính xác phải có trong cột đó.
Có nhiều cách điền ma trận mà vẫn tôn trọng những số lượng theo hàng và cột ấy. Dưới đây là ba khả năng:
Hai ma trận đầu không square free, còn ma trận thứ ba thì có. Trong ma trận đầu tiên, có một hình vuông với cạnh dài bằng \(2\) đường chéo, các đỉnh nằm ở trung điểm bốn cạnh của ma trận. Trong ma trận thứ hai, có một hình vuông cạnh dài bằng \(1\) đường chéo ở góc dưới bên phải. Trong ma trận thứ ba không có hình vuông nào. Vì thế, ma trận thứ ba là một cách vẽ hợp lệ theo mọi quy tắc.
Cho kích thước ma trận và số đường chéo / chính xác phải vẽ trong mỗi hàng và mỗi cột, hãy tạo ra một ma trận square free thỏa các ràng buộc hàng và cột, hoặc thông báo rằng không tồn tại ma trận như vậy.
Dòng đầu tiên chứa số bộ test \(T\). Mỗi bộ test gồm đúng ba dòng. Dòng đầu chứa \(R,C\), là số hàng và số cột của ma trận. Dòng thứ hai chứa \(R\) số nguyên \(S_1,S_2,\ldots,S_R\); \(S_i\) là số đường chéo / chính xác phải vẽ trong hàng thứ \(i\) tính từ trên xuống. Dòng thứ ba chứa \(C\) số nguyên \(D_1,D_2,\ldots,D_C\); \(D_i\) là số đường chéo / chính xác phải vẽ trong cột thứ \(i\) tính từ trái sang.
Với mỗi bộ test, in một dòng theo dạng Case #x: y, trong đó \(x\) là số thứ tự bộ test (bắt đầu từ \(1\)), còn \(y\) là IMPOSSIBLE nếu không có ma trận đã điền nào tuân theo mọi quy tắc, và là POSSIBLE trong trường hợp ngược lại. Nếu in POSSIBLE, hãy in thêm \(R\) dòng, mỗi dòng gồm \(C\) ký tự. Ký tự thứ \(j\) trên dòng thứ \(i\) phải là / nếu ô ở hàng thứ \(i\) từ trên xuống, cột thứ \(j\) từ trái sang trong ma trận đề xuất chứa đường chéo xuôi; nếu không thì phải là \. Ma trận đề xuất phải hợp lệ theo mọi quy tắc.
| Phân nhóm | Điểm Google Code Jam | Tỷ lệ điểm của bài |
|---|---|---|
| Phân nhóm 1 | 7/20 | 35% |
| Phân nhóm 2 | 13/20 | 65% |
Ví dụ 1
4
4 4
3 2 3 3
3 3 2 3
2 3
1 1
1 1 1
2 3
1 2
1 1 1
3 3
2 0 2
2 0 2
Case #1: POSSIBLE
//\/
\/\/
///\
/\//
Case #2: IMPOSSIBLE
Case #3: POSSIBLE
\\/
//\
Case #4: POSSIBLE
/\/
\\\
/\/
Test mẫu #1 chính là ví dụ đã giải thích ở trên.
Trong Test mẫu #2, theo tổng các hàng phải có tổng cộng \(2\) đường chéo /, nhưng theo tổng các cột lại phải có \(3\). Vì thế không thể tuân theo mọi quy tắc.
Trong Test mẫu #3, những ma trận duy nhất tuân theo tổng hàng và cột là ba ma trận sau:
Vì hai ma trận đầu chứa một hình vuông, ma trận thứ ba là output hợp lệ duy nhất cho trường hợp này.
Trong Test mẫu #4, chỉ có một cách điền ma trận thỏa các tổng hàng và cột, như hình dưới. Nó tạo ra đúng một hình chữ nhật, được tô màu xanh trong hình. Tuy nhiên, vì hình chữ nhật ấy không phải hình vuông nên ma trận vẫn square free.
Google Code Jam 2021, Vòng 3, bài Square Free.
Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.