Mean:
給出n個數,讓你通過下面兩種操作,把它們轉換為同一個數。求最少的操作數。
1.ai = ai*2
2.ai = ai/2 (向下取整)
analyse:
基本思路:首先枚舉出每個數能夠到達的數字并且記錄下到達該數組需要的步數,然後從到達次數為n次的數字中選擇步數最小的即為答案。
對于一個數字Ai,它可以變換得到的數字可以分為三類:
1.向左移動n位得到的數字;
2.向右移動n位得到的數字;
3.奇數/2後得到的偶數向右移動n位得到的數字。
處理一個數 Ai:
1、對 Ai 執行左移操作,記錄 Ai 通過左移能夠得到的數字,上限為1e5,vis 數組加1,cnt數組記錄步數
2、對 Ai 執行右移操作,直到 Ai 為0.
若 Ai 的最低位為1,右移一步之後,進行左移,上限為1e5,維持vis數組和cnt數組.
若 Ai 的最低位為0,右移一步,維持vis數組和cnt數組.
這樣我們就把一個數的所有情況都處理出來了,并且是最少的操作數.
最後周遊數組找 vis[i] 為n,并且操作數最小。
Time complexity: O(n*m*log(MAX))
Source code: