Google Code Jam 2021 - Round 1B

Bộ đề bài

# Bài tập Điểm Thời gian: Giới hạn bộ nhớ
1 Google Code Jam 2021 - Broken Clock 30 1.0s 1G
2 Google Code Jam 2021 - Digit Blocks 100 3.0s 1G
3 Google Code Jam 2021 - Subtransmutation 31 2.0s 1G

1. Google Code Jam 2021 - Broken Clock

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

Emmett tìm thấy một chiếc đồng hồ cũ trên gác mái. Đồng hồ là hình tròn với ba kim gắn ở tâm, quay đều theo chiều kim đồng hồ: kim giờ, kim phút và kim giây. Lúc nửa đêm, cả ba chỉ thẳng lên. Kim giờ quay một vòng trong \(12\) giờ, kim phút trong \(1\) giờ, kim giây trong \(1\) phút. Một giờ bằng \(60\) phút, một phút bằng \(60\) giây, một giây bằng \(10^9\) nanosecond.

Ví dụ, đồng hồ dưới đây chỉ đúng \(6\) giờ \(30\) phút sau nửa đêm. Kim giờ ngắn màu đen ở giữa \(6\)\(7\) (\(6{,}5/12\) vòng); kim phút dài màu đen chỉ xuống vì đã quay đúng \(6{,}5\) vòng; kim giây đỏ chỉ lên vì đã quay số vòng nguyên.

Không may, các kim bị hỏng và trông hoàn toàn giống nhau, nên không biết kim nào là kim nào:

Ngoài ra, không còn dấu mốc để biết hướng nào là trên; mọi phép quay của mặt đồng hồ đều có thể đúng (chỉ quay, không phản chiếu):

Emmett biết thời điểm nhỏ hơn nghiêm ngặt \(12\) giờ sau nửa đêm và đã chụp ảnh. Từ ba góc kim so với một trục tùy ý, hãy tìm một thời điểm phù hợp. Trong một số nhóm, Emmett đã tìm được hướng khả dĩ hoặc thu hẹp thời điểm tới giây nguyên; xem ràng buộc.

Dữ liệu vào

Dòng đầu chứa \(T\). Mỗi dòng tiếp theo chứa ba số nguyên đã sắp \(A,B,C\): góc ba kim so với trục tùy ý, đo theo chiều kim đồng hồ bằng tick. Một tick bằng \(\frac1{12}\cdot10^{-10}\) độ. Vì vậy mỗi nanosecond, kim giờ, phút, giây quay lần lượt \(1,12,720\) tick.

Dữ liệu ra

Với mỗi bộ, in Case #x: h m s n: \(h\) là số giờ trọn từ nửa đêm (\(0..11\)), \(m\) là phút trọn từ giờ gần nhất (\(0..59\)), \(s\) là giây trọn từ phút gần nhất (\(0..59\)), \(n\) là nanosecond trọn từ giây gần nhất (\(0..10^9-1\)).

Ràng buộc

  • \(1\le T\le100\).
  • \(0\le A\le B\le C<360\cdot12\cdot10^{10}\).

Phân nhóm

  • Test Set 1 (Visible Verdict): tồn tại thời điểm \(t\) phù hợp, \(t\) là số giây nguyên sau nửa đêm và có thể đọc mà không quay đồng hồ.
  • Test Set 2 (Visible Verdict): tồn tại thời điểm phù hợp là số giây nguyên sau nửa đêm.
  • Test Set 3 (Visible Verdict): tồn tại thời điểm phù hợp là số nanosecond nguyên sau nửa đêm.

Đ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/30 16,67%
Test Set 2 6/30 20%
Test Set 3 19/30 63,33%

Ví dụ

Ví dụ 1

Input
3
0 0 0
0 21600000000000 23400000000000
1476000000000 2160000000000 3723000000000
Output
Case #1: 0 0 0 0
Case #2: 6 30 0 0
Case #3: 1 2 3 0
Giải thích

Mẫu #1 có mọi kim chỉ lên, chỉ xảy ra đúng lúc nửa đêm.


Mẫu #2 là hình trong đề, với góc \(0,180,195\) độ, phù hợp \(6\)h\(30\)m mà không quay. Tuy nhiên \(0\)h\(30\)m cũng cho hình giống vậy sau khi quay \(180\) độ; ngay cả Test Set 1 cũng chấp nhận đáp án này vì điều kiện chỉ bảo đảm tồn tại một cách không quay, không cấm đáp án cần quay.

