| # | 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 |
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\) và \(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ò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.
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\)).
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ụ 1
3
0 0 0
0 21600000000000 23400000000000
1476000000000 2160000000000 3723000000000
Case #1: 0 0 0 0
Case #2: 6 30 0 0
Case #3: 1 2 3 0
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.
??? "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
```

Trường hợp 6:30 quay 90 độ đã được minh họa ở phần giải thích phía trên.

#### 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.
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.
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\).
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; 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.
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.
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ụ 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. |
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.
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ò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.
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\) là IMPOSSIBLE; nếu có thể, \(y\) là chỉ số nhỏ nhất của kim loại khởi đầu đủ dùng.
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ụ 1
3
2 1 2
1 2
5 1 2
2 0 0 0 1
3 1 2
1 1 1
Case #1: 4
Case #2: 6
Case #3: 5
??? "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$.
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.