Google Code Jam 2010 - Round 1C

Bộ đề bài

# Bài tập Điểm Thời gian: Giới hạn bộ nhớ
1 Google Code Jam 2010 - Load Testing 36 1.0s 1G
2 Google Code Jam 2010 - Making Chess Boards 42 1.0s 1G
3 Google Code Jam 2010 - Rope Intranet 22 1.0s 1G

1. Google Code Jam 2010 - Load Testing

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

Sau khi bạn giành chiến thắng tại Code Jam và được Google tuyển dụng làm kỹ sư phần mềm, bạn đã được giao nhiệm vụ làm việc trên trang web tổ chức các cuộc thi lập trình cực kỳ phổ biến của họ.

Google đang mong đợi một lượng lớn người tham gia (\(P\)) trong Code Jam năm tới và họ muốn đảm bảo rằng trang web có thể hỗ trợ cùng lúc bấy nhiêu người đó. Trong Code Jam 2010, bạn đã biết rằng trang web có thể hỗ trợ ít nhất \(L\) người cùng lúc mà không gặp bất kỳ lỗi nào, nhưng bạn cũng biết rằng trang web hiện tại chưa thể hỗ trợ \(P\) người.

Để xác định xem bạn sẽ cần thêm bao nhiêu máy chủ, bạn muốn biết trong phạm vi một hệ số \(C\) xem trang web có thể hỗ trợ bao nhiêu người. Điều này có nghĩa là tồn tại một số nguyên \(a\) sao cho bạn biết trang web có thể hỗ trợ \(a\) người, nhưng bạn biết trang web không thể hỗ trợ \(a \times C\) người.

Bạn có thể thực hiện một loạt các bài kiểm tra tải (load tests), mỗi bài kiểm tra sẽ xác định xem trang web có thể hỗ trợ ít nhất \(X\) người hay không, với một giá trị nguyên \(X\) bất kỳ mà bạn chọn. Nếu bạn chọn một chiến lược tối ưu, chọn bài kiểm tra nào để chạy dựa trên kết quả của các bài kiểm tra trước đó, bạn cần bao nhiêu bài kiểm tra tải trong trường hợp xấu nhất?

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\) dòng tiếp theo, mỗi dòng chứa các số nguyên \(L, P\)\(C\) cách nhau bởi dấu cách theo đúng thứ tự đó.

Dữ liệu ra

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 bài kiểm tra tải bạn cần thực hiện trong trường hợp xấu nhất trước khi biết được trong phạm vi hệ số \(C\) số người mà trang web có thể hỗ trợ.

Ràng buộc

  • \(1 \le T \le 1000\).
  • \(2 \le C \le 10\).
  • \(L, P\)\(C\) đều là các số nguyên.

Phân nhóm

  • Small dataset (Test set 1): \(1 \le L < P \le 10^3\).
  • Large dataset (Test set 2): \(1 \le L < P \le 10^9\).

Đ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 14/36 38,89%
Test Set 2 22/36 61,11%

Ví dụ

Ví dụ 1

Input
4
50 700 2
19 57 3
1 1000 2
24 97 2
Output
Case #1: 2
Case #2: 0
Case #3: 4
Case #4: 2
Note
  • Trong Case #2, chúng ta đã biết trang web có thể hỗ trợ từ 19 đến 57 người. Vì các giá trị này nằm trong hệ số 3 (\(19 \times 3 = 57\)), chúng ta không cần thực hiện thêm bài kiểm tra nào.
  • Trong Case #4, chúng ta có thể kiểm tra 48; nhưng nếu trang web hỗ trợ được 48 người, chúng ta cần kiểm tra thêm, vì \(48 \times 2 < 97\). Chúng ta có thể kiểm tra 49; nhưng nếu trang web không hỗ trợ được 49 người, chúng ta cần kiểm tra thêm, vì \(24 \times 2 < 49\). Do đó, chúng ta cần hai bài kiểm tra.

Nguồn

Google Code Jam 2010, Vòng 1C, bài Load Testing.

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 - Making Chess Boards

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

Ngành công nghiệp bàn cờ đang rơi vào thời kỳ khó khăn và cần sự giúp đỡ của bạn. Một sự thật ít người biết là bàn cờ được làm từ vỏ của loài cây Bàn cờ Croatia cực kỳ quý hiếm (Biggus Mobydiccus). Vỏ của loài cây đó được bóc ra và trải phẳng thành một tấm vật liệu làm bàn cờ hình chữ nhật khổng lồ. Hình chữ nhật này là một lưới các ô vuông đen và trắng.

Nhiệm vụ của bạn là tạo ra càng nhiều bàn cờ hình vuông lớn càng tốt. Một bàn cờ là một phần của vỏ cây có hình vuông, với các cạnh song song với các cạnh của hình chữ nhật vỏ cây, và các ô được tô màu theo quy luật bàn cờ (không có hai ô cùng màu nào được chung cạnh).

Mỗi lần cắt ra một bàn cờ, bạn phải chọn bàn cờ lớn nhất có thể còn lại trong tấm vỏ cây. Nếu có nhiều bàn cờ như vậy, hãy chọn bàn cờ ở trên cùng nhất. Nếu vẫn còn nhiều lựa chọn, hãy chọn bàn cờ ở bên trái nhất. Tiếp tục cắt các bàn cờ cho đến khi không còn vỏ cây nào. Bạn có thể cần phải cắt đến cả những bàn cờ mini kích thước 1x1.

