Google Code Jam 2020 - Round 1C

Bộ đề bài

# Bài tập Điểm Thời gian: Giới hạn bộ nhớ
1 Google Code Jam 2020 - Overexcited Fan 22 1.0s 1G
2 Google Code Jam 2020 - Overrandomized 36 1.0s 1G
3 Google Code Jam 2020 - Oversized Pancake Choppers 42 15.0s 1G

1. Google Code Jam 2020 - Overexcited Fan

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

Người hâm mộ quá khích

Đề bài

Hôm nay sẽ là ngày ấy — hôm nay sẽ là ngày bạn cuối cùng cũng chụp được một bức ảnh với chú mèo Peppurr!

Người ta vừa thông báo rằng Peppurr sẽ đi lưu diễn quanh thành phố của bạn. Thành phố có vô hạn con đường dài vô hạn chạy theo hướng bắc–nam và vô hạn con đường dài vô hạn chạy theo hướng đông–tây. Một giao lộ là bất kỳ điểm nào mà một con đường bắc–nam gặp một con đường đông–tây. Từ một giao lộ bất kỳ, giao lộ gần nhất theo mỗi trong bốn hướng (bắc, đông, nam và tây) nằm cách đúng một khu phố.

Bạn biết chính xác lộ trình mà chuyến lưu diễn của Peppurr sẽ đi qua trên các con đường đó. Mục tiêu của bạn là có mặt tại một trong các giao lộ thuộc lộ trình của Peppurr đúng lúc Peppurr ở đó, và bạn muốn làm điều này sớm nhất có thể. Đó là cách bạn sẽ chụp được ảnh với Peppurr!

Chuyến lưu diễn của Peppurr bắt đầu tại một giao lộ nằm cách giao lộ nơi bạn đang đứng X khu phố về phía đông và Y khu phố về phía bắc. Cả bạn và Peppurr đều mất đúng một phút để đi hết một khu phố và phải kết thúc mỗi phút tại một giao lộ; không ai trong hai có thể chỉ đi một phần khu phố.

Peppurr di chuyển theo một lộ trình định trước. Trong mỗi phút, bạn có thể chọn đứng yên suốt phút đó, hoặc dùng phút đó để đi một khu phố theo một trong 4 hướng (bắc, đông, nam hoặc tây). Cả bạn và Peppurr chỉ đi dọc theo các con đường.

Nếu bạn và Peppurr ở cùng một giao lộ vào cùng một thời điểm, bạn có thể chụp ảnh, kể cả tại giao lộ cuối cùng của chuyến lưu diễn. Tuy nhiên, Peppurr không thể chụp ảnh sau khi chuyến lưu diễn kết thúc, vì vậy nếu bạn đến giao lộ cuối cùng chỉ muộn hơn thời điểm kết thúc dù một phút thì bạn cũng sẽ không chụp được ảnh.

Liệu bạn có thể chụp ảnh với Peppurr không? Nếu có, bạn có thể làm được sớm nhất sau bao lâu?

Dữ liệu vào

Dòng đầu tiên chứa số lượng bộ test T. Tiếp theo là T bộ test. Mỗi bộ test gồm một dòng chứa hai số nguyên X, Y và một chuỗi ký tự M. Điều này biểu thị rằng chuyến lưu diễn của Peppurr bắt đầu cách bạn đúng X khu phố về phía đông và Y khu phố về phía bắc. Chuỗi M là dãy các bước di chuyển mà Peppurr sẽ thực hiện. Ký tự thứ \(i\) trong M là một trong N, E, S hoặc W, tương ứng với hướng (lần lượt là bắc, đông, nam hoặc tây) mà Peppurr sẽ đi một khu phố trong phút thứ \(i\) của chuyến lưu diễn.

Dữ liệu ra

Với mỗi bộ test, in một dòng có dạng Case #x: y, trong đó x là số thứ tự của bộ test (bắt đầu từ 1). Nếu không có cách nào chụp ảnh với Peppurr, yIMPOSSIBLE. Nếu không, y là số phút nhỏ nhất tính từ lúc chuyến lưu diễn bắt đầu cần để chụp được ảnh với Peppurr.

Ràng buộc

  • \(1 \le T \le 100\).
  • \((X, Y) \ne (0, 0)\). (Chuyến lưu diễn không bắt đầu tại cùng giao lộ với bạn.)

Phân nhóm

Test Set 1 (Phán quyết hiển thị)

  • \(0 \le X \le 10\).
  • \(0 \le Y \le 10\).
  • \(1 \le\) độ dài của M \(\le 8\).
  • Mỗi ký tự trong M là một chữ cái in hoa — N hoặc S.

Test Set 2 (Phán quyết hiển thị)

  • \(0 \le X \le 1000\).
  • \(0 \le Y \le 1000\).
  • \(1 \le\) độ dài của M \(\le 1000\).
  • Mỗi ký tự trong M là một chữ cái in hoa — N hoặc S.

Test Set 3 (Phán quyết hiển thị)

  • \(0 \le X \le 1000\).
  • \(0 \le Y \le 1000\).
  • \(1 \le\) độ dài của M \(\le 1000\).
  • Mỗi ký tự trong M là một chữ cái in hoa — N, E, S hoặc W.

Đ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/22 18,18%
Test Set 2 6/22 27,27%
Test Set 3 12/22 54,55%

Ví dụ

Ví dụ 1

Input
5
4 4 SSSS
3 0 SNSS
2 10 NSNNSN
0 1 S
2 7 SSSSSSSS
Output
Case #1: 4
Case #2: IMPOSSIBLE
Case #3: IMPOSSIBLE
Case #4: 1
Case #5: 5
Giải thích

Trong trường hợp mẫu #1, bạn có thể đi bốn khu phố về phía đông và sẽ chụp được ảnh với Peppurr tại giao lộ cuối cùng của chuyến lưu diễn.

Trong trường hợp mẫu #2, chuyến lưu diễn bắt đầu cách bạn đúng ba khu phố về phía đông. Dù di chuyển thế nào, bạn cũng không thể chụp ảnh với Peppurr.

Trong trường hợp mẫu #3, chuyến lưu diễn ở quá xa về phía bắc nên bạn không thể chụp được ảnh trước khi chuyến lưu diễn kết thúc.

Trong trường hợp mẫu #4, chuyến lưu diễn sẽ đến chỗ bạn sau một phút, vì vậy bạn thậm chí không cần di chuyển! Hãy tận hưởng bức ảnh với Peppurr! Hãy nhớ rằng bạn chỉ có thể chụp ảnh tại các giao lộ; do đó, nếu bạn đi về phía bắc trong khi chuyến lưu diễn đi về phía nam, khiến bạn và Peppurr cắt ngang đường đi của nhau ở ngoài một giao lộ, bạn không thể chụp được ảnh sau 0,5 phút.

Trong trường hợp mẫu #5, bạn có thể đi về phía bắc hai lần, rồi về phía đông hai lần. Sau đó, bạn có thể đứng yên và sẽ chụp được ảnh với Peppurr trong phút tiếp theo. Có những lộ trình khác cũng giúp bạn chụp được ảnh với Peppurr sau 5 phút, nhưng không có lộ trình nào làm được sớm hơn.

Hai trường hợp sau không thể xuất hiện trong Test Set 1 hoặc Test Set 2, nhưng có thể xuất hiện trong Test Set 3:

2
3 2 SSSW
4 0 NESW

Kết quả đúng cho hai trường hợp này là:

Case #1: 4
Case #2: 4

Lưu ý rằng trong trường hợp #1, bạn có thể chụp ảnh với Peppurr tại vị trí cách điểm xuất phát ban đầu của bạn một khu phố về phía nam và hai khu phố về phía đông.

Trong trường hợp #2, Peppurr di chuyển theo một hình vuông nhỏ. Bạn có thể chụp ảnh khi Peppurr quay lại điểm xuất phát của hình vuông đó.

Nguồn

Google Code Jam 2020, Vòng 1C, bài Overexcited Fan.

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 2020 - Overrandomized

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

Overrandomized

Đề bài