Ở mẫu #3, đầu vào là hình thứ nhất và đáp án tương ứng cách diễn giải ở hình thứ hai.


Ví dụ bổ sung — Test Set 2

??? "Giải thích"
    Các trường hợp là ba mẫu trước, nhưng mặt đồng hồ quay theo chiều kim đồng hồ lần lượt $45$, $90$, $180$ độ. Ví dụ không chạy trên lời giải nộp.

    ```sample
    3
    5400000000000 5400000000000 5400000000000
    10800000000000 32400000000000 34200000000000
    23076000000000 23760000000000 25323000000000
    ```
    ```sample
    Case #1: 0 0 0 0
    Case #2: 0 30 0 0
    Case #3: 1 2 3 0
    ```

    ![Nửa đêm quay 45 độ](https://cdn.lqdoj.edu.vn/media/pagedown-uploads/pd_1_be322950.png)
    Trường hợp 6:30 quay 90 độ đã được minh họa ở phần giải thích phía trên.
    ![1:02:03 quay 180 độ](https://cdn.lqdoj.edu.vn/media/pagedown-uploads/pd_1_411b81b6.png)

    #### Ví dụ bổ sung — Test Set 3

    ```sample
    1
    0 11 719
    ```
    ```sample
    Case #1: 0 0 0 1
    ```

    Một nanosecond sau nửa đêm, các kim dịch $1,12,720$ tick. Quay đồng hồ ngược chiều kim đồng hồ $1$ tick cho đúng ba góc đầu vào.

Nguồn

Google Code Jam 2021, Vòng 1B, bài Broken Clock.

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 - Digit Blocks

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

Digit Blocks

Bạn sẽ xây \(N\) tháp, mỗi tháp gồm \(B\) khối lập phương, mỗi lần đặt một khối. Tháp được xây từ dưới lên: khối thứ \(i\) đặt vào một tháp sẽ là khối thứ \(i\) tính từ đáy. Bạn phải chọn vị trí cho mỗi khối trước khi thấy các khối sắp tới; đã đặt thì không được di chuyển.

Mỗi khối in một chữ số thập phân, các mặt chữ số cùng hướng ra trước. Phông chữ không cho phép xoay để đổi chữ số; chẳng hạn không thể xoay \(6\) thành \(9\).

Ví dụ, \(N=B=3\) và trạng thái hiện tại ở Hình 1. Nếu khối \(6\) xuất hiện, có thể đặt lên tháp đang có hai khối (Hình 2) hoặc bắt đầu tháp thứ ba (Hình 3); không thể đặt lên tháp đầu vì nó đã đủ \(B\) khối.



Khi xây xong, đọc số \(B\) chữ số trên mỗi tháp từ trên xuống; khối đặt cuối là chữ số có nghĩa lớn nhất. Các số có thể có tùy ý số \(0\) ở đầu. Cộng \(N\) số để được điểm. Ở Hình 4, ba số là \(123,345,96\), điểm \(123+345+96=564\).

Chữ số mỗi khối được sinh đều ngẫu nhiên, độc lập với mọi thông tin khác. Tổng điểm trên \(T\) bộ phải ít nhất \(P\).

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; hãy bảo đảm bạn đã đọc hướng dẫn chung dành cho bài tương tác. Ban đầu bộ chấm gửi một dòng chứa \(T,N,B,P\), lần lượt là số bộ test, số tháp, số khối trong mỗi tháp và tổng điểm tối thiểu cần đạt để vượt phân nhóm. Sau đó mỗi bộ gồm \(NB\) lượt trao đổi, mỗi lượt tương ứng với việc đặt một khối. Trước tiên bộ chấm in một dòng chứa chữ số \(D\) trên khối cần đặt; chương trình trả một dòng chứa số \(i\in[1,N]\), là tháp nhận khối.

Sau lượt cuối của mỗi bộ trừ bộ cuối, bộ chấm lập tức bắt đầu bộ kế. Sau lượt cuối của bộ cuối, nó in 1 nếu tổng điểm ít nhất \(P\), -1 nếu không.

Dữ liệu ra

Trong mỗi lượt, in số hiệu một tháp chưa đủ \(B\) khối và xả bộ đệm. Nếu dòng sai định dạng, số hiệu tháp ngoài phạm vi hoặc tháp đã đủ \(B\) khối, bộ chấm in -1 rồi không xuất thêm gì. Sau bất kỳ -1 nào vì những lý do trên, chương trình phải tự thoát kịp thời; nếu tiếp tục chờ bộ chấm, chương trình sẽ bị treo thay vì nhận phán quyết cho đáp án sai. Các lỗi chạy chương trình khác vẫn nhận phán quyết tương ứng.

Mỗi chữ số được sinh đều, độc lập theo từng khối, từng bộ và từng lượt nộp. Vì vậy, ngay cả hai lượt nộp cùng mã nguồn cũng có thể nhận các chữ số khác nhau.

Ràng buộc

  • \(T=50\), \(N=20\), \(B=15\); \(D\in[0,9]\).

Phân nhóm

  • Test Set 1 (Visible Verdict): \(P=860939810732536850\approx8{,}6\cdot10^{17}\). Ngưỡng xấp xỉ \(90\%\) của \(T\cdot S\), trong đó \(S=19131995794056374{,}42\ldots\approx1{,}9\cdot10^{16}\) là điểm kỳ vọng cao nhất có thể trên một bộ nếu thời gian không giới hạn. Giá trị chính xác của \(S\) nằm ở dòng 13–14 của công cụ kiểm thử gốc.
  • Test Set 2 (Visible Verdict): \(P=937467793908762347\approx9{,}37\cdot10^{17}\), xấp xỉ \(98\%\) của \(T\cdot S\).

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ộ hoặc trên nền tảng gốc. 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ụ và hướng dẫn chung cho bài tương tác. Bạn được khuyến khích tự thêm bộ test. Công cụ không phải bộ chấm thật và có thể hành xử khác; nếu mã vượt công cụ nhưng không vượt hệ thống gốc, tài liệu chính thức còn yêu cầu kiểm tra rằng trình biên dịch đang dùng giống với trình biên dịch của hệ thống. Bản LQDOJ dùng interactor đi kèm gói bài.

Ví dụ

Ví dụ tương tác

Ví dụ có \(T=2,N=3,B=3,P=1500\):

Bộ chấm Chương trình Diễn giải
2 3 3 1500 Cung cấp tham số; bắt đầu bộ 1.
3 Khối ghi \(3\).
1 Đặt vào tháp 1.
2 Khối ghi \(2\).
1 Đặt vào tháp 1.
5 2 Đặt \(5\) vào tháp 2.
4 2 Đặt \(4\) vào tháp 2.
1 1 Đặt \(1\) vào tháp 1; đây là Hình 1.
6 3 Đặt \(6\) vào tháp 3.
3 2 Đặt \(3\) vào tháp 2.
9 3 Đặt \(9\) vào tháp 3.
0 3 Đặt \(0\) vào tháp 3; đạt Hình 4, tổng \(564\).
7 3 Khối đầu tiên bộ 2 đặt vào tháp 3.
... ... Bỏ qua 7 lượt trao đổi.
8 2 Khối cuối bộ 2 đặt vào tháp 2; tổng bộ 2 là \(1285\).
1 Tổng hai bộ \(1849\ge1500\), bộ chấm xác nhận.

Nguồn

Google Code Jam 2021, Vòng 1B, bài Digit Blocks.

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 - Subtransmutation

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

Là nhà giả kim giỏi nhất đất nước, bạn lại được triệu tập vì nhà lãnh đạo ngày càng tham lam các kim loại hiếm và cần đến sức mạnh vượt ngoài khoa học.

Mỗi kim loại được biểu diễn bởi một số nguyên dương. Bạn cần tạo \(U_1\) đơn vị kim loại \(1\), \(U_2\) đơn vị kim loại \(2\), ..., \(U_N\) đơn vị kim loại \(N\). Các kim loại \(N+1,N+2,\ldots\) vẫn tồn tại nhưng không có số lượng bắt buộc. Bạn có thể tạo dư bất kỳ kim loại nào rồi loại bỏ phần dư.

Do cắt giảm ngân sách, bạn chỉ còn một phép giả kim đơn giản. Với hai số cố định \(A<B\), có thể phá hủy một đơn vị kim loại \(i\) để tạo một đơn vị kim loại \(i-A\) và một đơn vị kim loại \(i-B\). Nếu một chỉ số không dương thì đơn vị tương ứng không được tạo. Cụ thể, nếu \(i\le A\), phép thuật chỉ phá hủy mà không tạo gì; nếu \(A<i\le B\), nó chỉ tạo một đơn vị kim loại \(i-A\).

Một thợ mỏ chuyên gia có thể mang về đúng một đơn vị của bất kỳ kim loại nào bạn yêu cầu. Từ đó, bạn dùng phép thuật lên kim loại ban đầu và các sản phẩm về sau để tạo thêm đơn vị. Hình dưới minh họa một đơn vị kim loại \(4\) tạo thành một đơn vị kim loại \(1\) và hai đơn vị kim loại \(2\) bằng hai phép thuật với \(A=1,B=2\).

Kim loại có chỉ số lớn nặng hơn và khó xử lý hơn. Hãy tìm chỉ số nhỏ nhất của một kim loại mà chỉ một đơn vị của nó đủ hoàn thành nhiệm vụ, hoặc cho biết không có kim loại như vậy.

Dữ liệu vào

Dòng đầu chứa số bộ dữ liệu \(T\). Mỗi bộ gồm hai dòng. Dòng đầu chứa \(N,A,B\): chỉ số kim loại lớn nhất bắt buộc tạo và hai tham số phép thuật. Dòng thứ hai chứa \(N\) số \(U_1,\ldots,U_N\), là số đơn vị yêu cầu của từng kim loại.

Dữ liệu ra

Với mỗi bộ dữ liệu, in Case #x: y. Nếu không thể tạo đủ từ một đơn vị duy nhất, \(y\)IMPOSSIBLE; nếu có thể, \(y\) là chỉ số nhỏ nhất của kim loại khởi đầu đủ dùng.

Ràng buộc

  • \(1\le T\le100\); \(1\le N\le20\).
  • \(0\le U_i\le20\) với mọi \(i\); \(U_N\ge1\).
  • \(2\le U_1+\cdots+U_N\).

Phân nhóm

  • Test Set 1 (Visible Verdict): \(A=1,B=2\).
  • Test Set 2 (Hidden Verdict): \(1\le A<B\le20\).

Đ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 13/31 41,94%
Test Set 2 18/31 58,06%

Ví dụ

Ví dụ 1

Input
3
2 1 2
1 2
5 1 2
2 0 0 0 1
3 1 2
1 1 1
Output
Case #1: 4
Case #2: 6
Case #3: 5
Giải thích
  • Mẫu #1 cần một kim loại \(1\) và hai kim loại \(2\). Bắt đầu từ \(3\) chỉ tạo được một \(1\) và một \(2\), không thể có thêm \(2\); \(1\) hoặc \(2\) cũng không đủ. Một kim loại \(4\) đủ như hình trong đề.
  • Mẫu #2 có thể bắt đầu từ \(6\): \(\{6\}\to\{4,5\}\to\{2,3,5\}\to\{1,3,5\}\to\{1,1,2,5\}\), lần lượt dùng phép thuật lên \(6,4,2,3\). Đơn vị kim loại \(2\) dư vẫn hợp lệ.
  • Mẫu #3 bắt đầu từ \(5\): \(\{5\}\to\{3,4\}\to\{2,3,3\}\to\{1,3,3\}\to\{1,1,2,3\}\), lần lượt dùng phép thuật lên \(5,4,2,3\). Có các chuỗi phép khác nhưng đều cần kim loại đầu ít nhất \(5\).

Ví dụ bổ sung — Test Set 2

??? "Giải thích"
    Ví dụ này thỏa Test Set 2 nhưng không được chạy trên lời giải nộp.

    !!! question "Ví dụ 2"
        ???+ "Input"
            ```sample
            3
            3 2 4
            1 1 1
            3 2 4
            1 0 1
            5 2 5
            1 0 0 0 1
            ```
        ???+ success "Output"
            ```sample
            Case #1: IMPOSSIBLE
            Case #2: 5
            Case #3: 10
            ```
        ??? "Giải thích"
            Với bộ đầu, không thể bắt đầu từ một đơn vị kim loại bất kỳ, lặp phép thuật $A=2,B=4$, rồi còn lại một đơn vị của mỗi kim loại $1,2,3$.

Nguồn

Google Code Jam 2021, Vòng 1B, bài Subtransmutation.

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