Google Code Jam 2013 - Round 1A

Bộ đề bài

# Bài tập Điểm Thời gian: Giới hạn bộ nhớ
1 Google Code Jam 2013 - Bullseye 24 1.0s 1G
2 Google Code Jam 2013 - Good Luck 41 10.0s 1G
3 Google Code Jam 2013 - Manage your Energy 35 1.0s 1G

1. Google Code Jam 2013 - Bullseye

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

Maria đã được công ty Ghastly Chemicals Junkies (GCJ) thuê để giúp họ sản xuất các bullseye (bia bắn). Một bullseye bao gồm một số vòng tròn đồng tâm (các vòng tròn có cùng tâm) và nó thường đại diện cho một bia bắn cung. GCJ quan tâm đến việc sản xuất các bullseye đen trắng.

Maria bắt đầu với \(t\) ml sơn đen, cô ấy sẽ sử dụng để vẽ các vòng tròn có độ dày \(1\) cm. Một vòng tròn có độ dày \(1\) cm là phần diện tích nằm giữa hai đường tròn đồng tâm có bán kính chênh lệch nhau \(1\) cm.

Maria vẽ vòng đen đầu tiên bao quanh một hình tròn trắng có bán kính \(r\) cm. Sau đó, cô ấy lặp lại quy trình sau miễn là cô ấy còn đủ sơn để thực hiện:

  1. Maria tưởng tượng một vòng trắng có độ dày \(1\) cm bao quanh vòng đen cuối cùng.
  2. Sau đó, cô ấy vẽ một vòng đen mới có độ dày \(1\) cm bao quanh vòng trắng đó.

Lưu ý rằng mỗi "vòng trắng" chỉ đơn giản là khoảng trống giữa hai vòng đen.

Diện tích của một hình tròn bán kính \(1\) cm là \(\pi\) cm\(^2\). Một ml sơn có thể phủ được diện tích \(\pi\) cm\(^2\). Hỏi số lượng vòng đen tối đa mà Maria có thể vẽ là bao nhiêu? Vui lòng lưu ý:

  • Maria chỉ vẽ các vòng tròn hoàn chỉnh. Nếu lượng sơn còn lại không đủ để vẽ một vòng đen hoàn chỉnh, cô ấy sẽ dừng vẽ ngay lập tức.
  • Luôn có đủ sơn để vẽ ít nhất một vòng đen.

Dữ liệu vào

Dòng đầu tiên của dữ liệu vào cho biết số lượng bộ thử nghiệm, \(T\). \(T\) bộ thử nghiệm tiếp theo. Mỗi bộ thử nghiệm bao gồm một dòng chứa hai số nguyên cách nhau bởi dấu cách: \(r\)\(t\).

Dữ liệu ra

Với mỗi bộ thử nghiệm, hãy xuất một dòng chứa "Case #\(x\): \(y\)", trong đó \(x\) là số thứ tự bộ thử nghiệm (bắt đầu từ 1) và \(y\) là số lượng vòng đen tối đa Maria có thể vẽ.

Ràng buộc

Phân nhóm 1 (Tập thử nghiệm 1 - Hiển thị)
  • \(1 \le T \le 1000\).
  • \(1 \le r, t \le 1000\).
Phân nhóm 2 (Tập thử nghiệm 2 - Ẩn)
  • \(1 \le T \le 6000\).
  • \(1 \le r \le 10^{18}\).
  • \(1 \le t \le 2 \times 10^{18}\).

Phân nhóm

Các giới hạn của từng tập dữ liệu được nêu trong mục Ràng buộc.

Đ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 11/24 45,83%
Test Set 2 13/24 54,17%

Ví dụ

Ví dụ 1

Input
5
1 9
1 10
3 40
1 1000000000000000000
10000000000000000 1000000000000000000
Output
Case #1: 1
Case #2: 2
Case #3: 3
Case #4: 707106780
Case #5: 49

Nguồn

Google Code Jam 2013, Vòng 1A, bài Bullseye.

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 2013 - Good Luck

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