Dưới đây là một ví dụ cho thấy vỏ của cây Bàn cờ và một vài bàn cờ đầu tiên sẽ được cắt ra từ đó.

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 kích thước của lưới vỏ cây, \(M\)\(N\). \(N\) sẽ luôn là bội số của 4. \(M\) dòng tiếp theo, mỗi dòng chứa một số nguyên hệ thập lục phân gồm \(N/4\) ký tự, đại diện cho một hàng của lưới vỏ cây. Biểu diễn nhị phân của các số nguyên này sẽ cho bạn các chuỗi \(N\) bit, mỗi bit cho một hàng. Số 0 đại diện cho ô đen; số 1 đại diện cho ô trắng của lưới. Các hàng được đưa ra trong dữ liệu vào từ trên xuống dưới. Trong mỗi hàng, bit có ý nghĩa lớn nhất (MSB) của số nguyên hệ thập lục phân tương ứng với ô bên trái nhất trong hàng đó.

Dữ liệu ra

Đối với mỗi bộ test, hãy xuất một dòng chứa "Case #x: \(K\)", trong đó x là số thứ tự bộ test (bắt đầu từ 1) và \(K\) là số lượng các kích thước bàn cờ khác nhau mà bạn có thể cắt ra theo quy trình mô tả ở trên. \(K\) dòng tiếp theo, mỗi dòng chứa hai số nguyên -- kích thước của bàn cờ (từ lớn nhất đến nhỏ nhất) và số lượng bàn cờ có kích thước đó mà bạn có thể cắt ra.

Ràng buộc

  • \(1 \le T \le 100\);
  • \(N\) chia hết cho 4;
  • Mỗi số nguyên hệ thập lục phân sẽ chứa chính xác \(N/4\) ký tự.
  • Chỉ các ký tự 0-9 và A-F được sử dụng.

Phân nhóm

  • Small dataset (Test set 1): \(1 \le M \le 32\); \(1 \le N \le 32\).
  • Large dataset (Test set 2): \(1 \le M \le 512\); \(1 \le N \le 512\); Kích thước tệp đầu vào tối đa 200kB.

Đ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 18/42 42,86%
Test Set 2 24/42 57,14%

Ví dụ

Ví dụ 1

Input
4
15 20
55555
FFAAA
2AAD5
D552A
2AAD5
D542A
4AD4D
B52B2
52AAD
AD552
AA52D
AAAAA
5AA55
A55AA
5AA55
4 4
0
0
0
0
4 4
3
3
C
C
4 4
6
9
9
6
Output
Case #1: 5
6 2
4 3
3 7
2 15
1 57
Case #2: 1
1 16
Case #3: 2
2 1
1 12
Case #4: 1
2 4
Note

Ví dụ đầu tiên tương ứng với hình ảnh minh họa ở trên.

Nguồn

Google Code Jam 2010, Vòng 1C, bài Making Chess Boards.

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 - Rope Intranet

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

Một công ty tọa lạc trong hai tòa nhà rất cao. Mạng nội bộ của công ty kết nối hai tòa nhà bao gồm nhiều sợi dây cáp, mỗi sợi nối một cửa sổ ở tòa nhà thứ nhất với một cửa sổ ở tòa nhà thứ hai.

Bạn đang quan sát những tòa nhà này từ bên cạnh, sao cho một tòa nhà ở bên trái và một tòa nhà ở bên phải. Các cửa sổ trên tòa nhà bên trái được xem như các điểm trên bức tường bên phải của nó, và các cửa sổ trên tòa nhà bên phải được xem như các điểm trên bức tường bên trái của nó. Các sợi dây là các đoạn thẳng nối một cửa sổ ở tòa nhà bên trái với một cửa sổ ở tòa nhà bên phải.

Bạn nhận thấy rằng không có hai sợi dây nào dùng chung một điểm đầu mút (nói cách khác, có tối đa một sợi dây đi ra từ mỗi cửa sổ). Tuy nhiên, từ góc nhìn của bạn, một số sợi dây cắt nhau ở giữa chừng. Bạn cũng nhận thấy rằng tại mỗi giao điểm chỉ có đúng hai sợi dây gặp nhau.

Trong hình trên, các giao điểm là các hình tròn màu đen, trong khi các cửa sổ là các hình tròn màu trắng.

Có bao nhiêu giao điểm mà bạn nhìn thấy?

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\). Tiếp theo là \(T\) bộ test. Mỗi bộ test bắt đầu bằng một dòng chứa một số nguyên \(N\), biểu thị số lượng sợi dây bạn nhìn thấy.

\(N\) dòng tiếp theo, mỗi dòng mô tả một sợi dây bằng hai số nguyên \(A_i\)\(B_i\). Chúng mô tả các cửa sổ mà sợi dây này kết nối: \(A_i\) là độ cao của cửa sổ trên tòa nhà bên trái, và \(B_i\) là độ cao của cửa sổ trên tòa nhà bên phải.

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ố lượng giao điểm bạn nhìn thấy.

Ràng buộc

  • \(1 \le T \le 15\).
  • \(1 \le A_i \le 10^4\).
  • \(1 \le B_i \le 10^4\).
  • Trong mỗi bộ test, tất cả các \(A_i\) đều khác nhau.
  • Trong mỗi bộ test, tất cả các \(B_i\) đều khác nhau.
  • Không có ba sợi dây nào cắt nhau tại cùng một điểm.

Phân nhóm

  • Tập kiểm thử 1 (Small - Visible): \(1 \le N \le 2\).
  • Tập kiểm thử 2 (Large - Hidden): \(1 \le N \le 1000\).

Đ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 9/22 40,91%
Test Set 2 13/22 59,09%

Ví dụ

Ví dụ 1

Input
2
3
1 10
5 5
7 7
2
1 1
2 2
Output
Case #1: 2
Case #2: 0

Nguồn

Google Code Jam 2010, Vòng 1C, bài Rope Intranet.

Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.