ABC014-B - 価格の合計 を解く
ABC014-B - 価格の合計
うーん、問題文が何言ってるかわからない
文章が難しすぎる
…
気合で読んでみたところ、与えられた数字 X を2進数に直したとき
1が立っている箇所の an の総和を求めればいいらしい
うーん、わかりづらいな
例えば
X=5
an = {1, 10, 100, 1000}
の場合
10進数5は2進数に直すと0101なので、これの1が立っている部分
つまり右から1番目と3番目
anの左から1番目と3番目は1と100なので
1+100=101
が答えになるらしい
向きが逆なのがややこしい
an = {2, 3, 4, 5}
X=14
とかだったら X は2進数表記で1110になるので
答えは 3+4+5=12 になる感じか
まあなんとなく問題の意味はつかめてきた
10進数を2進数に直す方法がネックだけど
これは Python に bin 関数 という便利なものがある
>>> X=5 >>> X=bin(5) >>> X '0b101'
先頭に2進数を表す "0b" が付くが
以下のようにすることで除去することができる
>>> X '0b101' >>> X=X[2:] >>> X '101'
提出したコード
# 入力 n,X=map(int,input().split()) l=list(map(int,input().split())) # Xを2進数に変換(プレフィックスは除去) X=list(bin(X)[2:])
# 向きを合わせる X.reverse() # 出力値 s=0 # '1'のときは加算、それ以外の場合は加算しない for x,a in zip(X,l): if x=='1': s+=a # 出力 print(s)
今回は for文において、2つのリストを同時に参照することができる
zip関数を使用した
上記のコードでは、文字列 X とリスト l を同時に先頭要素から順に参照して
x,a にそれぞれ代入している
そして、2進数表記で "1" となったタイミングで、加算処理を行っている