Google Code Jam 2021 - Append Sort

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

Ta có một danh sách các số nguyên \(X_1,X_2,\ldots,X_N\). Ta muốn chúng theo thứ tự tăng nghiêm ngặt, nhưng không được phép đổi thứ tự các phần tử, nên các thuật toán sắp xếp thông thường không dùng được.

Lựa chọn duy nhất là thay đổi các số bằng cách nối các chữ số từ \(0\) đến \(9\) vào bên phải biểu diễn thập phân của chúng. Chẳng hạn, từ số \(10\), một thao tác có thể biến nó thành \(10\mathbf0\) hoặc \(10\mathbf9\); hai thao tác có thể biến nó thành \(10\mathbf{34}\), như hình dưới.

Cho danh sách hiện tại, cần ít nhất bao nhiêu thao tác nối một chữ số để danh sách trở thành tăng nghiêm ngặt? Ví dụ, với danh sách \(100,7,10\), ta có thể dùng tổng cộng \(4\) thao tác để tạo một danh sách đã sắp xếp như hình:

Dữ liệu vào

Dòng đầu chứa số bộ dữ liệu \(T\). Mỗi bộ được mô tả trên hai dòng. Dòng đầu chứa một số nguyên \(N\), là số phần tử của danh sách. Dòng thứ hai chứa \(N\) số nguyên \(X_1,X_2,\ldots,X_N\), là các phần tử theo đúng thứ tự đã cho.

Dữ liệu ra

Với mỗi bộ dữ liệu, in Case #x: y, trong đó \(x\) là số thứ tự bộ dữ liệu (bắt đầu từ \(1\)), còn \(y\) là số thao tác nối một chữ số ít nhất cần dùng để danh sách tăng nghiêm ngặt.

Ràng buộc

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

Phân nhóm

  • Test Set 1 (Visible Verdict): \(2\le N\le3\); \(1\le X_i\le100\) với mọi \(i\).
  • Test Set 2 (Visible Verdict): \(2\le N\le100\); \(1\le X_i\le10^9\) với mọi \(i\).

Đ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/26 46,15%
Test Set 2 14/26 53,85%

Ví dụ

Ví dụ 1

Input
4
3
100 7 10
2
10 10
3
4 19 1
3
1 2 3
Output
Case #1: 4
Case #2: 1
Case #3: 2
Case #4: 0
Giải thích
  • Bộ dữ liệu mẫu #1 là ví dụ trong đề. Như hình vẽ, có thể sắp xếp danh sách bằng \(4\) thao tác. Hai số cuối phải có ít nhất \(3\) chữ số, tổng cộng cần ít nhất \(3\) lần nối cho chúng. Nếu mọi số cuối cùng đều có đúng ba chữ số, số thứ hai sẽ lớn hơn số thứ ba vì bắt đầu bằng \(7\) thay vì \(1\); do đó không thể dùng ít hơn \(4\) thao tác.
  • Trong bộ dữ liệu mẫu #2, thứ tự phải tăng nghiêm ngặt, nên cần ít nhất một thao tác. Mọi chữ số nối hợp lệ vào số thứ hai đều được.
  • Trong bộ dữ liệu mẫu #3, dùng hai thao tác để thu được \(4,19,19\mathbf3\).
  • Trong bộ dữ liệu mẫu #4, danh sách đã tăng nghiêm ngặt nên không cần thao tác.

Nguồn

Google Code Jam 2021, Vòng 1A, bài Append Sort.

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: