| # | Bài tập | Điểm | Thời gian: | Giới hạn bộ nhớ |
|---|---|---|---|---|
| 1 | Google Code Jam 2008 - Bridge Builders | 25 | 19.0s | 1G |
| 2 | Google Code Jam 2008 - Juice | 13 | 12.0s | 1G |
| 3 | Google Code Jam 2008 - Mine Layer | 17 | 1.0s | 1G |
| 4 | Google Code Jam 2008 - Ping Pong Balls | 15 | 4.5s | 1G |
| 5 | Google Code Jam 2008 - The Year of Code Jam | 30 | 3.0s | 1G |
Nhà vua muốn xây dựng các cây cầu và ông muốn chúng được hoàn thành càng nhanh càng tốt. Nhà vua sở hữu một lưới đất kích thước \(N \times M\), với mỗi ô được ngăn cách với các ô liền kề bởi một con sông chạy giữa chúng. Ông muốn bạn tính toán xem cần bao nhiêu giờ công (man-hours) để xây dựng đủ số cầu nhằm kết nối tất cả các hòn đảo. Một số ô thực chất là hồ nước và không cần phải xây cầu đến đó.
Một số hòn đảo là rừng, nơi có nguồn gỗ dồi dào. Nằm ở góc trên cùng bên trái là căn cứ trung tâm, nơi này luôn là một khu rừng.
Một cây cầu chỉ có thể được xây dựng giữa hai hòn đảo nếu chúng liền kề nhau theo chiều dọc hoặc chiều ngang, và một trong hai đảo phải có thể truy cập được từ căn cứ trung tâm thông qua các cây cầu đã được xây dựng trước đó.
Số giờ công cần thiết để xây dựng một cây cầu là số lượng cây cầu mà những người thợ xây phải băng qua để đi từ khu rừng gần nhất đến hòn đảo mà bạn đang xây cầu tới, tính cả cây cầu đang được xây dựng. Những người thợ xây chỉ có thể đi lại giữa hai đảo nếu đã có một cây cầu giữa chúng.
Nhà vua đã đảm bảo rằng luôn có ít nhất một cách để kết nối tất cả các hòn đảo.
Hãy viết một chương trình, cho biết bản đồ các hòn đảo, đầu ra là số giờ công tối thiểu cần thiết để kết nối tất cả các đảo.
Hãy xem xét ví dụ sau. Ô màu xanh lá cây biểu thị rừng, màu xám biểu thị đảo trống, và màu xanh dương biểu thị nước.
Một giải pháp tối ưu bắt đầu bằng việc xây dựng các cây cầu sau từ khu rừng ở căn cứ trung tâm.
Chi phí này là \(1 + 2 + 1 + 2 + 3 + 4 = 13\).
Bây giờ, vì khu rừng ở hàng 3, cột 3 đã được kết nối với căn cứ trung tâm, chúng ta có thể xây dựng các cây cầu từ đó. Một giải pháp tối ưu kết nối phần còn lại của các hòn đảo bằng các cây cầu được xây dựng từ khu rừng này.
Chi phí này là \(2 + 1 + 2 + 1 + 2 + 3 = 11\). Tổng chi phí là \(24\), đây là giải pháp tối ưu.
Dòng đầu tiên của đầu vào chứa một số nguyên \(T\), số lượng bộ thử nghiệm. \(T\) bộ thử nghiệm tiếp theo. Mỗi bộ thử nghiệm bắt đầu với \(N\), số hàng, và \(M\), số cột, trên một dòng cách nhau bởi dấu cách. \(N\) hàng tiếp theo chứa chính xác \(M\) ký tự mỗi hàng. Ký tự 'T' biểu thị một hòn đảo có rừng, '#' biểu thị một hòn đảo trống, và '.' biểu thị nước.
Một dòng duy nhất chứa "Case #X: Y", trong đó \(X\) là số thứ tự bộ thử nghiệm (bắt đầu từ 1) và \(Y\) là số giờ công tối thiểu cần thiết để kết nối tất cả các đảo.
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/25 | 32% |
| Test Set 2 | 17/25 | 68% |
Ví dụ 1
3
2 2
T.
T#
4 4
T##.
##.#
.#T#
####
5 5
T#T.#
..#.#
#.###
###.#
T###T
Case #1: 2
Case #2: 24
Case #3: 49
Google Code Jam 2008, Chung kết thế giới, bài Bridge Builders.
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 tổ chức một bữa tiệc. Để chuẩn bị, bạn đang pha chế một loại đồ uống bằng cách trộn ba loại nước trái cây khác nhau: Táo (Apple), Chuối (Banana) và Cà rốt (Carrot). Hãy gọi các loại nước trái cây này là \(A\), \(B\) và \(C\).
Bạn muốn quyết định tỷ lệ của mỗi loại nước trái cây trong đồ uống sao cho số lượng người tham dự bữa tiệc thích đồ uống đó là lớn nhất có thể.
Mỗi người có một tỷ lệ tối thiểu cho mỗi loại trong số 3 loại nước trái cây mà họ muốn có trong đồ uống. Họ sẽ chỉ thích đồ uống nếu tỷ lệ của mỗi loại nước trái cây trong đồ uống lớn hơn hoặc bằng tỷ lệ tối thiểu của họ đối với loại nước trái cây đó.
Hãy xác định số lượng người tối đa mà bạn có thể làm hài lòng.
Với mỗi bộ dữ liệu:
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/13 | 23,08% |
| Test Set 2 | 10/13 | 76,92% |
Ví dụ 1
3
3
10000 0 0
0 10000 0
0 0 10000
3
5000 0 0
0 2000 0
0 0 4000
5
0 1250 0
3000 0 3000
1000 1000 1000
2000 1000 2000
1000 3000 2000
Case #1: 1
Case #2: 2
Case #3: 5
Trong trường hợp đầu tiên, đối với mỗi loại nước trái cây, chúng ta có một người muốn đồ uống được pha hoàn toàn từ loại nước trái cây đó! Rõ ràng chúng ta chỉ có thể làm hài lòng một trong số họ.
Trong trường hợp thứ hai, chúng ta có thể đáp ứng bất kỳ hai trong ba sở thích.
Trong trường hợp thứ ba, tất cả năm người sẽ thích đồ uống nếu chúng ta pha nó bằng cách chia đều một phần ba cho mỗi loại nước trái cây.
Google Code Jam 2008, Chung kết thế giới, bài Juice.
Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.
MineLayer là một trò chơi giải đố giống như Dò mìn (Minesweeper) được chơi trên một lưới kích thước \(R \times C\). Mỗi ô vuông trong lưới có thể có một quả mìn hoặc không có quả mìn nào. Một câu đố MineLayer bao gồm một lưới các con số, mỗi con số cho biết tổng số mìn trong tất cả các ô liền kề và trong chính ô mang con số đó (tức là tối đa 9 ô của hình vuông \(3 \times 3\) có tâm tại ô ấy). Do đó, các con số sẽ nằm trong khoảng từ 0 đến 9.
Mục tiêu của MineLayer là tìm ra một cách bố trí các quả mìn trong lưới khớp với các manh mối đã cho.
Dưới đây là một lưới \(3 \times 4\) điển hình. Cách bố trí ban đầu ở bên trái và câu đố ở bên phải.
Vì có thể có nhiều lời giải, nhiệm vụ của bạn là viết một chương trình xuất ra số lượng mìn tối đa có thể có ở hàng giữa. Số hàng \(R\) sẽ luôn là một số lẻ và luôn đảm bảo có ít nhất một lời giải cho câu đố.
Dòng đầu tiên của dữ liệu vào cho biết số lượng bộ test, \(N\). Tiếp theo là \(N\) bộ test.
Dòng đầu tiên của mỗi bộ test chứa hai số cách nhau bởi dấu cách: \(R\), số hàng và \(C\), số cột. \(R\) luôn là một số nguyên lẻ. Mỗi dòng trong số \(R\) dòng tiếp theo chứa \(C\) số cách nhau bởi dấu cách biểu thị các manh mối của hàng đó.
Đối với mỗi bộ test, hãy xuất ra 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 mìn tối đa có thể có ở hàng giữa của lưới thỏa mãn các ràng buộ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 | 4/17 | 23,53% |
| Test Set 2 | 13/17 | 76,47% |
Ví dụ 1
2
3 3
2 2 1
3 4 3
2 3 2
3 4
1 2 1 1
2 3 3 2
2 2 2 1
Case #1: 1
Case #2: 1
Google Code Jam 2008, Chung kết thế giới, bài Mine Layer.
Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.
Một căn phòng lớn chứa đầy các bẫy chuột được sắp xếp theo dạng lưới. Mỗi bẫy chuột được nạp hai quả bóng bàn, được đặt cẩn thận sao cho khi bẫy chuột sập, chúng sẽ được bắn ra, rơi trúng các bẫy chuột khác và kích hoạt chúng. Các bức tường của căn phòng có tính chất dính, vì vậy bất kỳ quả bóng nào đập vào tường đều bị hấp thụ.
Mỗi bẫy chuột khi bị trúng bóng sẽ bắn hai quả bóng bàn theo cùng một cách: chuyển động của chúng được xác định bởi một độ dời X và Y so với bẫy chuột xuất phát. Sau đó, bạn quyết định ném một quả bóng bàn duy nhất vào phòng. Nó trúng một bẫy chuột, kích hoạt bẫy đó và bắn ra hai quả bóng của nó. Hai quả bóng này sau đó kích hoạt thêm hai bẫy chuột nữa, và giờ có bốn quả bóng bay ra... Khi bụi lắng xuống, nhiều bẫy chuột đã bị kích hoạt, nhưng một số bẫy đã bị bỏ lỡ bởi tất cả các quả bóng đang bay.
Bạn cần tính xem có bao nhiêu bẫy chuột sẽ bị kích hoạt.
Ví dụ (xem ví dụ mẫu đầu tiên), hình ảnh dưới đây minh họa một căn phòng có chiều rộng 5, chiều cao 3. Hai hướng của các quả bóng bàn trong mỗi phòng lần lượt là (-1, 0) và (-1, -1). Quả bóng đầu tiên bạn ném trúng bẫy chuột ở vị trí (4, 2). Cuối cùng, 12 bẫy chuột được kích hoạt.
Dòng đầu tiên của dữ liệu vào cho biết số lượng bộ test, C. C bộ test tiếp theo. Mỗi bộ test chứa bốn dòng. Dòng đầu tiên là kích thước của lưới bẫy chuột (bằng kích thước của căn phòng), được cho bởi chiều rộng W và chiều cao H. Hai dòng tiếp theo cho biết điểm đến của hai quả bóng bàn, dưới dạng độ dời X và Y. Ví dụ, nếu hai dòng là 0 1 và 1 1, thì việc kích hoạt một bẫy chuột sẽ bắn ra hai quả bóng; một quả sẽ trúng bẫy chuột ngay phía trên bẫy bị kích hoạt, và quả kia sẽ trúng bẫy chuột ở phía trên và bên phải của bẫy bị kích hoạt. Dòng cuối cùng có hai số nguyên xác định tương ứng cột và hàng của bẫy chuột bị quả bóng bàn ban đầu kích hoạt (trong đó 0 0 là bẫy chuột ở góc dưới bên trái).
Đối với mỗi bộ test, hãy in ra một dòng chứa "Case #A: B", trong đó A là số thứ tự của bộ test (bắt đầu từ 1) và B là số lượng bẫy chuột bị kích hoạt (bao gồm cả bẫy đầu tiê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 | 4/15 | 26,67% |
| Test Set 2 | 11/15 | 73,33% |
Ví dụ 1
3
5 3
-1 0
-1 -1
4 2
50 50
0 1
1 1
10 10
6 2
2 0
3 0
0 0
Case #1: 12
Case #2: 820
Case #3: 5
Google Code Jam 2008, Chung kết thế giới, bài Ping Pong Balls.
Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.
Năm 2008 sẽ được biết đến là một năm của sự thay đổi và chuyển giao, sự khởi đầu của một kỷ nguyên mới: tất nhiên, chúng ta đang nói về định dạng mới của Google Code Jam. Sự ra đời của cuộc thi này đã tập hợp rất nhiều cuộc thi lập trình tuyệt vời trong một năm duy nhất đến nỗi mọi người bắt đầu gọi nó là Năm của Code Jam.
Sphinny, một thí sinh đầy nhiệt huyết, đang nhìn vào lịch trong năm của mình và phát hiện ra rằng có rất nhiều cuộc thi lập trình đã được lên lịch. Cô đã đánh dấu mỗi ngày trong năm trên lịch theo một trong ba cách:
Lưu ý: Để đơn giản hóa bài toán, chúng ta giả định rằng không có khái niệm vòng loại: bạn không cần phải tham gia một cuộc thi này để đủ điều kiện tham gia một cuộc thi khác.
Ở một thế giới hơi khác so với thế giới của chúng ta, lịch của Sphinny có một số đặc điểm cần lưu ý: Nó có \(N\) tháng, và mỗi tháng có đúng \(M\) ngày.
Hình ảnh dưới đây mô tả một tờ lịch với 5 tháng, mỗi tháng có 8 ngày, 15 ngày màu xanh và 5 dấu chấm hỏi.
Nhìn vào tờ lịch đẹp đẽ của mình, Sphinny quyết định rằng mỗi ngày có tối đa 4 hàng xóm trong năm: Ngày trước đó trong cùng một tháng, ngày tiếp theo trong cùng một tháng, cùng một ngày ở tháng trước và cùng một ngày ở tháng sau.
Sphinny muốn tối đa hóa sự hạnh phúc của mình từ các cuộc thi này, và cô ước tính mức độ ảnh hưởng của các cuộc thi đối với sự hạnh phúc của mình là tổng các giá trị của tất cả các ngày màu xanh. Đối với mỗi ngày màu xanh, giá trị được tính như sau:
Bạn có thể nghĩ rằng Sphinny thích các cuộc thi, nhưng việc tham gia vào hai ngày liên tiếp khiến cô hơi mệt mỏi. Và vì lý do thẩm mỹ, việc tham gia vào cùng một ngày trong hai tháng liên tiếp cũng không tuyệt vời cho lắm.
Sphinny muốn lập kế hoạch cho năm của mình ngay bây giờ, và quyết định cho mọi ngày có dấu chấm hỏi xem nó nên là màu trắng hay màu xanh. Mục tiêu của cô đơn giản là tối đa hóa giá trị hạnh phúc.
Hình ảnh sau đây cho thấy một giải pháp cho ví dụ trên. Bằng cách thay đổi hai dấu chấm hỏi thành các ngày màu xanh, và ba dấu chấm hỏi còn lại thành các ngày màu trắng, cô có thể đạt được giá trị hạnh phúc là 42.
Dòng đầu tiên của tệp đầu vào chứa số lượng bộ test \(T\). Tiếp theo là \(T\) bộ test theo định dạng sau.
Dòng đầu tiên có dạng "\(N\) \(M\)", trong đó \(N\) và \(M\) là hai số cho biết số tháng và số ngày mỗi tháng.
\(N\) dòng tiếp theo mỗi dòng chứa một chuỗi có độ dài \(M\). Ký tự thứ \(j\) trong chuỗi thứ \(i\) là một trong các ký tự {'#', '.', '?'}, cho biết trạng thái của ngày thứ \(j\) trong tháng thứ \(i\). '#' biểu thị một ngày màu xanh, '.' biểu thị một ngày màu trắng, và '?' biểu thị một ngày có dấu chấm hỏi.
Đối với mỗi bộ test, bạn nên xuất ra một dòng theo định dạng:
Case #X: 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/30 | 23,33% |
| Test Set 2 | 23/30 | 76,67% |
Ví dụ 1
2
3 3
.?.
.?.
.#.
5 8
.#...##.
.##..?..
.###.#.#
??#..?..
###?#...
Case #1: 8
Case #2: 42
Lưu ý rằng ví dụ thứ hai chính là ví dụ trong các hình ảnh trên.
Google Code Jam 2008, Chung kết thế giới, bài The Year of Code Jam.
Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.