Google Code Jam 2010 - Round 2

Bộ đề bài

# 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

1. Google Code Jam 2010 - Bacteria

Điểm: 31 Thời gian: 1.0s Bộ nhớ: 1G Input: bàn phím Output: màn hình

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):

  1. Nếu một vi khuẩn không có láng giềng ở phía bắc và không có láng giềng ở phía tây, nó sẽ chết.
  2. Nếu một ô không có vi khuẩn, nhưng có vi khuẩn ở các ô láng giềng phía bắc và phía tây, thì một vi khuẩn mới sẽ được sinh ra ở ô đó.

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

Dữ liệu vào

  • Một dòng chứa số nguyên \(C\), số lượng bộ thử nghiệm (test case).
    Tiếp theo là các bộ thử nghiệm, mỗi bộ gồm:
  • Một dòng chứa số nguyên \(R\), số lượng hình chữ nhật chứa vi khuẩn ban đầu.
  • \(R\) dòng, mỗi dòng chứa bốn số nguyên cách nhau bởi dấu cách \(X_1, Y_1, X_2, Y_2\). Điều này cho biết tất cả các ô có tọa độ \(X\) từ \(X_1\) đến \(X_2\) (bao gồm cả hai đầu) và tọa độ \(Y\) từ \(Y_1\) đến \(Y_2\) (bao gồm cả hai đầu) đều chứa vi khuẩn.

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.

Dữ liệu ra

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.

Ràng buộc

  • \(1 \le C \le 100\).

Phân nhóm

  • Thông thường (Test set 1):
    • \(1 \le R \le 10\)
    • \(1 \le X_1 \le X_2 \le 100\)
    • \(1 \le Y_1 \le Y_2 \le 100\)
  • Lớn (Test set 2):
    • \(1 \le R \le 1000\)
    • \(1 \le X_1 \le X_2 \le 1,000,000\)
    • \(1 \le Y_1 \le Y_2 \le 1,000,000\)
    • Số lượng ô ban đầu chứa vi khuẩn tối đa là \(1,000,000\).

Điểm các phân nhóm

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ụ

Ví dụ 1

Input
1
3
5 1 5 1
2 2 4 2
2 3 2 4
Output
Case #1: 6

Nguồn

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.

2. Google Code Jam 2010 - Elegant Diamond

Điểm: 12 Thời gian: 1.0s Bộ nhớ: 1G Input: bàn phím Output: màn hình

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ể.

Định nghĩa

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:

  • Dòng \(i\) (\(1 \le i \le k\)) chứa \(k-i\) khoảng trắng, sau đó là \(i\) chữ số cách nhau bởi các khoảng trắng đơn.
  • Dòng \(i\) (\(k < i < 2k\)) chứa \(i-k\) khoảng trắng, sau đó là \(2k-i\) chữ số cách nhau bởi các khoảng trắng đơn.

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:

  • Đối xứng ngang: Gọi \(c_i\) là số lượng chữ số trên dòng \(i\). Chữ số thứ \(j\) trên dòng \(i\) (với \(j=1\) cho chữ số đầu tiên) phải giống với chữ số thứ \(c_i+1-j\).
  • Đối xứng dọc: Chữ số thứ \(j\) trên dòng \(i\) (với \(i=1\) cho dòng đầu tiên) phải giống với chữ số thứ \(j\) trên dòng \(2k-i\).

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:

  • Kết quả là một viên kim cương kích thước \(\ge k\).
  • Viên kim cương ban đầu là một phần của kết quả. Nói cách khác, tồn tại một số \(X\) và một số \(Y\) sao cho, với mọi giá trị \(i\)\(j\) mà ký tự thứ \(j\) của dòng thứ \(i\) của viên kim cương gốc là một chữ số (thay vì khoảng trắng), thì ký tự thứ \(j+X\) trên dòng thứ \(i+Y\) của kết quả cũng là một chữ số và nó giống với chữ số thứ \(j\) trên dòng thứ \(i\) của bản gốc.

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ữ liệu vào

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.

Dữ liệu ra

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.

Ràng buộc

  • \(1 \le \mathbf{T} \le 100\).

Phân nhóm

  • Small dataset (Test set 1): \(1 \le \mathbf{k} \le 10\).
  • Large dataset (Test set 2): \(1 \le \mathbf{k} \le 51\).

Điểm các phân nhóm

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ụ

Ví dụ 1

Input
4
1
0
2
 1
2 2
 1
2
 1
1 2
 1
3
  1
 6 3
9 5 5
 6 3
  1
Output
Case #1: 0
Case #2: 0
Case #3: 5
Case #4: 7
Note

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.

Nguồn

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.

3. Google Code Jam 2010 - Grazing Google Goats

Điểm: 32 Thời gian: 1.0s Bộ nhớ: 1G Input: bàn phím Output: màn hình

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:

  • Tất cả các con dê đều cần có khả năng tiếp cận một máng nước duy nhất. Nông dân John vẫn chưa quyết định đặt máng nước này ở đâu. Ông đã thu hẹp lựa chọn xuống một tập hợp các vị trí \(\{Q_1, Q_2, \dots, Q_M\}\), nhưng ông không chắc nên sử dụng vị trí nào.
  • Những con dê này rất nóng tính, và khi chúng tụ tập lại với nhau, đôi khi chúng xảy ra những cuộc ẩu đả ồn ào. Để mọi người được yên tĩnh, Nông dân John muốn giảm thiểu diện tích \(A\)tất cả các con dê đều có thể tiếp cận được.

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.

Ví dụ

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\)\(Q_2\). Bạn cần tính \(A_1\)\(A_2\), diện tích của hai vùng được tô bóng.

Dữ liệu vào

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\)\(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\)\(y\) tương ứng của vị trí đó, cách nhau bởi một khoảng trắng.

Dữ liệu ra

Đố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.

Ràng buộc

  • Tất cả các tọa độ là số nguyên trong khoảng từ -10,000 đến 10,000.
  • Các vị trí \(P_1, P_2, \dots, P_N, Q_1, Q_2, \dots, Q_M\) đều phân biệt và không có ba điểm nào thẳng hàng.

Phân nhóm

  • Thông số Test 1 (Visible):

    • \(1 \le T \le 100\).
    • \(N = 2\).
    • \(1 \le M \le 10\).
    • Thông số Test 2 (Hidden):

    • \(1 \le T \le 10\).

    • \(2 \le N \le 5,000\).
    • \(1 \le M \le 1,000\).

Điểm các phân nhóm

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ụ

Ví dụ 1

Input
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
Output
Case #1: 1264.9865911 1713.2741229 0.2939440
Case #2: 1518.9063729 1193932.9692206
Case #3: 0.0

Nguồn

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.

4. Google Code Jam 2010 - World Cup 2010

Điểm: 25 Thời gian: 1.0s Bộ nhớ: 1G Input: bàn phím Output: màn hình

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.

Ví dụ

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\)\(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ữ liệu vào

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.

Dữ liệu 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.

Ràng buộc

  • \(1 \le T \le 50\).
  • \(1 \le P \le 10\).
  • Mỗi phần tử của \(M\) là một số nguyên từ \(0\) đến \(P\), bao gồm cả hai đầu.

Phân nhóm

  • Dữ liệu nhỏ (Test set 1 - Visible): Tất cả giá vé đều bằng 1.
  • Dữ liệu lớn (Test set 2 - Hidden): Tất cả giá vé là các số nguyên từ \(0\) đến \(100000\), bao gồm cả hai đầu.

Điểm các phân nhóm

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ụ

Ví dụ 1

Input
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
Output
Case #1: 2
Case #2: 1350

Nguồn

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.