Lưu ý: Mỗi khi đề bài nói một thứ được chọn ngẫu nhiên, điều đó có nghĩa là thứ ấy được chọn theo phân phối đều trên tất cả các khả năng hợp lệ và độc lập với mọi lựa chọn khác.

Công ty Banana Rocks Inc. vừa viết một dịch vụ sinh số ngẫu nhiên cao cấp trên nền tảng đám mây, được kỳ vọng sẽ trở thành tiêu chuẩn vàng mới về tính ngẫu nhiên.

Thiết kế ban đầu là một nhóm máy chủ sẽ nhận yêu cầu dưới dạng một số nguyên dương duy nhất \(M\) có không quá U chữ số thập phân, rồi trả về một số nguyên được chọn ngẫu nhiên trong đoạn từ \(1\) đến \(M\), kể cả hai đầu mút. Tuy nhiên, thay vì viết kết quả bằng các chữ số từ \(0\) đến \(9\) như thông thường, các máy chủ đã bị "ngẫu nhiên hóa quá mức". Mỗi máy chủ có một tập ngẫu nhiên gồm \(10\) chữ cái tiếng Anh in hoa đôi một khác nhau để dùng làm chữ số, cùng một ánh xạ ngẫu nhiên từ các chữ cái ấy tới các giá trị phân biệt trong khoảng từ \(0\) đến \(9\).

Mô tả chính thức của tình huống hiện tại như sau: mỗi máy chủ có một chuỗi chữ số \(D\) gồm đúng \(10\) chữ cái tiếng Anh in hoa khác nhau. Chuỗi chữ số xác định ánh xạ giữa các chữ cái và các chữ số hệ cơ số 10: ký tự thứ \(j\) tính từ trái sang của \(D\) (đánh số từ \(0\)) là chữ số hệ cơ số 10 có giá trị \(j\). Ví dụ, nếu \(D\)CODEJAMFUN thì C biểu diễn chữ số \(0\), O biểu diễn chữ số \(1\)N biểu diễn chữ số \(9\). Khi dùng chuỗi chữ số đó, số \(379009\) sẽ được mã hóa thành EFNCCN.

Khi nhận truy vấn thứ \(i\) với tham số nguyên \(M_i\), máy chủ:

  • chọn ngẫu nhiên một số nguyên \(N_i\) trong đoạn từ \(1\) đến \(M_i\), kể cả hai đầu mút;
  • viết số đó thành một chuỗi trong hệ cơ số 10 không có chữ số \(0\) ở đầu, dùng ký tự thứ \(j\) của \(D\) (đánh số từ \(0\)) làm chữ số có giá trị \(j\); và
  • trả về chuỗi thu được làm phản hồi \(R_i\).

Chúng tôi đã thu thập một số dữ liệu mà chúng tôi tin rằng có thể dùng để khôi phục chuỗi chữ số bí mật \(D\) của từng máy chủ. Chúng tôi gửi \(10^4\) truy vấn đến mỗi máy chủ. Với mỗi truy vấn, chúng tôi chọn ngẫu nhiên một giá trị \(M_i\) trong đoạn từ \(1\) đến \(10^{\mathbf{U}}-1\), kể cả hai đầu mút, và nhận phản hồi \(R_i\), là một chuỗi có không quá U chữ cái tiếng Anh in hoa. Chúng tôi ghi lại các cặp \((M_i, \mathbf{R_i})\). Trong lúc chuyển các bản ghi này sang một thiết bị lưu trữ dữ liệu mới, giá trị của tất cả các số nguyên \(M_i\) trong bản ghi của một số máy chủ đã bị hỏng và không thể đọc được.

Bạn có thể giúp chúng tôi tìm chuỗi chữ số \(D\) của từng máy chủ không?

Dữ liệu vào

Dòng đầu tiên cho biết số lượng bộ test T. Sau đó là T bộ test. Mỗi bộ test chứa các bản ghi của một máy chủ và bắt đầu bằng một dòng chứa số nguyên duy nhất U, biểu thị rằng \(10^{\mathbf{U}}-1\) là cận trên (có tính cả cận) của miền mà từ đó chúng tôi chọn các số nguyên \(M_i\) để truy vấn máy chủ ấy. Tiếp theo là đúng \(10^4\) dòng. Mỗi dòng chứa một số nguyên \(Q_i\) (trong hệ cơ số 10, dùng các chữ số từ \(0\) đến \(9\) như thông thường) và một chuỗi \(R_i\), lần lượt biểu diễn truy vấn và phản hồi thứ \(i\). Nếu \(Q_i\) \(= -1\) thì số nguyên \(M_i\) được dùng cho truy vấn thứ \(i\) là không xác định. Nếu không, \(Q_i\) \(= M_i\).

Dữ liệu ra

Với mỗi bộ test, in một dòng có dạng Case #x: y, trong đó x là số thứ tự của bộ test (bắt đầu từ \(1\)) và y là chuỗi chữ số \(D\) của máy chủ được xét trong bộ test x.

Ràng buộc

  • \(1 \le \mathbf{T} \le 10\).
  • \(D\) là một chuỗi gồm đúng \(10\) chữ cái tiếng Anh in hoa khác nhau, được chọn độc lập và theo phân phối đều từ tập tất cả các chuỗi như vậy.
  • Với mọi \(i\), \(M_i\) được chọn độc lập và theo phân phối đều trong đoạn từ \(1\) đến \(10^{\mathbf{U}}-1\), kể cả hai đầu mút.
  • Với mọi \(i\), \(N_i\) được chọn độc lập và theo phân phối đều trong đoạn từ \(1\) đến \(M_i\), kể cả hai đầu mút.
  • Với mọi \(i\), \(R_i\) là biểu diễn trong hệ cơ số 10 của \(N_i\), dùng ký tự thứ \(j\) tính từ trái sang của \(D\) (đánh số từ \(0\)) làm chữ số có giá trị \(j\).

Phân nhóm

Test Set 1 (Hiển thị kết quả chấm)

  • \(Q_i\) \(= M_i\) với mọi \(i\).
  • U \(= 2\).

Test Set 2 (Hiển thị kết quả chấm)

  • \(Q_i\) \(= M_i\) với mọi \(i\).
  • U \(= 16\).

Test Set 3 (Hiển thị kết quả chấm)

  • \(Q_i\) \(= -1\) với mọi \(i\).
  • U \(= 16\).

Đ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/36 25%
Test Set 2 10/36 27,78%
Test Set 3 17/36 47,22%

Ví dụ

Ví dụ 1

Input
1
2
20 P
-------------------------------
Đã lược bỏ 9999 dòng dữ liệu vào.
Hãy dùng nút tải xuống ở phía trên
để xem toàn bộ dữ liệu vào mẫu.
-------------------------------
Output
Case #1: TPFOXLUSHB
Giải thích

Dữ liệu vào mẫu quá lớn để hiển thị trực tiếp, vì vậy chúng tôi cung cấp các tệp có thể tải xuống cho dữ liệu vàodữ liệu ra.

Nguồn

Google Code Jam 2020, Vòng 1C, bài Overrandomized.

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 2020 - Oversized Pancake Choppers

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

Đề bài

Bạn vừa đến nhận việc bếp trưởng tại Nhà Bánh kếp Vô hạn và, như thường lệ, bắt gặp một thảm họa đang diễn ra! Các đầu bếp khác đã vô tình làm ra một số chiếc bánh kếp hình tròn khổng lồ, tất cả đều có cùng kích thước. Những chiếc bánh này quá lớn để phục vụ nguyên chiếc, nên họ đã bắt đầu chặt chúng thành các miếng (trong bài này, các miếng là những hình quạt tròn). Hiện tại, bạn có \(N\) miếng; miếng thứ \(i\) là một hình quạt có góc trong (góc ở tâm) bằng \(A_i\) nanođộ (một nanođộ bằng \(10^{-9}\) độ).

\(D\) thực khách đang chờ món. Mỗi thực khách muốn nhận đúng một miếng có cùng kích thước với miếng của mọi thực khách khác, nhưng họ không quan tâm kích thước đó cụ thể là bao nhiêu. Tuy nhiên, có thể không thực hiện được điều này bằng các miếng hiện có, nên bạn có thể cần thực hiện một hoặc nhiều nhát cắt theo bán kính.

