| # | Bài tập | Điểm | Thời gian: | Giới hạn bộ nhớ |
|---|---|---|---|---|
| 1 | Google Code Jam 2011 - Dire Straights | 16 | 1.0s | 1G |
| 2 | Google Code Jam 2011 - Irregular Cakes | 14 | 2.0s | 1G |
| 3 | Google Code Jam 2011 - Mystery Square | 41 | 9.0s | 1G |
| 4 | Google Code Jam 2011 - Perpetual Motion | 29 | 1.0s | 1G |
Bạn đang chơi một trò chơi bài, trong đó mỗi lá bài có ghi một số nguyên trên đó.
Để chơi trò chơi, bạn được đưa cho một số lá bài — gọi là xấp bài của bạn. Sau đó, bạn sắp xếp các lá bài trong xấp bài của mình thành các dãy liên tiếp (straights). Một dãy liên tiếp là một tập hợp các lá bài có giá trị liên tiếp nhau; ví dụ: bộ ba lá bài \(\{3, 4, 5\}\), hoặc bộ một lá bài \(\{7\}\). Sau đó, bạn sẽ nhận được số đô la bằng với độ dài của dãy liên tiếp ngắn nhất. Nếu bạn không có lá bài nào, bạn không thể tạo ra dãy liên tiếp nào, vì vậy bạn nhận được 0 đô la.
Bạn sẽ được cung cấp một loạt các trường hợp kiểm thử, mỗi trường hợp mô tả các lá bài bạn có trong xấp bài của mình. Hãy tìm số đô la tối đa bạn có thể nhận được cho mỗi trường hợp kiểm thử.
Dòng đầu tiên của dữ liệu vào chứa số lượng trường hợp kiểm thử, \(T\).
Mỗi trường hợp kiểm thử gồm một dòng. Mỗi dòng chứa \(N\), số lượng lá bài trong xấp bài của bạn, theo sau là \(N\) số nguyên cho biết các số trên những lá bài đó. Các số này đều được phân tách bằng dấu cách.
Đối với mỗi trường hợp kiểm thử, hãy xuất một dòng chứa "Case #x: y", trong đó x là số thứ tự trường hợp kiểm thử (bắt đầu từ 1) và y là số đô la tối đa bạn có thể nhận đượ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 | 4/16 | 25% |
| Test Set 2 | 12/16 | 75% |
Ví dụ 1
4
10 1 2 3 4 5 10 9 8 7 6
8 101 102 103 104 105 106 103 104
0
5 1 2 3 4 9
Case #1: 10
Case #2: 4
Case #3: 0
Case #4: 1
Google Code Jam 2011, Vòng 3, bài Dire Straights.
Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.
Mary là một nhà toán học và cô có một tiệm bánh được thành lập cách đây vài năm. Sau ngần ấy thời gian, cô cảm thấy nhàm chán với việc luôn nướng những chiếc bánh hình chữ nhật và hình tròn giống nhau. Cho sinh nhật sắp tới, cô muốn nướng một chiếc bánh bất quy tắc (irregular cake), được định nghĩa là phần diện tích nằm giữa hai "đường gấp khúc" (polylines) từ \(x=0\) đến \(x=W\). Những đường gấp khúc này được gọi là biên dưới và biên trên.
Về mặt hình học, một đường gấp khúc được định nghĩa bởi một chuỗi các điểm \((P_0, P_1, \dots, P_n)\) đi từ trái sang phải. Các điểm liên tiếp được nối với nhau tạo thành một chuỗi các đoạn thẳng, cùng nhau tạo nên đường gấp khúc.
Hôm nay là sinh nhật của Mary và cô đã nướng một chiếc bánh bất quy tắc được giới hạn bởi hai đường gấp khúc có lần lượt \(L\) điểm và \(U\) điểm. Sau khi hát bài "Chúc mừng sinh nhật", cô muốn thực hiện \(G-1\) nhát cắt thẳng đứng để chia chiếc bánh thành \(G\) phần có diện tích bằng nhau. Sau đó, cô có thể chia sẻ các phần bánh này cho tất cả khách mời của mình. Tuy nhiên, hình dạng bất quy tắc của chiếc bánh khiến nhiệm vụ này khá khó khăn. Bạn có thể giúp cô ấy quyết định vị trí các nhát cắt không?
Dòng đầu tiên của dữ liệu vào cho biết số lượng bộ test, \(T\). Tiếp theo là \(T\) bộ test. Mỗi bộ test bắt đầu bằng một dòng chứa bốn số nguyên: \(W\) (chiều rộng của bánh), \(L\) (số điểm trên biên dưới), \(U\) (số điểm trên biên trên) và \(G\) (số lượng khách mời tại bữa tiệc).
Tiếp theo là \(L\) dòng xác định biên dưới. Dòng thứ \(i\) chứa hai số nguyên \(x_i\) và \(y_i\), đại diện cho tọa độ của điểm thứ \(i\) trên biên dưới. Tiếp theo là \(U\) dòng nữa xác định biên trên. Dòng thứ \(j\) ở đây chứa hai số nguyên \(x_j\) và \(y_j\), đại diện cho tọa độ của điểm thứ \(j\) trên biên trên.
Đối với mỗi bộ test, hãy xuất ra \(G\) dòng. Dòng đầu tiên phải là Case #x:, trong đó \(x\) là số thứ tự bộ test (bắt đầu từ 1). \(G-1\) dòng tiếp theo phải chứa tọa độ \(x\) nơi các nhát cắt phải được thực hiện, được sắp xếp từ nhát cắt bên trái nhất đến nhát cắt bên phải nhất.
Các câu trả lời có sai số tương đối hoặc tuyệt đối không quá \(10^{-6}\) sẽ được coi là chính xá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 | 7/14 | 50% |
| Test Set 2 | 7/14 | 50% |
Ví dụ 1
2
15 3 3 3
0 6
10 8
15 9
0 10
5 11
15 13
8 3 4 2
0 2
5 4
8 3
0 5
3 4
4 7
8 5
Case #1:
5.000000
10.000000
Case #2:
4.290588
Google Code Jam 2011, Vòng 3, bài Irregular Cakes.
Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.
Tôi đã viết một số chính phương lớn ở hệ nhị phân, sau đó thay thế một số chữ số bằng các dấu chấm hỏi. Bạn có thể tìm ra số ban đầu của tôi là gì không?
Dòng đầu tiên của dữ liệu vào cho biết 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 \(S\): một số chính phương được viết ở hệ nhị phân, nhưng có một số chữ số bị thay thế bởi dấu chấm hỏi.
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à một số chính phương viết ở hệ nhị phân, thu được bằng cách thay thế mỗi ký tự '?' trong \(S\) bằng ký tự '0' hoặc '1'.
Small dataset (Test set 1 - Visible):
Large dataset (Test set 2 - Hidden):
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/41 | 24,39% |
| Test Set 2 | 31/41 | 75,61% |
Ví dụ 1
3
1???
1
10??110??00??1000??
Case #1: 1001
Case #2: 1
Case #3: 1011110110000100001
Google Code Jam 2011, Vòng 3, bài Mystery Square.
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 đã bao giờ đến Nhà máy Google Lemming chưa? Đó là một nơi rất khác thường. Sàn nhà được sắp xếp thành một lưới \(R \times C\). Trong mỗi ô vuông của lưới, có một băng chuyền định hướng theo chiều dọc (lên-xuống), chiều ngang (trái-phải), hoặc dọc theo một trong hai đường chéo. Các băng chuyền di chuyển tiến hoặc lùi dọc theo định hướng của chúng, và bạn có thể độc lập chọn một trong hai hướng di chuyển có thể cho mỗi băng chuyền.
Hiện tại, có một con lemming (chuột đồng) đang đứng ở trung tâm của mỗi ô vuông. Khi bạn khởi động các băng chuyền, mỗi con lemming sẽ di chuyển theo hướng của băng chuyền mà nó đang đứng cho đến khi nó đến trung tâm của một ô vuông mới. Tất cả các chuyển động này diễn ra đồng thời và mất đúng một giây để hoàn thành. Sau đó, tất cả các con lemming sẽ ở trên các ô vuông mới, và quá trình này sẽ lặp lại từ các vị trí mới của chúng. Điều này tiếp tục mãi mãi, hoặc ít nhất là cho đến khi bạn tắt các băng chuyền.
Mẹo là chọn hướng cho mỗi băng chuyền sao cho các con lemming sẽ tiếp tục di chuyển mãi mãi mà không bao giờ có hai con kết thúc ở trung tâm của cùng một ô vuông tại cùng một thời điểm. Nếu điều đó xảy ra, chúng sẽ bị dính vào nhau từ đó về sau, và điều đó không vui vẻ gì cho chúng.
Dưới đây là hai cách gán hướng cho mỗi băng chuyền từ ví dụ trước:
Trong cả hai trường hợp, chúng ta tránh được việc gửi hai con lemming đến trung tâm của cùng một ô vuông tại cùng một thời điểm.
Cho một sơ đồ sàn tùy ý, hãy tính \(N\), số cách chọn hướng cho mỗi băng chuyền sao cho không bao giờ có hai con lemming kết thúc ở trung tâm của cùng một ô vuông tại cùng một thời điểm. Kết quả có thể rất lớn, vì vậy hãy xuất nó theo modulo \(1000003\).
Dòng đầu tiên của dữ liệu vào cho biết số lượng bộ test, \(T\). \(T\) bộ test tiếp theo. Mỗi bộ bắt đầu bằng một dòng chứa các số nguyên dương \(R\) và \(C\).
Tiếp theo là \(R\) dòng, mỗi dòng chứa một chuỗi gồm \(C\) ký tự được chọn từ "|-/\". Mỗi ký tự đại diện cho định hướng của băng chuyền trong một ô vuông:
|' đại diện cho băng chuyền có thể di chuyển lên hoặc xuống.-' đại diện cho băng chuyền có thể di chuyển sang trái hoặc sang phải./' đại diện cho băng chuyền có thể di chuyển lên-phải hoặc xuống-trái.\' đại diện cho băng chuyền có thể di chuyển lên-trái hoặc xuống-phải.Đối với mỗi bộ test, hãy xuất một dòng chứa "Case #x: \(M\)", trong đó x là số thứ tự bộ test (bắt đầu từ 1) và \(M\) là phần dư khi chia \(N\) cho \(1000003\).
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/29 | 17,24% |
| Test Set 2 | 24/29 | 82,76% |
Ví dụ 1
3
3 3
|-/
|||
--|
3 4
----
||||
\\//
4 4
|---
\-\|
\|||
|--\
Case #1: 2
Case #2: 0
Case #3: 16
Google Code Jam 2011, Vòng 3, bài Perpetual Motion.
Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.