Maryam và Peiling gần đây đang thực hành một trò ảo thuật với các con số, và họ cần sự giúp đỡ của bạn để thực hiện chính xác. Trò chơi diễn ra như sau: Maryam bắt đầu bằng cách chọn N số nguyên ngẫu nhiên độc lập, mỗi số nằm trong khoảng từ 2 đến M (bao gồm cả hai đầu), xuất hiện với xác suất bằng nhau, và viết chúng lên N tấm thẻ, mỗi thẻ một số. Lưu ý rằng một số con số có thể giống nhau. Sau đó, cô ấy lặp lại các bước sau K lần: lấy một tập con ngẫu nhiên của các tấm thẻ (mỗi tấm thẻ được chọn với xác suất 0.5), và viết ra tích của các con số trên những tấm thẻ đó. Sau khi hoàn thành, cô ấy cho Peiling xem tất cả K tích số đó, và mục tiêu của Peiling là đoán xem N số ban đầu là gì, chỉ dựa vào N, M và các tích số.

Ví dụ về một trò chơi với \(N=3, M=4, K=4\) có thể diễn ra như sau: đầu tiên, Maryam chọn 3 số ngẫu nhiên từ 2 đến 4 — giả sử cô ấy chọn ngẫu nhiên \(A_1=3, A_2=3\)\(A_3=4\). Sau đó, cô ấy tính bốn tích của các tập con ngẫu nhiên từ ba số đó. Ví dụ, giả sử các tích đó là \(A_1 \times A_2=9\), \(A_3=4\), \(A_1 \times A_2 \times A_3=36\), và \(1=1\) (tích cuối cùng không có số nào, nên nó bằng 1). Peiling nhận được các số 9, 4, 36, 1 từ cô ấy, và cũng được biết rằng \(N=3\)\(M=4\). Trong trường hợp này, chỉ cần nhìn thấy số 36 là đủ để tìm ra các số ban đầu, vì cách duy nhất để biểu diễn số đó dưới dạng tích của tối đa 3 số, mỗi số tối đa là 4, là \(3 \times 3 \times 4\). Vì vậy, Peiling nói rằng các số ban đầu là 3, 3 và 4, và khán giả rất ấn tượng.

Trong một số trường hợp khác, việc đoán các số ban đầu không đơn giản như vậy. Ví dụ, có thể xảy ra trường hợp tất cả các tích đều bằng 1. Trong trường hợp đó, không có cách nào để biết bất cứ điều gì về các số ẩn, vì vậy Peiling không thể luôn luôn đúng. Tuy nhiên, Peiling biết rằng Maryam tuân thủ quy trình chính xác như mô tả ở trên: cô ấy chọn N số đầu tiên là các số nguyên độc lập phân phối đều từ 2 đến M, sau đó chọn K tập con ngẫu nhiên độc lập, chọn mỗi số vào mỗi tập con một cách độc lập với xác suất 0.5. Hãy giúp Peiling sử dụng kiến thức đó để đưa ra những dự đoán tốt hơn!

Giải quyết bài toán này

Bài toán này hơi bất thường đối với Code Jam. Bạn sẽ được cung cấp R bộ số độc lập, mỗi bộ gồm K số, và bạn nên in ra câu trả lời cho mỗi bộ — phần này giống như bình thường. Tuy nhiên, bạn không cần phải trả lời đúng tất cả các câu hỏi! Giải pháp của bạn sẽ được coi là đúng nếu câu trả lời cho ít nhất X bộ là chính xác, với giá trị X được cho trong phần Ràng buộc cho dữ liệu đầu vào tương ứng bên dưới. Tuy nhiên, bạn phải tuân thủ định dạng đầu ra, ngay cả đối với các bộ mà câu trả lời của bạn không chính xác. Điều duy nhất có thể sai ở bất kỳ bộ nào mà vẫn cho phép bạn được đánh giá là đúng là các chữ số bạn in ra; nhưng vẫn phải có chính xác N chữ số được in cho mỗi trường hợp, và mỗi chữ số phải nằm trong khoảng từ 2 đến M.

