本サイトABC081B – Shift onlyへは以下から
問題:Shift only
黒板に N 個の正の整数 A1,…,AN が書かれています.
すぬけ君は,黒板に書かれている整数がすべて偶数であるとき,次の操作を行うことができます.
黒板に書かれている整数すべてを,2 で割ったものに置き換える.
すぬけ君は最大で何回操作を行うことができるかを求めてください.
制約
- 1≤N≤200
- 1≤Ai≤109
入力
N
A1 A2 ... AN
出力
すぬけ君は最大で何回操作を行うことができるかを出力せよ.
入力例 1
3
8 12 40
出力例 1
2
最初,黒板には [8,12,40]が書かれています. このとき,書かれている整数はすべて偶数なので,操作を行うことができます.
1回操作を行った後,黒板には [4,6,20] が書かれています. 再び,書かれている整数はすべて偶数なので,操作を行うことができます.
2回操作を行った後,黒板には [2,3,10] が書かれています. この時,奇数3が書かれているため,これ以上操作を行うことはできません.
よって,すぬけ君は最大で2回操作を行うことができます.
入力例 2
4
5 6 8 10
出力例 2
0
入力例 3
6
382253568 723152896 37802240 379425024 404894720 471526144
出力例 3
8
解答例
N = int(input())
A = list(map(int, input().split()))
count = 0
while all(a % 2 == 0 for a in A):
A = [a // 2 for a in A]
count += 1
print(count)
解説
この問題は、与えられた整数のリストがすべて偶数である限り、それらの整数を2で割り続ける操作を最大で何回行えるかを求めるものです。
以下の手順で問題を解くことができます。
- 入力の受け取り:
int(input())
を使用して、黒板に書かれている整数の数N
を受け取ります。list(map(int, input().split()))
を使用して、黒板に書かれているN
個の整数をリストA
として受け取ります。
- 初期化:
count
を0に初期化します。これは、操作を行った回数をカウントするための変数です。
- 操作の実行:
while
ループを使用して、リストA
のすべての要素が偶数である限り以下の操作を繰り返します:all(a % 2 == 0 for a in A)
:リストA
のすべての要素が偶数であるかどうかを確認します。[a // 2 for a in A]
:リストA
のすべての要素を2で割り、新しいリストA
を作成します。count += 1
:操作を1回行ったので、カウントを1増やします。
- 結果の出力:
print(count)
を使用して、操作を行った回数を出力します。
以下は、この問題を解くためのPython3のプログラムです。
# 整数Nを入力として受け取る
N = int(input())
# N個の整数を入力として受け取る
A = list(map(int, input().split()))
# 操作の回数を初期化
count = 0
# すべての整数が偶数である限りループを続ける
while all(a % 2 == 0 for a in A):
# 各整数を2で割る
A = [a // 2 for a in A]
# 操作の回数をインクリメント
count += 1
# 結果を出力
print(count)
while all(a % 2 == 0 for a in A):
について詳しく解説します。
a % 2 == 0 for a in A
は、リスト内包表記の一部として使用されるPythonの構文です。この構文を使用すると、リストA
の各要素に対して何らかの操作を行い、新しいリストを生成することができます。
具体的には、a % 2 == 0 for a in A
は、リストA
の各要素a
に対して、a
が偶数であるかどうかを確認します。a % 2
は、a
を2で割った余りを返します。したがって、a % 2 == 0
は、a
が偶数である場合にTrue
を返し、奇数である場合にFalse
を返します。
この構文をall()
関数と組み合わせると、リストA
のすべての要素が偶数であるかどうかを確認することができます。all()
関数は、与えられたイテラブル(この場合はリスト内包表記の結果)のすべての要素がTrue
である場合にTrue
を返し、それ以外の場合はFalse
を返します。
したがって、all(a % 2 == 0 for a in A)
は、リストA
のすべての要素が偶数である場合にTrue
を返し、1つ以上の要素が奇数である場合にFalse
を返します。
この構文を使用すると、リストのすべての要素に対して条件を確認し、その結果に基づいて処理を行うことができます。
コメント