問題
黒板に N 個の正の整数 A1,…,ANが書かれています。
A君は,黒板に書かれている整数がすべて偶数であるとき,次の操作を行うことができます。
・黒板に書かれている整数すべてを、2で割ったものに置き換える。
A君は最大で何回操作を行うことができるかを求めてください。
入力例1 3 8 12 40 出力例1 2 入力例2 4 5 6 8 10 出力例2 0
自分の回答
def Shiftonly(numbers)
count = 0
counts = []
numbers.each do |num|
while num % 2 == 0 do
num = num / 2
count = count + 1
end
counts = counts.push(count)
count = 0
end
p counts.min
end
amount = gets.chomp.to_i
numbers = gets.chomp.split(" ").map(&:to_i)
Shiftonly(numbers)
原理としては、配列から一つ(num)取り出して、それに対してひたすら2で割っていきます。2で割り切れなくなったところで、その回数(count)をcountsという配列に入れます。
例えば8という数字だと、8=>4=>2=>1となるので、countは3となります。
最終的に、countsの配列の中の一番小さい数字を出力すれば、答えとなります。
この問題の難しいところは、問題文だと、配列の全体を2で割っているところです。同じようにしようとしても自分では思いつきませんでした。なので、自分は一つずつ取り出して、2で割った数をカウントして、カウント数の最小のものを求めるというやり方をしてます。この発想の転換が肝でした。
この問題はBクラスなのですが、難易度がグッと上がった気がしますね。問題を読んだだけでは、すぐに何をすれば良いか思いつきません。また、数の個数Nを入力させるのですが、それも使っていません。Nを使えば、もっと楽にできるのでしょうか?
問題へのリンク
ABC081B - Shift only
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.