Google Code Jam 2021 - Double or NOTing

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

Bạn được cho số nguyên không âm ban đầu \(S\) và số nguyên không âm đích \(E\), cả hai ở dạng biểu diễn nhị phân. Mục tiêu là biến đổi \(S\) thành \(E\) bằng hai thao tác:

  1. Double: nhân giá trị hiện tại với \(2\).
  2. NOT: lấy phủ định theo bit của giá trị hiện tại. Biểu diễn nhị phân trước thao tác không chứa số \(0\) thừa ở đầu; mọi số \(0\) thừa sinh ra sau thao tác cũng bị bỏ. Số \(0\) duy nhất trong biểu diễn của giá trị \(0\) là số \(0\) cần thiết.

Ví dụ, Double biến \(6\) thành \(12\), \(0\) thành \(0\), \(10\) thành \(20\). NOT biến \(0\) thành \(1\), \(1\) thành \(0\), \(3=11_2\) thành \(0\), \(14=1110_2\) thành \(1\), \(10=1010_2\) thành \(5=101_2\), và \(5=101_2\) thành \(2=10_2\). Ký hiệu \(X_2\) chỉ số có biểu diễn nhị phân \(X\).

Bạn có thể dùng hai thao tác bao nhiêu lần tùy ý theo bất kỳ thứ tự nào. Ví dụ:

\[10001_2\xRightarrow{\mathrm{NOT}}1110_2\xRightarrow{\times2}11100_2\xRightarrow{\times2}111000_2\xRightarrow{\mathrm{NOT}}111_2.\]

Hãy tìm số thao tác ít nhất để hoàn tất biến đổi, hoặc cho biết điều đó là không thể.

Dữ liệu vào

Dòng đầu chứa số bộ dữ liệu \(T\). Mỗi bộ gồm một dòng chứa hai xâu \(S,E\), là biểu diễn nhị phân của số đầu và số đích.

Dữ liệu ra

Với mỗi bộ dữ liệu, in Case #x: y, trong đó \(x\) là số thứ tự (bắt đầu từ \(1\)). Nếu không thể biến \(S\) thành \(E\), \(y\)IMPOSSIBLE; nếu có thể, \(y\) là số thao tác nhỏ nhất.

Ràng buộc

  • \(1\le T\le100\).
  • Mỗi ký tự của \(S\)\(E\)0 hoặc 1.
  • Ký tự đầu của \(S\) (tương tự của \(E\)) chỉ có thể là 0 khi xâu có độ dài \(1\).

Phân nhóm

  • Test Set 1 (Visible Verdict): \(1\le|S|,|E|\le8\).
  • Test Set 2 (Hidden Verdict): \(1\le|S|,|E|\le100\).

Đ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 14/40 35%
Test Set 2 26/40 65%

Ví dụ

Ví dụ 1

Input
6
10001 111
1011 111
1010 1011
0 1
0 101
1101011 1101011
Output
Case #1: 4
Case #2: 3
Case #3: 2
Case #4: 1
Case #5: IMPOSSIBLE
Case #6: 0
Giải thích

Mẫu #1 là ví dụ trong đề. Các chuỗi thao tác tối ưu cho mẫu #2, #3, #4 lần lượt là:

\[1011_2\xRightarrow{\mathrm{NOT}}100_2\xRightarrow{\times2}1000_2\xRightarrow{\mathrm{NOT}}111_2,\]
\[1010_2\xRightarrow{\times2}10100_2\xRightarrow{\mathrm{NOT}}1011_2,\]
\[0_2\xRightarrow{\mathrm{NOT}}1_2.\]

Trong mẫu #5, không chuỗi thao tác nào biến \(0_2\) thành \(101_2\). Mẫu #6 không cần thao tác vì \(S=E\).

Nguồn

Google Code Jam 2021, Vòng 1C, bài Double or NOTing.

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: