Google Code Jam 2011 - GoroSort

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: 1300 Thời gian: 1.0s Bộ nhớ: 1G Input: bàn phím Output: màn hình

GoroSort

Đề bài

Goro có 4 cánh tay. Goro rất khỏe. Bạn không nên gây sự với Goro. Goro cần sắp xếp một mảng gồm \(N\) số nguyên khác nhau. Thuật toán không phải là thế mạnh của Goro; sức mạnh mới là thế mạnh của Goro. Kế hoạch của Goro là sử dụng các ngón tay trên hai bàn tay của mình để giữ chặt một vài phần tử của mảng và đấm vào bàn bằng nắm đấm thứ ba và thứ tư mạnh nhất có thể. Điều này sẽ làm cho các phần tử không được giữ chặt bay lên không trung, bị xáo trộn ngẫu nhiên và rơi trở lại các vị trí trống trong mảng.

Goro muốn sắp xếp mảng nhanh nhất có thể. Trung bình sẽ mất bao nhiêu lần đấm để Goro sắp xếp mảng đã cho, nếu anh ta hành động thông minh khi chọn phần tử nào của mảng để giữ chặt trước mỗi lần đấm vào bàn? Goro có vô số ngón tay trên hai bàn tay mà anh ta dùng để giữ mảng.

Chính xác hơn, trước mỗi lần đấm, Goro có thể chọn bất kỳ tập con nào của các phần tử trong mảng để giữ cố định tại chỗ. Anh ta có thể chọn khác nhau tùy thuộc vào kết quả của các lần đấm trước đó. Mỗi lần đấm sẽ hoán vị các phần tử không được giữ một cách ngẫu nhiên đồng nhất. Mỗi hoán vị đều có khả năng xảy ra như nhau.

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 gồm hai dòng. Dòng đầu tiên cho biết số \(N\). Dòng thứ hai liệt kê \(N\) phần tử của mảng theo thứ tự ban đầu của chúng.

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ần đấm bàn kỳ vọng khi thực hiện chiến lược giữ phần tử tối ưu nhất. Các câu trả lời có sai số tuyệt đối hoặc tương đối không quá \(10^{-6}\) sẽ được coi là chính xác.

Ràng buộc

  • \(1 \le T \le 100\);
  • Dòng thứ hai của mỗi bộ test sẽ chứa một hoán vị của \(N\) số nguyên dương nhỏ nhất.

Phân nhóm

  • Test set 1 (Visible): \(1 \le N \le 10\).
  • Test set 2 (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 10/30 33,33%
Test Set 2 20/30 66,67%

Ví dụ

Ví dụ 1

Input
3
2
2 1
3
1 3 2
4
2 1 4 3
Output
Case #1: 2.000000
Case #2: 2.000000
Case #3: 4.000000
Note

Trong bộ test #3, một chiến lược khả thi là giữ chặt hai phần tử ngoài cùng bên trái trước. Các phần tử 3 và 4 sẽ tự do di chuyển. Sau một lần đấm bàn, chúng sẽ rơi xuống đúng thứ tự \([3, 4]\) với xác suất \(1/2\) và sai thứ tự \([4, 3]\) với xác suất \(1/2\). Do đó, trung bình sẽ mất 2 lần đấm để sắp xếp chúng đúng thứ tự. Sau đó, Goro có thể giữ chặt các phần tử 3 và 4 và đấm bàn cho đến khi 1 và 2 rơi xuống đúng thứ tự, việc này sẽ mất thêm trung bình 2 lần đấm nữa. Tổng cộng là \(2 + 2 = 4\) lần đấm.

Nguồn

Google Code Jam 2011, Vòng loại, bài GoroSort.

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: