考えて競プロする

プログラミングコンテストの問題をどう考えて解いたかを記録していくブログです。使用言語はPython3

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番目1100なので

1+100=101

が答えになるらしい

向きが逆なのがややこしい

 

an = {2, 3, 4, 5}

X=14

とかだったら X は2進数表記で1110になるので

答えは 3+4+5=12 になる感じか

 

まあなんとなく問題の意味はつかめてきた

 

10進数を2進数に直す方法がネックだけど

これは Pythonbin 関数 という便利なものがある

>>> 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" となったタイミングで、加算処理を行っている

 

提出結果はACでした