| # | Bài tập | Điểm | Thời gian: | Giới hạn bộ nhớ |
|---|---|---|---|---|
| 1 | Google Code Jam 2022 - Double or One Thing | 25 | 1.0s | 1G |
| 2 | Google Code Jam 2022 - Equal Sum | 100 | 1.0s | 1G |
| 3 | Google Code Jam 2022 - Weightlifting | 44 | 1.0s | 1G |
Bạn được cho một chuỗi gồm các chữ cái tiếng Anh in hoa. Bạn có thể đánh dấu một số lượng tùy ý các chữ cái (có thể là tất cả hoặc không chữ nào). Các chữ cái được đánh dấu không nhất thiết phải liên tiếp. Sau đó, một chuỗi mới được tạo ra bằng cách xử lý các chữ cái từ trái sang phải: chữ cái không được đánh dấu được nối vào chuỗi mới một lần, còn chữ cái được đánh dấu được nối vào hai lần.
Ví dụ, nếu chuỗi ban đầu là HELLOWORLD, bạn có thể đánh dấu H, chữ L đầu tiên và cuối cùng, cùng chữ O cuối cùng để thu được
HHELLLOWOORLLD, tức HHELLLOWOORLLD.
Tương tự, nếu không đánh dấu chữ nào, bạn thu được HELLOWORLD; nếu đánh dấu tất cả các chữ cái, bạn thu được HHEELLLLOOWWOORRLLDD. Lưu ý rằng mỗi lần xuất hiện của cùng một chữ cái có thể được đánh dấu độc lập.
Với một chuỗi cho trước, tùy vào cách chọn các chữ cái để đánh dấu, ta có thể thu được nhiều chuỗi khác nhau. Trong tất cả các chuỗi ấy, hãy in ra chuỗi đứng đầu tiên theo thứ tự bảng chữ cái (còn gọi là thứ tự từ điển).
Lưu ý: Chuỗi \(s\) đứng trước một chuỗi khác \(t\) theo thứ tự bảng chữ cái nếu \(s\) là tiền tố của \(t\), hoặc nếu tại vị trí đầu tiên mà \(s\) và \(t\) khác nhau, chữ cái trong \(s\) đứng trước chữ cái trong \(t\) trong bảng chữ cái. Ví dụ, các chuỗi sau đang ở đúng thứ tự bảng chữ cái: CODE, HELLO, HI, HIM, HOME, JAM.
Dòng đầu tiên chứa số lượng bộ test \(\mathbf{T}\). Tiếp theo là \(\mathbf{T}\) bộ test. Mỗi bộ test được mô tả trên một dòng duy nhất chứa chuỗi \(\mathbf{S}\).
Với mỗi bộ test, in một dòng theo định dạng Case #x: y, trong đó \(x\) là số thứ tự bộ test (bắt đầu từ \(1\)), còn \(y\) là chuỗi đứng đầu tiên theo thứ tự bảng chữ cái trong tập các chuỗi có thể được tạo từ \(\mathbf{S}\) bằng quy trình đã mô tả.
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/25 | 40% |
| Test Set 2 | 15/25 | 60% |
Ví dụ 1
3
PEEL
AAAAAAAAAA
CODEJAMDAY
Case #1: PEEEEL
Case #2: AAAAAAAAAA
Case #3: CCODDEEJAAMDAAY
Trong bộ test mẫu số 1, dưới đây là tất cả các chuỗi có thể thu được, theo thứ tự bảng chữ cái: PEEEEL, PEEEELL, PEEEL, PEEELL, PEEL, PEELL, PPEEEEL, PPEEEELL, PPEEEL, PPEEELL, PPEEL và PPEELL.
Trong bộ test mẫu số 2, mọi chuỗi có thể thu được đều chỉ chứa các chữ A. Chuỗi ngắn nhất đứng đầu tiên theo thứ tự bảng chữ cái vì nó là tiền tố của tất cả các chuỗi còn lại.
Trong bộ test mẫu số 3, có \(1024\) chuỗi có thể được tạo ra từ CODEJAMDAY; trong số đó, CCODDEEJAAMDAAY là chuỗi nhỏ nhất theo thứ tự từ điển.
Google Code Jam 2022, Vòng 1A, bài Double or One Thing.
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 cho một tập các số nguyên phân biệt. Bạn cần chia chúng thành hai tập con không rỗng sao cho mỗi phần tử thuộc đúng một tập con và tổng các phần tử của hai tập con bằng nhau.
Một nguồn tin nặc danh cho biết bài toán trên khó có khả năng được giải trong thời gian đa thức (hoặc đại loại như vậy), nên chúng tôi quyết định thay đổi nó. Bây giờ bạn được quyền quyết định một nửa số nguyên!
Đây là bài tương tác gồm ba giai đoạn. Ở giai đoạn 1, bạn chọn \(\mathbf{N}\) số nguyên phân biệt. Ở giai đoạn 2, bạn nhận thêm \(\mathbf{N}\) số nguyên khác, đôi một phân biệt và cũng khác tất cả các số bạn đã chọn ở giai đoạn 1. Ở giai đoạn 3, bạn phải chia \(2\mathbf{N}\) số nguyên đó thành hai tập con có tổng bằng nhau. Cả \(2\mathbf{N}\) số nguyên đều nằm trong đoạn từ \(1\) đến \(10^9\), kể cả hai đầu, và tổng của chúng được bảo đảm là số chẵn.
Ban đầu, chương trình phải đọc một dòng chứa số nguyên \(\mathbf{T}\), là số lượng bộ test. Sau đó phải xử lý đủ \(\mathbf{T}\) bộ test.
Với mỗi bộ test, trước tiên chương trình phải đọc một dòng chứa số nguyên duy nhất \(\mathbf{N}\).
Sau khi đọc \(\mathbf{N}\), chương trình phải in một dòng chứa \(\mathbf{N}\) số nguyên phân biệt \(A_1,A_2,\ldots,A_\mathbf{N}\). Mỗi số phải nằm trong đoạn \([1,10^9]\).
Sau khi nhận dãy của giám khảo, chương trình phải in một dòng chứa từ \(1\) đến \(2\mathbf{N}-1\) số được chọn từ \(A_1,A_2,\ldots,A_\mathbf{N},\mathbf{B}_1,\mathbf{B}_2,\ldots,\mathbf{B}_\mathbf{N}\). Đây là các số thuộc tập con thứ nhất; những số trong \(A\) và \(\mathbf{B}\) không được in ra được xem là thuộc tập con còn lại.
Đây là bài tương tác. Bạn cần đọc kỹ phần Interactive Problems trong FAQ của Google Code Jam.
Sau khi bạn in dãy \(A\), chương trình phải đọc một dòng chứa thêm \(\mathbf{N}\) số nguyên \(\mathbf{B}_1,\mathbf{B}_2,\ldots,\mathbf{B}_\mathbf{N}\) do giám khảo cung cấp. Cuối cùng, in tập con thứ nhất như đã mô tả ở phần Dữ liệu ra.
Nếu còn bộ test, bộ test tiếp theo bắt đầu ngay lập tức. Nếu đây là bộ test cuối, giám khảo không chờ thêm đầu ra và cũng không gửi thêm đầu vào. Ngoài ra, cả \(\mathbf{T}\) bộ test luôn được xử lý, bất kể đầu ra cuối cùng của chương trình ở các bộ test trước đúng hay sai.
Lưu ý: Có thể chứng minh rằng với các giới hạn của bài toán, tồn tại một dãy \(A_1,A_2,\ldots,A_\mathbf{N}\) sao cho với mọi dãy \(\mathbf{B}_1,\mathbf{B}_2,\ldots,\mathbf{B}_\mathbf{N}\), tập gồm \(2\mathbf{N}\) số nguyên thu được đều có thể chia thành hai tập con có tổng bằng nhau.
Nếu ở bất kỳ thời điểm nào giám khảo nhận được từ chương trình một dòng sai định dạng hoặc không hợp lệ — chẳng hạn in sai số lượng số nguyên, in số ngoài phạm vi, hoặc lặp số nguyên trên một dòng — giám khảo sẽ in duy nhất số \(-1\) và không in thêm gì nữa. Nếu chương trình vẫn tiếp tục chờ giám khảo sau khi nhận \(-1\), chương trình sẽ hết thời gian và nhận lỗi Time Limit Exceeded. Bạn có trách nhiệm kết thúc chương trình kịp thời để nhận Wrong Answer thay vì Time Limit Exceeded. Như thường lệ, nếu vượt giới hạn bộ nhớ hoặc chương trình gặp lỗi khi chạy, bạn sẽ nhận phán quyết tương ứng.
Bạn có thể dùng công cụ kiểm thử chính thức để chạy cục bộ hoặc trên nền tảng của Google Code Jam. Khi kiểm thử cục bộ, cần chạy công cụ song song với chương trình; có thể dùng interactive runner của Google. Hãy đọc hướng dẫn trong phần chú thích của tệp đó và phần Interactive Problems trong FAQ để biết thêm chi tiết.
Hướng dẫn dành cho công cụ kiểm thử nằm trong các chú thích bên trong công cụ. Bạn được khuyến khích bổ sung các bộ test của riêng mình. Mặc dù công cụ được thiết kế để mô phỏng hệ thống chấm, nó không phải hệ thống chấm thật và có thể hành xử khác. Nếu chương trình vượt qua công cụ nhưng thất bại trên giám khảo thật, hãy kiểm tra phần Coding trong FAQ để bảo đảm bạn dùng cùng trình biên dịch với hệ thống chấm.
Tải công cụ kiểm thử chính thức.
Ví dụ tương tác
Giám khảo bắt đầu bằng cách cho biết có 2 bộ test.
Bộ test 1:
3, tức \(\mathbf{N}=3\).5 1 3, nghĩa là bắt đầu với tập \(\{1,3,5\}\).10 4 9, bổ sung để được tập \(\{1,3,4,5,9,10\}\).1 10 5, chọn \(\{1,5,10\}\) làm một tập con. Câu trả lời đúng vì \(1+5+10=16=3+4+9\).Bộ test 2:
3, tức \(\mathbf{N}=3\).5 2 3, nghĩa là bắt đầu với tập \(\{2,3,5\}\).10 8 12, bổ sung để được tập \(\{2,3,5,8,10,12\}\).12 8, chọn \(\{8,12\}\) làm một tập con. Câu trả lời đúng vì \(8+12=20=2+3+5+10\).Trong tương tác mẫu trên, lời giải trả lời đúng mọi bộ test và sẽ nhận phán quyết đúng. Giá trị \(\mathbf{N}\) trong ví dụ không thỏa ràng buộc của Test Set; nó chỉ được dùng để đơn giản hóa ví dụ. Lưu ý rằng ở bộ test đầu tiên, giám khảo có thể đã đưa các số \(\{2,7,100\}\), khiến lời giải trong ví dụ không thể tìm được cách chia hợp lệ thành hai tập con có tổng bằng nhau.
Google Code Jam 2022, Vòng 1A, bài Equal Sum.
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 đang theo một giáo án tập cử tạ định sẵn. Giáo án gồm một chuỗi các bài tập mà bạn phải thực hiện theo đúng thứ tự. Mỗi bài tập yêu cầu đặt một bộ tạ cụ thể lên máy.
Có \(\mathbf{W}\) loại tạ khác nhau. Chẳng hạn, một bài tập có thể cần \(3\) đĩa tạ loại A và \(1\) đĩa tạ loại B, còn bài tập kế tiếp cần mỗi loại A, C và D đúng \(2\) đĩa.
Các đĩa tạ được đặt trên máy thành một chồng. Chính xác hơn, trong một thao tác, bạn có thể thêm một đĩa tạ thuộc loại bất kỳ lên đỉnh chồng, hoặc lấy đĩa tạ hiện nằm trên đỉnh chồng ra.
Bạn có thể chất các đĩa tạ cần cho từng bài tập lên máy theo thứ tự tùy ý. Vì vậy, nếu ở bài tập đầu trong ví dụ trên bạn đặt đĩa loại B ở đáy, bạn sẽ phải lấy hết các đĩa ra trước khi đặt tạ cho bài tập thứ hai. Ngược lại, nếu đặt đĩa loại B ở vị trí thứ ba tính từ đáy, bạn có thể giữ lại hai đĩa loại A ở đáy chồng để dùng trong bộ tạ của bài tập tiếp theo, qua đó tiết kiệm thời gian.
Biết số lượng tạ của từng loại mà mỗi bài tập cần, hãy tìm số thao tác ít nhất để hoàn thành tất cả. Bạn phải thực hiện các bài tập theo thứ tự đã cho. Ban đầu chồng tạ trên máy rỗng, và sau khi hoàn thành mọi bài tập bạn cũng phải để chồng tạ rỗng.
Dòng đầu chứa số lượng bộ test \(\mathbf{T}\). Tiếp theo là \(\mathbf{T}\) bộ test.
Mỗi bộ test bắt đầu bằng một dòng chứa hai số nguyên \(\mathbf{E}\) và \(\mathbf{W}\): số bài tập và số loại tạ. Các loại tạ được đánh số từ \(1\) đến \(\mathbf{W}\).
Tiếp theo là \(\mathbf{E}\) dòng. Dòng thứ \(i\) chứa \(\mathbf{W}\) số nguyên \(\mathbf{X}_{i,1},\mathbf{X}_{i,2},\ldots,\mathbf{X}_{i,\mathbf{W}}\), nghĩa là bài tập thứ \(i\) cần chính xác \(\mathbf{X}_{i,j}\) đĩa tạ loại \(j\).
Với mỗi bộ test, in một dòng theo định dạng Case #x: y, trong đó \(x\) là số thứ tự bộ test (bắt đầu từ \(1\)), còn \(y\) là số thao tác trên chồng tạ của máy ít nhất cần dùng để hoàn thành toàn bộ các bài tập.
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/44 | 29,55% |
| Test Set 2 | 31/44 | 70,45% |
Ví dụ 1
3
3 1
1
2
1
2 3
1 2 1
2 1 2
3 3
3 1 1
3 3 3
2 3 3
Case #1: 4
Case #2: 12
Case #3: 20
Trong bộ test mẫu số 1 chỉ có một loại tạ. Bài tập thứ nhất cần \(1\) đĩa, bài thứ hai cần \(2\) đĩa và bài thứ ba cần \(1\) đĩa. Có thể hoàn thành trong \(4\) thao tác như sau:
Trong bộ test mẫu số 2, một cách hoàn thành các bài tập trong \(12\) thao tác là:
Google Code Jam 2022, Vòng 1A, bài Weightlifting.
Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.