Bài toán này có yếu tố ngẫu nhiên, và do đó có thể xảy ra trường hợp ngay cả giải pháp tốt nhất có thể cũng không đưa ra được X dự đoán chính xác (hãy nhớ tình huống khi tất cả các tích đều bằng 1?) cho một dữ liệu đầu vào nhất định. Vì lý do đó, bài toán này không có dữ liệu đầu vào Lớn (Large), mà thay vào đó có hai dữ liệu đầu vào Nhỏ (Small). Điều đó có nghĩa là bạn có thể thử lại nếu bạn nghĩ rằng mình không may mắn. Bạn chỉ có thể thử giải dữ liệu Nhỏ thứ hai sau khi đã giải xong dữ liệu Nhỏ thứ nhất. Nếu không, cả hai dữ liệu Nhỏ đều hoạt động theo cách giống như dữ liệu Nhỏ cho bất kỳ bài toán nào khác: bạn có thể thử nhiều lần và sẽ bị phạt 4 phút cho các lần nộp bài sai nếu sau đó bạn giải được dữ liệu đó, ngay cả khi lý do duy nhất bạn làm sai là do may rủi.

Chúc may mắn!

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, luôn bằng 1. Dòng thứ hai của tệp đầu vào chứa bốn số nguyên cách nhau bởi dấu cách R, N, MK, theo thứ tự đó. R dòng tiếp theo mô tả một bộ gồm K tích số mỗi bộ. Mỗi dòng chứa K số nguyên cách nhau bởi dấu cách — các tích mà Maryam đưa cho Peiling. Đảm bảo rằng tất cả các bộ trong dữ liệu đầu vào được tạo ngẫu nhiên độc lập theo quy trình từ mô tả bài toán.

Dữ liệu ra

Trên dòng đầu tiên, in ra "Case #1:". Trên mỗi dòng trong R dòng tiếp theo, in ra N chữ số — dự đoán của bạn cho các số ẩn của Maryam cho bộ tích tương ứng. Bạn có thể in các số cho mỗi bộ theo bất kỳ thứ tự nào, nhưng phải có chính xác N chữ số, mỗi chữ số từ 2 đến M (lưu ý rằng \(M < 10\), vì vậy không có số nào nhiều hơn một chữ số). Không đặt dấu cách giữa các chữ số.

Ràng buộc

Phân nhóm

Dữ liệu Nhỏ thứ nhất (Test set 1 - Visible)

  • \(T = 1\).
  • \(R = 100\).
  • \(N = 3\).
  • \(M = 5\).
  • \(K = 7\).
  • Bạn cần trả lời đúng ít nhất \(X = 50\) bộ.

Dữ liệu Nhỏ thứ hai (Test set 2 - Visible)

  • \(T = 1\).
  • \(R = 8000\).
  • \(N = 12\).
  • \(M = 8\).
  • \(K = 12\).
  • Bạn cần trả lời đúng ít nhất \(X = 1120\) bộ.

Đ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/41 24,39%
Test Set 2 31/41 75,61%

Ví dụ

Ví dụ 1

Input
1
2 3 4 4
9 4 36 1
1 1 1 1
Output
Case #1:
343
222
Note

Dữ liệu mẫu không tuân theo các giới hạn của cả hai bộ dữ liệu. Trong dữ liệu mẫu, bạn cần trả lời đúng ít nhất \(X=1\) bộ.

Trong dữ liệu mẫu, Maryam đã chọn các số 3, 3, 4 lần đầu tiên, và các số 2, 4, 4 lần thứ hai. Trong đầu ra mẫu, Peiling đã đoán đúng lần đầu tiên, nhưng không đúng lần thứ hai.

Nguồn

Google Code Jam 2013, Vòng 1A, bài Good Luck.

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 2013 - Manage your Energy

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

Bạn có một lịch trình làm việc rất bận rộn vào ngày hôm nay, với đầy những hoạt động quan trọng cần thực hiện. Bạn đã chuẩn bị kỹ lưỡng để đảm bảo các hoạt động không bị chồng chéo. Bây giờ là buổi sáng, và bạn lo lắng rằng dù rất nhiệt huyết, bạn có thể không đủ năng lượng để hoàn thành tất cả các công việc với sự tập trung cao nhất.

