| # | Bài tập | Điểm | Thời gian: | Giới hạn bộ nhớ |
|---|---|---|---|---|
| 1 | Google Code Jam 2008 - Endless Knight | 25 | 3.0s | 1G |
| 2 | Google Code Jam 2008 - How Big Are the Pockets? | 20 | 1.0s | 1G |
| 3 | Google Code Jam 2008 - No Cheating | 30 | 1.0s | 1G |
| 4 | Google Code Jam 2008 - Portal | 25 | 1.0s | 1G |
Trong trò chơi cờ vua, có một quân cờ được gọi là quân mã. Quân mã rất đặc biệt — thay vì di chuyển theo đường thẳng như các quân cờ khác, nó nhảy theo hình chữ "L". Cụ thể, một quân mã có thể nhảy từ ô \((r1, c1)\) đến ô \((r2, c2)\) khi và chỉ khi \((r1 - r2)^2 + (c1 - c2)^2 = 5\).
Trong bài toán này, một quân mã của chúng ta sẽ thực hiện một nhiệm vụ hiệp sĩ là di chuyển từ góc trên bên trái (ô \((1, 1)\)) đến góc dưới bên phải (ô \((H, W)\)) trên một bàn cờ khổng lồ. Bàn cờ có chiều cao \(H\) và chiều rộng \(W\).
Dưới đây là một số hạn chế bạn cần biết:
Nhiệm vụ của bạn là tìm số cách duy nhất để quân mã di chuyển từ góc trên bên trái đến góc dưới bên phải, dưới các hạn chế trên. Rõ ràng là đôi khi đáp án sẽ rất lớn. Bạn được yêu cầu đưa ra phần dư của đáp án khi chia cho \(10007\), một số nguyên tố.
Dữ liệu vào bắt đầu bằng một dòng chứa một số nguyên duy nhất, \(N\). \(N\) bộ dữ liệu kiểm tra theo sau.
Dòng đầu tiên của mỗi bộ dữ liệu chứa 3 số nguyên, \(H\), \(W\), và \(R\). \(R\) dòng tiếp theo, mỗi dòng chứa 2 số nguyên, \(r\) và \(c\), là số hàng và số cột của một tảng đá. Bạn có thể giả định rằng \((1, 1)\) và \((H, W)\) không bao giờ chứa đá và không có hai tảng đá nào ở cùng một vị trí.
Đối với mỗi bộ dữ liệu, hãy xuất một dòng duy nhất, bắt đầu bằng "Case #X: ", trong đó X là số thứ tự bộ dữ liệu (bắt đầu từ 1), tiếp theo là một số nguyên duy nhất cho biết số cách để đạt được mục tiêu, modulo \(10007\).
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 | 20/25 | 80% |
Ví dụ 1
5
1 1 0
4 4 1
2 1
3 3 0
7 10 2
1 2
7 1
4 4 1
3 2
Case #1: 1
Case #2: 2
Case #3: 0
Case #4: 5
Case #5: 1
Google Code Jam 2008, Vòng 3, bài Endless Knight.
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áo sư Polygonovich, một công dân lương thiện của xứ sở Flatland, thích đi dạo ngẫu nhiên dọc theo các điểm nguyên trên mặt phẳng. Ông bắt đầu từ gốc tọa độ vào buổi sáng, hướng về phía bắc. Có ba loại hành động ông thực hiện:
Vào cuối ngày (vâng, đó là một chuyến đi bộ dài!), ông quay trở lại gốc tọa độ. Ông không bao giờ đi qua cùng một điểm hai lần ngoại trừ gốc tọa độ, vì vậy đường đi của ông bao quanh một đa giác. Trong hình dưới đây, phần bên trong của đa giác được tô màu xanh lam (tạm thời bỏ qua các điểm x, y, z và w; chúng sẽ được giải thích sớm thôi):
Lưu ý rằng miễn là Giáo sư Polygonovich thực hiện nhiều hơn 4 lần rẽ, đa giác đó sẽ không lồi. Vì vậy, có những "túi" (pockets) trong đó.
Cảnh báo! Để làm cho nhiệm vụ của bạn khó khăn hơn, định nghĩa về túi của chúng tôi có thể khác với những gì bạn từng nghe trước đây.
Khu vực màu xám dưới đây cho biết các túi của đa giác.
Về mặt hình thức, một điểm p được gọi là nằm trong một túi nếu nó không nằm bên trong đa giác, và ít nhất một trong hai điều kiện sau được thỏa mãn:
Các điểm biên là các điểm mà ông Polygonovich đã đi qua trong chuyến đi bộ của mình (bao gồm tất cả các điểm trên đường đi, không chỉ các điểm có tọa độ nguyên).
Hãy xem lại hình ảnh đầu tiên ở trên. Điểm x thỏa mãn điều kiện thứ nhất; y thỏa mãn cả hai; z thỏa mãn điều kiện thứ hai. Cả ba điểm đều nằm trong các túi. Điểm w không nằm trong túi.
Cho biết chuyến đi bộ của Polygonovich, nhiệm vụ của bạn là tìm tổng diện tích của các túi.
Dòng đầu tiên của dữ liệu vào cho biết số lượng bộ test, N. N bộ test theo sau.
Mỗi bộ test mô tả một chuyến đi bộ của Giáo sư Polygonovich. Nó bắt đầu bằng một số nguyên L. Tiếp theo là L cặp "S T", trong đó S là một chuỗi bao gồm các ký tự 'L', 'R' và 'F', và T là một số nguyên cho biết chuỗi S được lặp lại bao nhiêu lần.
Nói cách khác, dữ liệu vào cho một bộ test trông như thế này:
S1 T1 S2 T2 ... SL TL
Các hành động được thực hiện là sự kết hợp của \(T_1\) bản sao của \(S_1\), tiếp theo là \(T_2\) bản sao của \(S_2\), và cứ tiếp tục như vậy.
Các cặp "S T" cho một bộ test đơn lẻ có thể không nằm trên cùng một dòng, nhưng các chuỗi S sẽ không bị ngắt quãng giữa nhiều dòng. Ví dụ thứ hai bên dưới minh họa điều này.
Đối 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à tổng diện tích của tất cả các túi.
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/20 | 25% |
| Test Set 2 | 15/20 | 75% |
Ví dụ 1
2
1
FFFR 4
9
F 6 R 1 F 4 RFF 2 LFF 1
LFFFR 1 F 2 R 1 F 5
Case #1: 0
Case #2: 4
Google Code Jam 2008, Vòng 3, bài How Big Are the Pockets?.
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 trường trung học địa phương sắp tổ chức một kỳ thi cuối kỳ trong một phòng học lớn. Tuy nhiên, một số học sinh trong trường này luôn cố gắng nhìn bài của nhau trong suốt kỳ thi!
Phòng học có thể được coi là một hình chữ nhật gồm \(M\) hàng và \(N\) cột các ô vuông đơn vị, trong đó mỗi ô vuông đơn vị đại diện cho một chỗ ngồi.
Hiệu trưởng nhà trường quyết định đặt ra quy tắc sau để ngăn chặn việc gian lận:
Giả sử một học sinh có thể nhìn thấy bài làm của những người hàng xóm bên trái, bên phải, phía trên bên trái và phía trên bên phải của mình. Việc sắp xếp chỗ ngồi phải đảm bảo rằng không có bài làm của ai có thể bị bất kỳ học sinh nào khác nhìn thấy.
Như trong hình này, sẽ không phải là ý kiến hay nếu xếp bất kỳ ai vào các vị trí A, C, D hoặc E vì cậu bé ở hàng sau sẽ có thể nhìn thấy bài làm của họ. Tuy nhiên, nếu có một cô gái ngồi ở vị trí B, cậu ấy sẽ không thể nhìn thấy bài làm của cô ấy.
Một số chỗ ngồi trong lớp học bị hỏng, và chúng ta không thể xếp học sinh vào chỗ ngồi bị hỏng.
Hiệu trưởng yêu cầu bạn trả lời câu hỏi sau: Số lượng học sinh tối đa có thể xếp vào lớp học sao cho không ai có thể gian lận là bao nhiêu?
Dòng đầu tiên của dữ liệu vào cho biết số lượng bộ test, \(C\). Tiếp theo là \(C\) bộ test. Mỗi bộ test gồm hai phần.
Phần thứ nhất là một dòng duy nhất chứa hai số nguyên \(M\) và \(N\): Chiều cao và chiều rộng của phòng học hình chữ nhật.
Phần thứ hai sẽ có chính xác \(M\) dòng, với đúng \(N\) ký tự trong mỗi dòng. Mỗi ký tự là '.' (chỗ ngồi không bị hỏng) hoặc 'x' (chỗ ngồi bị hỏng, chữ x thường).
Đối 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 học sinh tối đa có thể tham gia kỳ thi trong phòng học.
Tập dữ liệu nhỏ (Test set 1 - Visible)
Tập dữ liệu lớn (Test set 2 - Hidden)
Đề bài không chia thành các phân nhóm riê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 | 10/30 | 33,33% |
| Test Set 2 | 20/30 | 66,67% |
Ví dụ 1
4
2 3
...
...
2 3
x.x
xxx
2 3
x.x
x.x
10 10
....x.....
..........
..........
..x.......
..........
x...x.x...
.........x
...x......
........x.
.x...x....
Case #1: 4
Case #2: 1
Case #3: 2
Case #4: 46
Google Code Jam 2008, Vòng 3, bài No Cheating.
Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.
Portal™ là một trò chơi giải đố/điều khiển nhân vật góc nhìn thứ nhất được phát triển và phát hành bởi Valve Software. Ý tưởng của trò chơi là tạo ra hai cổng (portal) trên các bức tường, sau đó nhảy qua một cổng và đi ra ở cổng kia. Bài toán này có ý tưởng tương tự nhưng không yêu cầu bạn phải từng chơi Portal.
Trong bài toán này, bạn đang ở trong một lưới kích thước \(R \times C\). Ngoài ra, có một chiếc bánh ngọt thơm ngon ở một vị trí khác trong lưới. Bạn đang rất đói và muốn đến chỗ chiếc bánh với ít lượt di chuyển nhất có thể. Bạn có thể di chuyển lên phía bắc (north), nam (south), đông (east) hoặc tây (west) đến một ô trống. Ngoài ra, bạn có khả năng tạo ra các cổng trên tường.
Để giúp bạn đến chỗ chiếc bánh, bạn có một khẩu súng cổng có thể bắn ra hai loại cổng: cổng màu vàng và cổng màu xanh biển. Một cổng được tạo ra bằng cách bắn súng cổng theo một trong bốn hướng bắc, nam, đông hoặc tây. Súng sẽ phát ra một quả cầu năng lượng và tạo ra một cổng trên bức tường đầu tiên mà nó va chạm. Lưu ý rằng trong bài toán này, việc bắn súng cổng không được tính là một lượt di chuyển. Nếu bạn bắn súng cổng vào chiếc bánh, quả cầu năng lượng sẽ đi xuyên qua nó.
Sau khi tạo ra cả cổng màu vàng và cổng màu xanh biển, bạn có thể đi xuyên qua cổng màu vàng để đến vị trí cổng màu xanh biển hoặc ngược lại. Sử dụng các cổng này, bạn có thể đến chỗ chiếc bánh nhanh hơn nữa! Bạn chỉ có thể sử dụng cổng sau khi đã tạo ra cả hai loại cổng vàng và xanh biển.
Xét lưới sau đây:
Các ô màu xám đại diện cho tường, ô màu trắng đại diện cho ô trống, và vòng tròn màu đỏ chỉ vị trí của bạn.
Giả sử bạn bắn một cổng màu xanh biển về phía đông. Cổng sẽ được tạo ra trên bức tường đầu tiên nó chạm vào, kết quả là:
Bây giờ giả sử bạn bắn một cổng màu vàng về phía nam:
Tiếp theo, bạn di chuyển về phía nam một bước:
Bây giờ đến phần thú vị. Nếu bạn di chuyển về phía nam thêm một bước nữa, bạn sẽ đi xuyên qua cổng màu vàng để đến cổng màu xanh biển:
Tại mỗi thời điểm chỉ có thể có tối đa một cổng màu vàng và một cổng màu xanh biển. Ví dụ, nếu bạn cố gắng tạo một cổng màu xanh biển ở phía tây, cổng màu xanh biển cũ sẽ biến mất:
Một cổng chỉ biến mất khi một cổng khác cùng màu được bắn ra.
Lưu ý rằng các cổng được tạo ra ở một mặt của bức tường. Nếu một bức tường có cổng ở mặt phía đông của nó, bạn phải di chuyển vào bức tường từ phía đông để đi xuyên qua cổng. Nếu không, bạn sẽ chỉ đơn giản là đâm vào tường, điều này là không thể.
Cuối cùng, bạn không được đặt hai cổng chồng lên nhau. Nếu bạn cố bắn một cổng vào mặt của một bức tường đã có sẵn một cổng (bất kể màu gì), cổng thứ hai sẽ không được hình thành.
Cho bản đồ mê cung, vị trí ban đầu của bạn và vị trí của chiếc bánh, bạn cần tìm số lượt di chuyển tối thiểu để đến chỗ chiếc bánh nếu có thể. Hãy nhớ rằng việc bắn súng cổng không tính là một lượt di chuyển.
Dòng đầu tiên của dữ liệu vào cho biết số lượng bộ test, \(N\). \(N\) bộ test tiếp theo.
Dòng đầu tiên của mỗi bộ test chứa hai số nguyên \(R\) và \(C\) cách nhau bởi một khoảng trắng. \(R\) dòng tiếp theo, mỗi dòng chứa \(C\) ký tự, đại diện cho bản đồ:
. biểu thị một ô trống;# biểu thị một bức tường;O biểu thị vị trí bắt đầu của bạn; vàX biểu thị vị trí của chiếc bánh.Sẽ có chính xác một ký tự O và một ký tự X trong mỗi bộ test.
Các ô nằm ngoài lưới đều được coi là tường và bạn có thể sử dụng chúng để tạo cổng.
Với mỗi bộ test, bạn nên xuất ra một dòng chứa "Case #\(X\): \(Y\)" trong đó \(X\) là số thứ tự của bộ test và \(Y\) là số lượt di chuyển tối thiểu để đến chỗ chiếc bánh hoặc "THE CAKE IS A LIE" nếu không thể đến được chỗ chiếc bánh.
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
4 7
.O..##.
.#.....
.#.####
.#...X.
5 5
O....
.....
.....
.....
....X
1 3
O#X
Case #1: 4
Case #2: 2
Case #3: THE CAKE IS A LIE
Dưới đây là chuỗi các bước di chuyển cho bộ test đầu tiên (lưu ý rằng việc bắn súng cổng không tính là một lượt di chuyển):
Google Code Jam 2008, Vòng 3, bài Portal.
Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.