| # | Bài tập | Điểm | Thời gian: | Giới hạn bộ nhớ |
|---|---|---|---|---|
| 1 | Google Code Jam 2010 - Candy Store | 27 | 1.0s | 1G |
| 2 | Google Code Jam 2010 - City Tour | 27 | 2.5s | 1G |
| 3 | Google Code Jam 2010 - Letter Stamper | 27 | 19.5s | 1G |
| 4 | Google Code Jam 2010 - Ninjutsu | 34 | 1.5s | 1G |
| 5 | Google Code Jam 2010 - The Paths of Yin Yang | 52 | 20.0s | 1G |
| 6 | Google Code Jam 2010 - Travel Plan | 33 | 10.0s | 1G |
Việc sở hữu một cửa hàng kẹo thật khó khăn! Bạn phải tối ưu hóa đủ mọi thứ. Gần đây, bạn đang bán một loại kẹo rất phổ biến gọi là Whizboppers. Những loại kẹo này rất nhanh hỏng, dẫn đến các đặc điểm sau:
Bạn có thể đặt hàng Whizboppers từ nhà cung cấp theo các hộp chứa bất kỳ số nguyên gam kẹo nào.
Mỗi ngày có tối đa \(k\) người đến cửa hàng của bạn, và bắt đầu từ người đầu tiên, họ sẽ chọn một số nguyên xu để chi cho Whizboppers: trong khoảng từ 1 đến \(C\) xu (bao gồm cả hai đầu). Bạn sẽ bán Whizboppers với giá 1 xu mỗi gam; vì vậy nếu một người muốn chi 4 xu, bạn sẽ đưa cho người đó đúng 4 gam kẹo. Bạn có thể thực hiện việc này bằng cách đưa cho họ một hộp 4 gam, hoặc có thể là một hộp 2 gam và hai hộp 1 gam.
Số lượng hộp tối thiểu bạn cần đặt hàng là bao nhiêu để bất kể mỗi người đặt mua bao nhiêu, bạn luôn có thể đưa cho tất cả mọi người khối lượng Whizboppers mà họ muốn?
Lưu ý: Khi một người chọn mua bao nhiêu kẹo, bạn biết những người khác đã mua gì trước đó, nhưng bạn không biết những người tiếp theo sẽ mua gì.
Ví dụ, nếu có tối đa 2 người đến cửa hàng mỗi ngày và mỗi người chi tối đa 2 xu (\(k=2, C=2\)), bạn có thể mua bốn hộp 1 gam từ nhà cung cấp. Nhưng bạn có thể làm tốt hơn: nếu bạn mua hai hộp 1 gam và một hộp 2 gam, bạn có thể làm hài lòng khách hàng của mình. Đây là cách thực hiện:
First Person Boxes given Second Person Boxes given
--------------------------------------------------------
2 cents 1 x 2-gram 2 cents 2 x 1-gram
1 cent 1 x 1-gram
-----------------------------------------------------
1 cent 1 x 1-gram 2 cents 1 x 2-gram
1 cent 1 x 1-gram
Bất kể người đầu tiên đặt hàng bao nhiêu, bạn có thể đưa ra các hộp sao cho người thứ hai vẫn có thể nhận được đúng lượng kẹo cần thiết. Vì vậy, với \(k=2, C=2\), bạn có thể phục vụ bất kỳ chuỗi đơn hàng nào với 3 hộp.
Dòng đầu tiên của đầu vào cho biết số lượng bộ thử nghiệm, \(T\). \(T\) dòng tiếp theo, mỗi dòng chứa hai số nguyên: \(k\) và \(C\), số lượng người tối đa và số xu tối đa mỗi người có thể chi tiêu.
Đối với mỗi bộ thử nghiệm, hãy xuất một dòng chứa "Case #x: y", trong đó x là số thứ tự bộ thử nghiệm (bắt đầu từ 1) và y là số lượng hộp tối thiểu bạn cần đặt hàng mỗi ngày.
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 | 7/27 | 25,93% |
| Test Set 2 | 20/27 | 74,07% |
Ví dụ 1
4
1 5
2 2
10 3
2 50
Case #1: 3
Case #2: 3
Case #3: 19
Case #4: 11
Trong trường hợp đầu tiên, bạn có thể mua một hộp 1 gam và hai hộp 2 gam. Trong trường hợp thứ hai, bạn có thể mua hai hộp 1 gam và một hộp 2 gam.
Google Code Jam 2010, Chung kết thế giới, bài Candy Store.
Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.
Vào mùa hè, các thành phố cổ ở Châu Âu nườm nượp khách du lịch đi dạo trên các con phố và tham quan các địa điểm nổi tiếng.
Nhiều thành phố cổ được xây dựng một cách tự nhiên chứ không theo một kế hoạch kiến trúc nào, nhưng kỳ lạ thay, sự phát triển của chúng lại thể hiện một quy luật tương tự: các thành phố bắt đầu từ ba địa điểm tham quan ban đầu, với mỗi cặp địa điểm được kết nối bởi một con phố hai chiều; sau đó, dần dần, các địa điểm tham quan mới được thêm vào. Bất kỳ địa điểm tham quan mới nào cũng được kết nối bằng hai con phố hai chiều mới với hai địa điểm tham quan khác nhau đã có trước đó và hai địa điểm này vốn đã được kết nối trực tiếp bởi một con phố.
Một du khách đến thăm thành phố như vậy muốn thực hiện một chuyến tham quan đi qua càng nhiều địa điểm tham quan càng tốt. Chuyến tham quan có thể bắt đầu tại bất kỳ địa điểm nào và phải kết thúc tại chính địa điểm đó. Chuyến tham quan có thể đi qua mỗi con phố tối đa một lần và mỗi địa điểm tham quan tối đa một lần (ngoại trừ địa điểm xuất phát được đi qua đúng hai lần).
Bạn được cho mô tả về cách thành phố đã phát triển. Hãy tìm số lượng địa điểm tham quan khác nhau lớn nhất mà một chuyến tham quan có thể đi qua trong thành phố này.
Dòng đầu tiên của tệp dữ liệu vào chứa số lượng bộ test, T. Tiếp theo là T bộ test.
Mỗi bộ test bắt đầu bằng số nguyên N - tổng số địa điểm tham quan trong thành phố. Các địa điểm được ký hiệu bằng các số từ 1 đến N; các số 1, 2 và 3 ký hiệu cho ba địa điểm ban đầu khi thành phố bắt đầu hình thành, trong khi các số 4, ..., N ký hiệu cho các địa điểm khác theo thứ tự chúng được thêm vào thành phố.
N-3 dòng tiếp theo, mỗi dòng chứa một cặp số nguyên cách nhau bởi dấu cách A, B, cho biết địa điểm tham quan tương ứng được kết nối bằng các con phố tới các địa điểm A và B. Dòng đầu tiên trong số này tương ứng với địa điểm số 4, dòng thứ hai tương ứng với địa điểm số 5, v.v.
Với mỗi bộ test, hãy xuất một dòng chứa "Case #x: y", trong đó x là số thứ tự bộ test (bắt đầu từ 1) và y là số lượng địa điểm tham quan lớn nhất mà một chuyến tham quan có thể thực hiện trong thành phố này.
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 | 4/27 | 14,81% |
| Test Set 2 | 23/27 | 85,19% |
Ví dụ 1
2
5
1 2
2 1
6
1 2
1 4
4 5
Case #1: 4
Case #2: 6
Google Code Jam 2010, Chung kết thế giới, bài City Tour.
Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.
Roland là một giáo viên toán trung học. Mỗi ngày, ông nhận được hàng trăm bài kiểm tra từ học sinh của mình. Với mỗi bài, ông cẩn thận chọn một điểm chữ cái: 'A', 'B' hoặc 'C'. (Học sinh của Roland quá thông minh để nhận các điểm thấp hơn như 'D' hay 'F'). Sau khi các điểm số đã được quyết định, Roland chuyển các bài kiểm tra cho trợ lý của mình - chính là bạn. Công việc của bạn là đóng dấu điểm số chính xác lên mỗi tờ giấy.
Bạn có một con dấu chữ cái công nghệ thấp nhưng vẫn hoạt động tốt. Để in một chữ cái, bạn gắn một tấm khuôn đặc biệt tương ứng với chữ cái đó vào mặt trước của con dấu, nhúng nó vào mực, rồi đóng lên giấy.
Điều thú vị là thay vì tháo tấm khuôn ra khi bạn muốn đổi chữ cái, bạn có thể chỉ cần đặt một tấm khuôn mới lên trên tấm khuôn cũ. Thực tế, bạn có thể coi các tấm khuôn trên con dấu như một ngăn xếp (stack), hỗ trợ các thao tác sau:
Cho một chuỗi các điểm chữ cái ('A', 'B', và 'C'), bạn cần bao nhiêu thao tác để in toàn bộ chuỗi theo đúng thứ tự? Ngăn xếp ban đầu trống, và bạn phải để ngăn xếp trống khi hoàn thành. Tuy nhiên, bạn có nguồn cung cấp không giới hạn cho mỗi loại khuôn chữ cái để sử dụng trong quá trình thực hiện.
Ví dụ, nếu bạn muốn in chuỗi "ABCCBA", bạn có thể thực hiện trong 12 thao tác như bảng dưới đây:
| Thao tác | Đã in được | Ngăn xếp |
|---|---|---|
| 0. - | - | - |
| 1. Push A | - | A |
| 2. Print | A | A |
| 3. Push B | A | AB |
| 4. Print | AB | AB |
| 5. Push C | AB | ABC |
| 6. Print | ABC | ABC |
| 7. Print | ABCC | ABC |
| 8. Pop | ABCC | AB |
| 9. Print | ABCCB | AB |
| 10. Pop | ABCCB | A |
| 11. Print | ABCCBA | A |
| 12. Pop | ABCCBA | - |
Dòng đầu tiên của tệp đầu vào chứa số lượng bộ test, T. T bộ test tiếp theo, mỗi bộ trên một dòng. Mỗi dòng chứa một chuỗi duy nhất S, đại diện cho chuỗi các ký tự mà bạn muốn in ra theo thứ tự.
Với mỗi bộ test, hãy xuất một dòng chứa "Case #x: N", trong đó x là số thứ tự bộ test (bắt đầu từ 1) và N là số lượng thao tác ngăn xếp tối thiểu cần thiết để in ra S.
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 | 8/27 | 29,63% |
| Test Set 2 | 19/27 | 70,37% |
Ví dụ 1
2
ABCCBA
AAABAAB
Case #1: 12
Case #2: 13
Google Code Jam 2010, Chung kết thế giới, bài Letter Stamper.
Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.
Ninjutsu là võ thuật của các ninja bí ẩn. Bài tập đầu tiên của bạn là làm chủ móc dây: một chiếc móc gắn vào sợi dây rất bền, rất mảnh. Móc đã bám vào mục tiêu tại \((0,0)\); dây kéo dài sang trái và bạn ở đầu còn lại. Khi nhảy, bạn đu ngược chiều kim đồng hồ quanh mục tiêu.
Các mục tiêu khác nằm bên phải và phía trên \((0,0)\), tại \((x_i,y_i)\) với \(x_i,y_i\ge0\). Khi một điểm trong lòng dây (không phải hai đầu) chạm một hay nhiều mục tiêu, dây uốn quanh mục tiêu gần đầu đang chuyển động nhất. Bỏ qua vận tốc ban đầu: bạn đủ nhanh để tiếp tục uốn quanh các mục tiêu cho tới khi quay quanh đúng một mục tiêu.
Dây dài \(R\), nhưng trước khi đu bạn có thể cắt còn bất kỳ độ dài thực \(r\le R\). Bạn bắt đầu tại \((-r,0)\) và đu xuống (ngược chiều kim đồng hồ) hướng tới \((0,-r)\). Hỏi trong một lần đu, số khúc uốn lớn nhất là bao nhiêu? Một khúc uốn được tính khi dây chạm mục tiêu rồi quay quanh đó một góc khác 0. Ngoài các khúc uốn, dây luôn thẳng.
Ví dụ có sáu điểm \((0,0),(3,1),(12,4),(14,5),(13,7),(7,10)\) và dây dài 24. Không cắt dây, nó uốn quanh \((12,4),(14,5),(13,7)\) rồi quay quanh \((7,10)\), còn khoảng 0.1705 dây: tổng 4 khúc. Điểm \((3,1)\) không tính vì thẳng hàng với \((0,0),(12,4)\).
Cắt 0.18 đơn vị khiến dây không tới \((7,10)\) mà đi theo:
(0, 0)--(12, 4)--(14, 5)--(13, 7)--(12, 4)--(14, 5)
Nó kết thúc quanh \((14,5)\) với khoảng 1.3004 dây, tổng 5 khúc, là tối ưu.
Dòng đầu là \(T\). Mỗi test bắt đầu bằng \(N,R\), sau đó là \(N\) cặp số nguyên \(x_i,y_i\), bắt đầu bằng mục tiêu \((0,0)\).
In Case #C: k, với \(k\) là số khúc uốn tối đa.
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 | 11/34 | 32,35% |
| Test Set 2 | 23/34 | 67,65% |
Ví dụ 1
6
6 24
0 0
3 1
12 4
14 5
13 7
7 10
2 1
0 0
2 0
2 1
0 0
1 0
2 10
0 0
4 0
3 50
0 0
9 0
10 0
3 12
0 0
3 0
3 4
Case #1: 5
Case #2: 0
Case #3: 0
Case #4: 2
Case #5: 12
Case #6: 3
Google Code Jam 2010, Chung kết thế giới, bài Ninjutsu.
Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.
Cho một lưới hình chữ nhật gồm \(N\) hàng và \(M\) cột, mỗi ô có thể được gắn nhãn đen (Âm) hoặc trắng (Dương). Hai ô là láng giềng nếu chúng chung nhau một đoạn cạnh đơn vị. Lưới được gọi là hợp lệ nếu tất cả các ô đen tạo thành một đường đi, và tất cả các ô trắng tạo thành một đường đi. Một đường đi là một tập hợp \(S\) các ô được định nghĩa như sau:
Ví dụ, trong hình dưới đây, lưới đầu tiên là hợp lệ, trong khi lưới thứ hai thì không -- mặc dù các ô đen tạo thành một đường đi, nhưng các ô trắng thì không.
Cho \(N\) và \(M\), hãy tính số lượng lưới hợp lệ. Lưu ý rằng tính đối xứng không quan trọng -- miễn là hai lưới hợp lệ khác nhau ở một vị trí thì chúng được coi là khác nhau, ngay cả khi lưới này có thể được xoay hoặc lật để trở thành lưới kia.
Dòng đầu tiên của dữ liệu vào là một số nguyên duy nhất \(T\), số lượng bộ test. \(T\) dòng tiếp theo, mỗi dòng chứa hai số nguyên cách nhau bởi một khoảng trắng: "\(N\) \(M\)", như định nghĩa ở trên.
Với mỗi bộ test, xuất một dòng có dạng "Case #\(x\): \(A\)", trong đó \(x\) là số thứ tự bộ test, bắt đầu từ 1, và \(A\) là số lượng lưới hợp lệ có kích thước đã cho.
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 | 17/52 | 32,69% |
| Test Set 2 | 35/52 | 67,31% |
Ví dụ 1
3
4 4
4 6
5 5
Case #1: 24
Case #2: 44
Case #3: 48
Google Code Jam 2010, Chung kết thế giới, bài The Paths of Yin Yang.
Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.
Trong một khám phá mới của các nhà thiên văn học Nam Cực, người ta ghi lại rằng có \(N\) hành tinh có sự sống trong không gian, tất cả đều nằm trên cùng một đường thẳng. Hành tinh thứ \(i\) nằm ở tọa độ \(X_i\) trên đường thẳng đó (\(i = 1, 2, \dots, N\)). Trái Đất là hành tinh đầu tiên, nằm ở tọa độ \(0\), vì vậy \(X_1\) sẽ luôn bằng \(0\).
Rất hào hứng với sự thật này, bạn bắt đầu lập kế hoạch cho một chuyến đi để thăm tất cả các hành tinh. Vì các hành tinh lạ có thể nguy hiểm, bạn muốn ghé thăm mỗi hành tinh đúng một lần trước khi quay trở lại Trái Đất. Bạn có \(F\) đơn vị nhiên liệu và bạn muốn tiêu tốn càng nhiều nhiên liệu càng tốt cho chuyến đi này để lần hạ cánh cuối cùng xuống Trái Đất được an toàn hơn. Con tàu vũ trụ của bạn khá cơ bản và chỉ có thể bay theo một đường thẳng từ bất kỳ hành tinh \(i\) nào đến bất kỳ hành tinh \(j\) nào khác, tiêu tốn \(|X_i - X_j|\) đơn vị nhiên liệu trên đường đi. Nó không thể quay đầu mà không hạ cánh.
Vì vậy, bạn cần lập một kế hoạch du hành yêu cầu tối đa \(F\) đơn vị nhiên liệu, bắt đầu từ Trái Đất, ghé thăm mỗi hành tinh khác đúng một lần, và sau đó quay trở lại Trái Đất. Nếu có nhiều kế hoạch như vậy, bạn nên tìm kế hoạch tiêu tốn nhiều nhiên liệu nhất. Hãy xuất ra lượng nhiên liệu tiêu thụ đó.
Dòng đầu tiên của đầu vào cho biết số lượng bộ test, \(T\). \(T\) bộ test tiếp theo. Mỗi bộ test bắt đầu bằng một dòng chứa số lượng hành tinh \(N\). Dòng tiếp theo chứa \(N\) số \(X_i\), tọa độ của các hành tinh. Dòng tiếp theo chứa lượng nhiên liệu \(F\) mà bạn có.
Đối với mỗi bộ test, hãy xuất ra một dòng chứa "Case #x: NO SOLUTION" nếu không có kế hoạch du hành nào như vậy, hoặc "Case #x: y", trong đó x là số thứ tự bộ test (bắt đầu từ 1) và y là lượng nhiên liệu tiêu thụ tối đa.
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/33 | 9,09% |
| Test Set 2 | 30/33 | 90,91% |
Ví dụ 1
3
3
0 10 -10
40
5
0 1 2 3 4
13
5
0 1 2 3 4
7
Case #1: 40
Case #2: 12
Case #3: NO SOLUTION
Google Code Jam 2010, Chung kết thế giới, bài Travel Plan.
Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.