Hướng dẫn cho Đèn Bình Dương


Chỉ sử dụng khi thực sự cần thiết như một cách tôn trọng tác giả và người viết hướng dẫn này.

Chép code từ bài hướng dẫn để nộp bài là hành vi có thể dẫn đến khóa tài khoản.

Authors: tknhatbm

Việc đầu tiên là cần phải thêm khung cho hai số có số lượng khung bằng nhau
Ta có thể while đến khi đủ số lượng (# là biểu diễn cho khung không có thanh nào)
Ta đặt coin = 2 * max(len(s1), len(s2)) - (len(s1) + len(s2)) để tìm ra chi phí thêm khung
Tiếp theo, ta đổi s1[i] thành s2[i] lần lượt rồi tính tổng chi phí mỗi lần đổi
Việc đổi s1[i] thành s2[i] là đổi một chữ số qua một chứ số khác
Ta có bản vẽ sau

     0
   # # #
 1 #   # 2
   # # # <--- 3
 4 #   # 5
   # # #
     6

Với 0 biểu diễn cho thanh ở trên cùng, 1 biểu diễn cho thanh dọc ở bên trái trên cùng đầu tiên, ...
Ta có mảng binary = [0, 0, 0, 0, 0, 0, 0]
Với binary[i] là 1 thì số sẽ có thanh thứ i
Nếu là 0 thì số sẽ không có thanh thứ i
Từ đó biểu diễn của số 0 là [1, 1, 1, 0, 1, 1, 1]
Ta sẽ dùng nó để đổi một số có một chữ số qua một số có 1 chữ số, ở đây là s1[i] qua s2[i]
(binary1[i] là biểu diễn của s1[i], binary2[i] là biểu diễn của s2[i])
Nếu binary1[i] != binary2[i] thì ta cho coin += 1 vì khác nhau
Nếu cả hai bằng thì ko cần thêm hay xoá
VD:
0 = [1, 1, 1, 0, 1, 1, 1]
1 = [0, 0, 1, 0, 0, 1, 0]
Thì có tổng cộng 4 chỗ khác nhau, vậy chi phi đổi từ 0 qua 1 là 4
Khi tính đc chi phí đổi từ s1[i] qua s2[i], ta có thể dễ dàng cộng dồn lại, cộng thêm chi phí thêm khung và ra kq
Còn với cách tính u và v, ta định nghĩa sticks[i] là số lượng thanh của i, i có một chữ số
Ta cũng cộng dồn lại như cách tính chi phí, nhưng cần để hai biến riêng biệt
Một số cách tính chi phí đổi từ s1[i] qua s2[i] như cách ngồi nháp hết ra 😃 (có ít nhất 91 cái if chứ mấy), nhưng vì mình lười nên mình làm cách này XD
Optimize:

- Ta thấy các biễu diễn số dưới danh sách có 7 chữ số như số nhị phân, vậy thì ta đổi nó ra luôn số thập phân
- Thay vì chạy trong mảng để xét có bao nhiêu chỗ khác nhau, ta dùng toán tử xor



Bình luận