Bạn sẽ phải quản lý năng lượng của mình một cách cẩn thận. Bạn bắt đầu ngày mới với mức năng lượng tối đa là \(E\) joules. Bạn biết rằng mình không thể để năng lượng xuống dưới 0 joules, nếu không bạn sẽ kiệt sức. Bạn có thể dành một lượng năng lượng là số nguyên không âm cho mỗi hoạt động (bạn có thể dành 0 joules nếu cảm thấy lười biếng). Sau mỗi hoạt động, bạn sẽ hồi phục lại \(R\) joules năng lượng. Tuy nhiên, dù bạn có lười biếng đến đâu, bạn không bao giờ có thể có nhiều hơn \(E\) joules năng lượng tại bất kỳ thời điểm nào; bất kỳ lượng năng lượng hồi phục nào vượt quá mức đó đều bị lãng phí.

Một số hoạt động (như giải các bài tập Code Jam) quan trọng hơn những hoạt động khác. Đối với hoạt động thứ \(i\), bạn có một giá trị \(v_i\) thể hiện mức độ quan trọng của hoạt động đó. Giá trị thu được từ mỗi hoạt động là tích của giá trị hoạt động đó với lượng năng lượng bạn đã bỏ ra (tính bằng joules). Bạn muốn quản lý năng lượng của mình sao cho tổng giá trị thu được là lớn nhất.

Lưu ý rằng bạn không thể thay đổi thứ tự các hoạt động trong lịch trình. Bạn chỉ cần quản lý năng lượng tốt nhất có thể với lịch trình đã có.

Dữ liệu vào

Dòng đầu tiên của dữ liệu vào cho biết số lượng bộ thử nghiệm, \(T\). \(T\) bộ thử nghiệm tiếp theo, mỗi bộ gồm hai dòng:

  • Dòng đầu tiên chứa ba số nguyên: \(E\), lượng năng lượng tối đa (và ban đầu), \(R\), lượng năng lượng hồi phục sau mỗi hoạt động, và \(N\), số lượng hoạt động được lập kế hoạch trong ngày.
  • Dòng thứ hai chứa \(N\) số nguyên \(v_i\), mô tả giá trị của các hoạt động đã lập kế hoạch.

Dữ liệu ra

Đối với mỗi bộ thử nghiệm, xuất một dòng chứa "Case #\(x\): \(y\)", trong đó \(x\) là số thứ tự bộ thử nghiệm (bắt đầu từ 1) và \(y\) là tổng giá trị lớn nhất bạn có thể đạt được.

Ràng buộc

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

Phân nhóm

  • Tập thử nghiệm 1 (Small):
    • \(1 \le E \le 5\).
    • \(1 \le R \le 5\).
    • \(1 \le N \le 10\).
    • \(1 \le v_i \le 10\).
  • Tập thử nghiệm 2 (Large):
    • \(1 \le E \le 10^7\).
    • \(1 \le R \le 10^7\).
    • \(1 \le N \le 10^4\).
    • \(1 \le v_i \le 10^7\).

Đ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 12/35 34,29%
Test Set 2 23/35 65,71%

Ví dụ

Ví dụ 1

Input
3
5 2 2
2 1
5 2 2
1 2
3 3 4
4 1 3 5
Output
Case #1: 12
Case #2: 12
Case #3: 39
Note
  • Trong trường hợp đầu tiên, chúng ta có thể dành toàn bộ 5 joules năng lượng cho hoạt động đầu tiên (thu được \(5 \times 2 = 10\)), hồi phục 2 và dành chúng cho hoạt động thứ hai (\(2 \times 1 = 2\)). Tổng cộng là 12.
  • Trong trường hợp thứ hai, chúng ta dành 2 joules cho hoạt động đầu tiên, hồi phục lại chúng, và dành 5 joules cho hoạt động thứ hai.
  • Trong trường hợp thứ ba, tốc độ hồi phục bằng với năng lượng tối đa, nghĩa là chúng ta luôn hồi phục đầy năng lượng sau mỗi hoạt động - vì vậy chúng ta có thể dành trọn 3 joules cho mỗi hoạt động.

Nguồn

Google Code Jam 2013, Vòng 1A, bài Manage your Energy.

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