| # | Bài tập | Điểm | Thời gian: | Giới hạn bộ nhớ |
|---|---|---|---|---|
| 1 | Google Code Jam 2018 - Mysterious Road Signs | 30 | 1.0s | 1G |
| 2 | Google Code Jam 2018 - Rounding Error | 25 | 1.0s | 1G |
| 3 | Google Code Jam 2018 - Transmutation | 45 | 1.0s | 1G |
Thị trấn Signfield nằm trên một con đường thẳng hoàn hảo và dài vô hạn chạy từ tây sang đông. Dọc theo con đường có một dãy \(S\) biển báo bí ẩn với các con số ở cả hai mặt. Biển thứ \(i\) (được đánh số theo thứ tự từ tây sang đông) nằm tại một điểm cách Signfield \(D_i\) kilômét về phía đông, có số \(A_i\) ở mặt quay về phía tây và số \(B_i\) ở mặt quay về phía đông.
Không ai ở Signfield biết những biển báo này muốn nói gì. Bạn cho rằng các số ở mặt phía tây dành cho tài xế đi về hướng đông và biểu thị khoảng cách đến một địa điểm cụ thể nào đó. Tương tự, bạn cho rằng các số ở mặt phía đông dành cho tài xế đi về hướng tây và biểu thị khoảng cách đến một địa điểm cụ thể nào đó. Tuy nhiên, bạn nghi ngờ rằng không phải tất cả biển báo đều nhất quán với giả thuyết này.
Để bắt đầu kiểm chứng giả thuyết, bạn muốn tìm các tập biển báo hợp lệ tuân theo những quy tắc sau:
Số biển lớn nhất có thể có trong một tập hợp lệ như mô tả ở trên là bao nhiêu, và có bao nhiêu tập hợp lệ khác nhau có kích thước đó?
Dòng đầu tiên chứa số lượng bộ test \(T\). Tiếp theo là \(T\) bộ test. Mỗi bộ bắt đầu bằng một dòng chứa số nguyên \(S\): số biển báo. Sau đó có thêm \(S\) dòng. Dòng thứ \(i\) mô tả biển thứ \(i\) (theo thứ tự từ tây sang đông) và chứa ba số nguyên \(D_i\), \(A_i\), \(B_i\): khoảng cách của biển về phía đông Signfield (tính bằng kilômét), số trên mặt phía tây và số trên mặt phía đông.
Với mỗi bộ test, in một dòng Case #x: y z, trong đó x là số thứ tự bộ test (bắt đầu từ 1), còn y và z lần lượt là số biển lớn nhất có thể có trong một tập hợp lệ và số tập hợp lệ có kích thước đó, như mô tả trong đề bài.
Test Set 1 (Hiển thị): \(1\le S\le100\) trong mọi bộ test.
Test Set 2 (Ẩn): \(1\le S\le100\) trong tất cả trừ 3 bộ test; trong 3 bộ test còn lại, \(S=10^5\).
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/30 | 33,33% |
| Test Set 2 | 20/30 | 66,67% |
Ví dụ 1
3
1
1 1 1
5
2 7 12
6 3 11
8 10 1
11 11 12
13 9 14
5
1 3 3
2 2 2
3 1 1
4 2 2
5 3 3
Case #1: 1 1
Case #2: 3 2
Case #3: 5 1
Trong Ví dụ #1, chỉ có một biển báo. Nếu chọn riêng biển đó làm tập, có nhiều giá trị \(M\) và \(N\) có thể dùng được, chẳng hạn:
Vì vậy, tập chỉ gồm một biển đó là hợp lệ. Đây là tập duy nhất có độ dài ấy, nên đáp án là 1 1.
Trong Ví dụ #2, lưu ý rằng biển thứ nhất, thứ hai, thứ tư và thứ năm sẽ nhất quán với \(M=9\) và \(N=-1\), nhưng chúng không tạo thành một dãy con liên tiếp. (Số 1 ở mặt sau của biển thứ ba không thể được dùng như thể nó nằm ở mặt trước.) Thực tế không có tập hợp lệ nào gồm bốn biển. Có hai tập hợp lệ khác nhau gồm ba biển. Lưu ý rằng mặc dù có hai cặp \(M/N\) khác nhau khiến tập ba biển thứ hai hợp lệ, tập đó chỉ được tính một lần:
Trong Ví dụ #3, toàn bộ dãy là một tập hợp lệ với \(M=4\) và \(N=2\).
Google Code Jam 2018, Vòng 1B, bài Mysterious Road Signs.
Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.
Để giải quyết dứt điểm câu hỏi muôn thuở rằng ngôn ngữ lập trình nào là tốt nhất, bạn hỏi tổng cộng \(N\) người về ngôn ngữ yêu thích của họ. Đây là câu hỏi mở: mỗi người được tự do nêu bất kỳ ngôn ngữ nào, và trên thế giới có vô hạn ngôn ngữ.
Một số người đã trả lời, và bạn đã tổng hợp thông tin thành một danh sách số lượng. Chẳng hạn, 1 2 có nghĩa là cho đến lúc này bạn đã hỏi 3 người: một người chọn một ngôn ngữ nào đó, còn hai người kia chọn một ngôn ngữ khác.
Bạn định công bố kết quả dưới dạng bảng liệt kê từng ngôn ngữ và tỷ lệ phần trăm số người chọn nó. Mỗi tỷ lệ được làm tròn tới số nguyên gần nhất; nếu phần thập phân lớn hơn hoặc bằng 0,5 thì làm tròn lên. Ví dụ, 12,5% được làm tròn thành 13%, 99,5% thành 100%, còn 12,4999% thành 12%.
Trong những khảo sát như vậy, đôi khi tổng các tỷ lệ đã làm tròn không đúng bằng 100. Sau khi bạn khảo sát xong những người còn lại, tổng lớn nhất có thể của các tỷ lệ đã làm tròn là bao nhiêu?
Dòng đầu chứa số bộ test \(T\).
Mỗi bộ test gồm hai dòng. Dòng đầu chứa hai số nguyên \(N\) và \(L\): tổng số người trong khảo sát và số ngôn ngữ khác nhau đã xuất hiện trong câu trả lời của những người đã trả lời. Dòng thứ hai chứa \(L\) số nguyên \(C_i\); số thứ \(i\) là số người đã chọn ngôn ngữ thứ \(i\) trong số các ngôn ngữ đã xuất hiện.
Với mỗi bộ test, in một dòng có dạng Case #x: y, trong đó \(x\) là số thứ tự bộ test, bắt đầu từ 1, và \(y\) là tổng lớn nhất có thể của các tỷ lệ phần trăm đã làm tròn như mô tả trê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 | 5/25 | 20% |
| Test Set 2 | 9/25 | 36% |
| Test Set 3 | 11/25 | 44% |
Ví dụ 1
4
3 2
1 1
10 3
1 3 2
6 2
3 1
9 8
1 1 1 1 1 1 1 1
Case #1: 100
Case #2: 100
Case #3: 101
Case #4: 99
Trong test mẫu 1, hai người đã trả lời chọn hai ngôn ngữ khác nhau và còn một người chưa trả lời. Nếu người đó chọn ngôn ngữ thứ ba, tổng là \(33+33+33=99\). Nếu họ chọn một ngôn ngữ đã có, tổng là \(67+33=100\), nên đáp án lớn nhất là 100.
Trong test mẫu 2, bất kể bốn người còn lại chọn gì, mọi tỷ lệ đều là bội số chính xác của 10, không cần làm tròn, và tổng luôn bằng 100.
Trong test mẫu 3, một kịch bản tối ưu là mỗi người trong hai người còn lại chọn một ngôn ngữ chưa từng được chọn; tổng khi đó là \(50+17+17+17=101\).
Trong test mẫu 4, dù người còn lại có chọn một ngôn ngữ đã xuất hiện hay không, tổng các tỷ lệ đã làm tròn vẫn là 99.
Google Code Jam 2018, Vòng 1B, bài Rounding Error.
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 là nhà giả kim tài giỏi nhất của một đất nước coi những kim loại như vàng, bạch kim và bạc là tẻ nhạt, nhưng lại đặc biệt quý trọng chì. Thế giới biết đến \(M\) kim loại; chì là kim loại số 1 trong bảng tuần hoàn của bạn. Nhà lãnh đạo yêu cầu bạn dùng số kim loại trong kho bạc để tạo ra nhiều chì nhất có thể.
Với mỗi kim loại, kể cả chì, bạn biết đúng một công thức tạo một gram kim loại đó bằng cách phá hủy một gram của mỗi loại trong hai kim loại nguyên liệu. Nếu thắc mắc về định luật bảo toàn khối lượng, gram còn lại bị mất vào các phế phẩm vô dụng. Công thức không hoạt động với phần lẻ của một gram. Tuy nhiên, bạn có thể dùng mỗi công thức bao nhiêu lần tùy ý, hoặc không dùng lần nào, miễn là mỗi lần đều có đủ nguyên liệu.
Nếu lựa chọn tối ưu, tổng lượng chì lớn nhất mà bạn có thể thu được là bao nhiêu? Lưu ý rằng sau khi hoàn tất, một số kim loại khác chì có thể vẫn còn dư.
Dòng đầu chứa số bộ test \(T\).
Mỗi bộ test bắt đầu bằng một dòng chứa số nguyên \(M\), số kim loại được biết đến. Tiếp theo là \(M\) dòng, mỗi dòng chứa hai số nguyên \(R_{i1}\) và \(R_{i2}\); dòng thứ \(i\) cho biết có thể tạo một gram kim loại \(i\) bằng cách phá hủy một gram kim loại \(R_{i1}\) và một gram kim loại \(R_{i2}\). Cuối cùng là một dòng chứa \(M\) số nguyên \(G_1,G_2,\ldots,G_M\), trong đó \(G_i\) là số gram kim loại \(i\) trong kho bạc. Chì là kim loại 1.
Với mỗi bộ test, in Case #x: y, trong đó \(x\) là số thứ tự bộ test, bắt đầu từ 1, và \(y\) là lượng chì lớn nhất, tính bằng gram, mà bạn có thể thu đượ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 | 15/45 | 33,33% |
| Test Set 2 | 18/45 | 40% |
| Test Set 3 | 12/45 | 26,67% |
Ví dụ 1
3
3
2 3
1 3
1 2
5 2 3
5
3 4
3 4
4 5
3 5
1 3
0 8 6 2 4
4
3 4
2 3
2 3
2 3
0 1 1 0
Case #1: 7
Case #2: 4
Case #3: 0
Trong test mẫu 1, chiến lược tối ưu dùng 2 gram kim loại 2 và 2 gram kim loại 3 để tạo thêm 2 gram chì, cho tổng cộng 7 gram chì.
Trong test mẫu 2, trước hết dùng 2 gram kim loại 3 và 2 gram kim loại 5 để tạo 2 gram kim loại 4; sau đó dùng 4 gram kim loại 3 và 4 gram kim loại 4 để tạo 4 gram chì. Hai công thức có thể có cùng cặp nguyên liệu, chỉ khác kỹ thuật giả kim. Không phải kim loại nào cũng nhất thiết là nguyên liệu của công thức khác; ở đây kim loại 2 không bao giờ là nguyên liệu.
Test mẫu 3 cho thấy một kim loại có thể được dùng để tạo ra chính nó. Dù luật giả kim đôi khi kỳ quặc, trường hợp này vẫn không thể tạo ra chì. Vì công thức chỉ hoạt động với từng gram nguyên, ta không thể dùng 0,5 gram của kim loại 2 và 3 để tạo 0,5 gram kim loại 4, rồi dùng 0,5 gram kim loại 3 và 4 để tạo 0,5 gram chì.
Google Code Jam 2018, Vòng 1B, bài Transmutation.
Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.