Bài toán về bit

Em có bài toán về bit mà nghĩ mãi không ra, mọi người xem cách giải quyết như nào ạ? Em cám ơn

Bạn đã biết:

  • Dùng các phép toán về bit.

chưa?

Có bao nhiêu bit 0 thì thực hiện bấy nhiêu lần lật và xét độ dài thôi.

5 Likes

muốn lật mà dài nhất thì số bit 1 liên tiếp bên trái + bên phải số 0 cũng phải dài nhất
đi từ phải sang trái (hoặc trái sang phải tuỳ)
nếu là bit1 thì trái++
nếu gặp bit 0 thì: nếu bit tiếp theo là bit 1 vậy trái thay = phải, nếu bit tiếp theo là bit 0 thì phải = 0
cả 2 trường hợp trên đều update lại trái = 0
mỗi lần lặp thì so max = (trái + phải, max)
kết quả là trái + phải + 1 (vì ta chỉ mới tính trái phải, chưa tính bit 0 ta lật, độ dài sẽ + 1)
làm như trên thì sẽ hố nếu gặp trường hợp gặp toàn 1 khi ta ko có số 0 để làm trái phải
khi đó thì ta cứ check nếu ~n (lấy not toàn bộ bit của n) = 0 thì tức là toàn bit 1, trả về số bit cần để biểu diễn số đó, dùng hàm của ngôn ngữ cũng được hoặc làm tròn xuống log2(n) + 1

5 Likes

Cảm ơn mọi người giúp đỡ. Nhân tiện cho em hỏi cách tư duy để khi biết giải thuật mình có thể code nhanh nhất ạ?

Bài này cho bằng số nên bt là n & (n+1) == 0.

5 Likes

Câu này giống như câu: “Anh ơi cho em hỏi làm sao đỗ đại học ạ?”

6 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?