Một nhát cắt biến một miếng hiện có với góc trong \(X\) thành hai miếng mới có góc trong \(Y\)\(X-Y\). Bạn có thể làm vậy với bất kỳ \(0<Y<X\) nào, và các giá trị này không nhất thiết phải là số nguyên. Bạn có thể tiếp tục cắt một hoặc cả hai miếng mới này, rồi cứ thế tiếp tục.

Bạn được phép để thừa một hoặc nhiều miếng (với kích thước bất kỳ) mà không đưa cho thực khách; bạn có thể ăn chúng sau, vì thảm họa này đang khiến bạn lỡ mất bữa sáng của chính mình!

Hãy xác định tổng số nhát cắt ít nhất cần thực hiện để đáp ứng các thực khách.

Dữ liệu vào

Dòng đầu tiên chứa số bộ test \(T\). Tiếp theo là \(T\) bộ test. Mỗi bộ bắt đầu bằng một dòng chứa hai số nguyên \(N\)\(D\): số miếng hiện có và số thực khách. Sau đó là một dòng nữa chứa \(N\) số nguyên \(A_1,A_2,\ldots,A_N\); số thứ \(i\) biểu diễn góc trong (tính bằng nanođộ) của miếng thứ \(i\).

Dữ liệu ra

Với mỗi bộ test, in một dòng chứa Case #x: y, trong đó x là số thứ tự bộ test (bắt đầu từ \(1\)), còn y là số nhát cắt nhỏ nhất cần thực hiện như mô tả ở trên.

Ràng buộc

  • \(1\le T\le100\).
  • \(1\le A_i<360\times10^9\) với mọi \(i\).

Phân nhóm

Test Set 1 (Phán quyết hiển thị)

  • \(1\le N\le300\).
  • \(2\le D\le3\).

Test Set 2 (Phán quyết hiển thị)

  • \(1\le N\le300\).
  • \(2\le D\le50\).

Test Set 3 (Phán quyết ẩn)

  • Với đúng \(21\) bộ test, \(9000\le N\le10000\).
  • Với đúng \(T-21\) bộ test, \(1\le N\le1000\).
  • \(2\le D\le50\).

Đ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/42 23,81%
Test Set 2 16/42 38,1%
Test Set 3 16/42 38,09%

Ví dụ

Ví dụ 1

Dữ liệu mẫu và phần giải thích chính thức được trình bày đầy đủ ngay bên dưới.

Giải thích

Input

4
1 3
1
5 2
10 5 359999999999 123456789 10
2 3
8 4
3 2
1 2 3

Output

Case #1: 2
Case #2: 0
Case #3: 1
Case #4: 1

Trong bộ test mẫu số 1, ban đầu bạn chỉ có một miếng rất nhỏ. Lời giải tối ưu là dùng một nhát cắt để biến nó thành hai miếng có góc \(1/3\) nanođộ và \(2/3\) nanođộ, rồi cắt tiếp miếng sau thành hai miếng nữa, mỗi miếng có góc \(1/3\) nanođộ.

Trong bộ test mẫu số 2, bạn đã có hai miếng cùng kích thước, nên có thể đưa chúng cho hai thực khách mà không cần thực hiện nhát cắt nào.

Trong bộ test mẫu số 3, lời giải tối ưu là cắt đôi miếng có góc trong \(8\) nanođộ. Sau thao tác đó, bạn có đúng \(3\) miếng với góc trong \(4\) nanođộ và không còn phần thừa.

Trong bộ test mẫu số 4, hãy nhớ rằng mỗi thực khách phải nhận đúng một miếng. Bạn không thể đưa miếng 3 cho một thực khách và hai miếng 1, 2 cho thực khách còn lại, dù tổng diện tích bằng nhau. Trong trường hợp này, bạn phải thực hiện ít nhất một nhát cắt để đáp ứng yêu cầu.

Nguồn

Google Code Jam 2020, Vòng 1C, bài Oversized Pancake Choppers.

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