Google Code Jam 2020 - Oversized Pancake Choppers

Xem PDF




Dạng bài
Ngôn ngữ cho phép
Assembly, Awk, C, C#, C++, Clang, Cobol, D, Groovy, Haskell, JS, Java, Kotlin, Lua, Node JS, OCaml, ObjectiveC, PHP, Pascal, Perl, Prolog, Pypy, Pypy 3, Python, Ruby, Rust, Scala, Scratch, Swift
Điểm: 2300 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.

Bình luận

Mới nhất
Tải bình luận...

Không có bình luận nào.

Kỳ thi: