| # | Bài tập | Điểm | Thời gian: | Giới hạn bộ nhớ |
|---|---|---|---|---|
| 1 | Google Code Jam 2010 - Bacteria | 31 | 1.0s | 1G |
| 2 | Google Code Jam 2010 - Elegant Diamond | 12 | 1.0s | 1G |
| 3 | Google Code Jam 2010 - Grazing Google Goats | 32 | 1.0s | 1G |
| 4 | Google Code Jam 2010 - World Cup 2010 | 25 | 1.0s | 1G |
Một số vi khuẩn nằm trên một lưới ô vuông vô hạn, mỗi vi khuẩn nằm trong một ô riêng biệt.
Mỗi giây, các biến đổi sau đây sẽ xảy ra (tất cả đồng thời):
Sau khi kiểm tra lưới, bạn nhận thấy có một số lượng vi khuẩn hữu hạn và dương nằm trong một hoặc nhiều vùng hình chữ nhật.
Hãy xác định xem sau bao nhiêu giây thì tất cả vi khuẩn sẽ chết.
Dưới đây là một ví dụ về lưới bắt đầu với 6 ô chứa vi khuẩn và mất 6 giây để tất cả vi khuẩn chết. Số '1' đại diện cho ô có vi khuẩn, và số '0' đại diện cho ô không có vi khuẩn.
000010
011100
010000
010000
000000
000000
001110
011000
010000
000000
000000
000110
001100
011000
000000
000000
000010
000110
001100
000000
000000
000000
000010
000110
000000
000000
000000
000000
000010
000000
000000
000000
000000
000000
000000
Các hình chữ nhật có thể chồng lấp lên nhau.
Phía Bắc là hướng có tọa độ \(Y\) giảm dần.
Phía Tây là hướng có tọa độ \(X\) giảm dần.
Với mỗi bộ thử nghiệm, in ra một dòng chứa "Case #N: T", trong đó N là số thứ tự bộ thử nghiệm (bắt đầu từ 1), và T là số giây cho đến khi tất cả vi khuẩn chết hế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 | 6/31 | 19,35% |
| Test Set 2 | 25/31 | 80,65% |
Ví dụ 1
1
3
5 1 5 1
2 2 4 2
2 3 2 4
Case #1: 6
Google Code Jam 2010, Vòng 2, bài Bacteria.
Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.
Nhà vua đã thuê bạn tạo ra một viên kim cương thanh lịch. Một viên kim cương thanh lịch là một đối tượng hai chiều được tạo thành từ các chữ số, đối xứng qua cả trục ngang và trục dọc. Ví dụ, bốn hình sau đây là các viên kim cương thanh lịch:
2 8 3 7
3 3 8 8 2 2
4 1 4 8 3
3 3
2
Ba hình dưới đây là các viên kim cương, nhưng không thanh lịch:
2 1 3
1 1 1 2 1 1
1 1 1 1 3 1 3
2 1 1 1
1 2
Ba hình dưới đây không phải là hình kim cương:
1 2 8 8
1 1 222 0
2 00000
Nhà vua sẽ bắt đầu bằng việc đưa cho bạn một viên kim cương, có thể chưa thanh lịch. Nhiệm vụ của bạn là làm cho nó trở nên thanh lịch bằng cách nâng cấp nó, thêm các chữ số để tạo thành một viên kim cương lớn hơn. Vì bạn không muốn tốn quá nhiều tiền, bạn muốn thực hiện việc này với chi phí thấp nhất có thể.
Một viên kim cương kích thước \(k\) gồm \(2k-1\) dòng chứa các chữ số từ \(0\) đến \(9\), cách nhau bởi các khoảng trắng đơn, được tổ chức như sau:
Một viên kim cương thanh lịch kích thước \(k\) là một viên kim cương kích thước \(k\) có hai tính chất đối xứng sau:
Một viên kim cương kích thước \(k\) có thể được nâng cấp bằng cách thêm các chữ số vào đó. Kết quả của việc nâng cấp một viên kim cương kích thước \(k\) có các tính chất sau:
Chi phí của việc nâng cấp một viên kim cương bằng số lượng chữ số trong viên kim cương kết quả trừ đi số lượng chữ số trong viên kim cương ban đầu.
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 gồm một số nguyên k trên một dòng riêng biệt, theo sau là một viên kim cương kích thước k.
Với mỗi bộ test, 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à chi phí tối thiểu cần thiết để nâng cấp viên kim cương đã cho thành một viên kim cương thanh lịch. Nếu viên kim cương đã thanh lịch, y=0.
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/12 | 33,33% |
| Test Set 2 | 8/12 | 66,67% |
Ví dụ 1
4
1
0
2
1
2 2
1
2
1
1 2
1
3
1
6 3
9 5 5
6 3
1
Case #1: 0
Case #2: 0
Case #3: 5
Case #4: 7
Có bốn trường hợp. Hai trường hợp đầu tiên bắt đầu là các viên kim cương thanh lịch kích thước 1 và 2, nên không cần nâng cấp; chi phí là 0. Trường hợp thứ ba có thể được nâng cấp để trông như sau:
3
1 1
1 2 1
1 1
3
Có nhiều cách nâng cấp khả thi, nhưng đây là một cách có chi phí thấp nhất, bằng 5. Trong trường hợp thứ tư, chúng ta có thể nâng cấp viên kim cương thành viên kim cương thanh lịch sau:
9
1 1
6 3 6
9 5 5 9
6 3 6
1 1
9
...với chi phí là 7.
Google Code Jam 2010, Vòng 2, bài Elegant Diamond.
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ông dân John vừa mới mua một đàn gồm \(N\) con dê cho cánh đồng của mình. Mỗi con dê \(i\) sẽ được buộc vào một chiếc cọc tại vị trí \(P_i\) bằng một sợi dây thừng có độ dài \(L_i\). Điều này có nghĩa là con dê có thể di chuyển đến bất cứ đâu trên cánh đồng trong khoảng cách \(L_i\) tính từ điểm \(P_i\), nhưng không thể đi xa hơn. (Cánh đồng rất lớn và phẳng, vì vậy bạn có thể coi nó như một mặt phẳng hai chiều vô hạn.)
Nông dân John đã chọn sẵn các vị trí đặt cọc từ đàn dê trước, nhưng ông ấy phải chọn độ dài dây thừng. Có hai yếu tố khiến quyết định này trở nên khó khăn:
Thật không may, Nông dân John không giỏi hình học, và ông ấy cần sự giúp đỡ của bạn!
Với mỗi vị trí máng nước \(Q_j\), bạn nên chọn độ dài các sợi dây thừng sao cho tối thiểu hóa diện tích \(A_j\) mà mọi con dê đều có thể tiếp cận được khi máng nước đặt tại vị trí \(Q_j\). Sau đó, bạn hãy tính toán từng diện tích \(A_j\) này.
Trong hình dưới đây, có bốn điểm màu xanh lam tương ứng với các vị trí cọc: \(P_1, P_2, P_3\), và \(P_4\). Ngoài ra còn có hai điểm màu đỏ tương ứng với các vị trí máng nước tiềm năng: \(Q_1\) và \(Q_2\). Bạn cần tính \(A_1\) và \(A_2\), diện tích của hai vùng được tô bóng.
Dòng đầu tiên của đầu vào cho biết số lượng bộ thử nghiệm, \(T\). Tiếp theo là \(T\) bộ thử nghiệm. Mỗi bộ thử nghiệm bắt đầu bằng một dòng chứa các số nguyên \(N\) và \(M\).
\(N\) dòng tiếp theo chứa các vị trí \(P_1, P_2, \dots, P_N\), mỗi vị trí trên một dòng. Tiếp theo là \(M\) dòng chứa các vị trí \(Q_1, Q_2, \dots, Q_M\), mỗi vị trí trên một dòng.
Mỗi dòng trong số \(N + M\) dòng này chứa tọa độ \(x\) và \(y\) tương ứng của vị trí đó, cách nhau bởi một khoảng trắng.
Đối với mỗi bộ thử nghiệm, hãy xuất một dòng chứa "Case #x: \(A_1\) \(A_2\) ... \(A_M\)", trong đó x là số thứ tự bộ thử nghiệm (bắt đầu từ 1) và \(A_1\) \(A_2\) ... \(A_M\) là các giá trị diện tích đã định nghĩa ở trên. 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.
Thông số Test 1 (Visible):
Thông số Test 2 (Hidden):
\(1 \le T \le 10\).
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/32 | 21,88% |
| Test Set 2 | 25/32 | 78,12% |
Ví dụ 1
3
2 3
0 20
20 0
-20 10
40 20
0 19
4 2
0 0
100 100
300 0
380 90
400 100
1000 5
3 1
0 0
10 10
20 0
10 5
Case #1: 1264.9865911 1713.2741229 0.2939440
Case #2: 1518.9063729 1193932.9692206
Case #3: 0.0
Google Code Jam 2010, Vòng 2, bài Grazing Google Goats.
Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.
Sau bốn năm, mùa World Cup lại đến và Varva đang trên đường tới Nam Phi, vừa kịp lúc để theo dõi giai đoạn thứ hai của giải đấu.
Trong giai đoạn thứ hai (còn gọi là giai đoạn loại trực tiếp), mỗi trận đấu luôn có một đội thắng; đội thắng sẽ tiến vào vòng tiếp theo trong khi đội thua bị loại khỏi giải đấu. Có \(2^P\) đội tham gia ở giai đoạn này, được đánh số bằng các số nguyên từ \(0\) đến \(2^P - 1\). Giai đoạn loại trực tiếp gồm \(P\) vòng. Trong mỗi vòng, mỗi đội còn lại chơi đúng một trận. Các cặp đấu và thứ tự các trận đấu được xác định bằng cách chọn liên tiếp hai đội còn lại có số hiệu thấp nhất và ghép họ vào một trận đấu. Sau khi tất cả các trận đấu trong một vòng kết thúc, vòng tiếp theo sẽ bắt đầu.
Để giúp mình quyết định xem nên xem trận đấu nào, Varva đã lập một danh sách các ràng buộc dựa trên mức độ yêu thích của mình đối với từng đội cụ thể. Cụ thể, đối với mỗi đội \(i\), anh ấy sẵn lòng bỏ lỡ tối đa \(M[i]\) trận đấu mà đội đó thi đấu trong giải.
Varva cần mua một bộ vé để đảm bảo rằng các sở thích của mình được thỏa mãn, bất kể kết quả các trận đấu diễn ra như thế nào. Ngoài ra, anh ấy chỉ muốn chi ít tiền nhất có thể. Mục tiêu của bạn là tìm số tiền tối thiểu anh ấy cần chi để mua vé.
Vé cho các trận đấu cần được mua trước (trước khi giải đấu bắt đầu) và giá vé cho mỗi trận đấu đã được biết trước. Lưu ý rằng, trong dữ liệu nhỏ (small input), giá vé cho tất cả các trận đấu sẽ bằng nhau, trong khi ở dữ liệu lớn (large input), chúng có thể khác nhau.
Một lịch trình giải đấu mẫu cùng với giá vé được đưa ra trong hình trên. Giả sử các ràng buộc được cho bởi mảng \(M = \{1, 2, 3, 2, 1, 0, 1, 3\}\), chiến lược tối ưu như sau: Vì chúng ta không thể bỏ lỡ bất kỳ trận đấu nào của đội 5, chúng ta sẽ cần chi \(50, 400\) và \(800\) để mua vé cho tất cả các trận đấu mà đội 5 có thể tham gia. Bây giờ, các ràng buộc cho các đội khác cũng được thỏa mãn bởi các vé này, ngoại trừ đội 0. Lựa chọn tốt nhất để khắc phục điều này là mua vé cho trận đấu vòng đầu tiên của đội 0, chi thêm \(100\), nâng tổng số tiền lên \(1350\).
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ộ test bắt đầu bằng một dòng chứa một số nguyên duy nhất \(P\). Dòng tiếp theo chứa \(2^P\) số nguyên -- các ràng buộc \(M[0], \dots, M[2^P-1]\).
Khối \(P\) dòng tiếp theo chứa giá vé cho tất cả các trận đấu: dòng đầu tiên của khối chứa \(2^{P-1}\) số nguyên -- giá vé cho các trận đấu vòng đầu tiên, dòng thứ hai của khối chứa \(2^{P-2}\) số nguyên -- giá vé cho các trận đấu vòng thứ hai, v.v. Dòng cuối cùng trong \(P\) dòng chứa một số nguyên duy nhất -- giá vé cho trận chung kết World Cup. Các mức giá được liệt kê theo thứ tự các trận đấu được diễn ra.
Đố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ố tiền tối thiểu Varva cần chi cho vé như mô tả ở trê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 | 10/25 | 40% |
| Test Set 2 | 15/25 | 60% |
Ví dụ 1
2
2
1 1 0 1
1 1
1
3
1 2 3 2 1 0 1 3
100 150 50 90
500 400
800
Case #1: 2
Case #2: 1350
Google Code Jam 2010, Vòng 2, bài World Cup 2010.
Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.