AtCoder Beginner Contest 209 B問題 Python解説

ABC209 B-Can you buy them all?

問題はこちら

Pythonでの解法】

まず解答例を下に示します。

N,X = map(int,input().split())
A = list(map(int,input().split()))

for i in range(N):
  if (i + 1) % 2 == 0:
    X -= A[i] - 1
  else:
    X -= A[i]

print("Yes" if X >= 0 else "No")

1. 問題文の把握

本問の内容は数学的考察なども不要で日常シーンのようなものなので、イメージや理解は容易く、即座にコードを考えるフェーズに進めるかと思います。

2. コードを考える

(0) 標準入力
NとXはこれまで通りの変数への代入になります。
一方、 A_{1}  A_{2} ...  A_{N}のようにAの数が定まっていない(与えられるNの値次第となる)場合にはA = list(map(int,input().split()))という書き方で対応します。これにより A_{1}  A_{2} ...  A_{N}を要素とするリストAが作られます。
両者を比べると次のようになります。

"""標準入力で受け取った文字をリストの要素としてから整数にし、
それらの要素をそれぞれの変数に代入している"""
N,X = map(int,input().split())
"""標準入力で受け取った文字をリストの要素としてから整数にし、
それらを要素とするリストを作成している"""
A = list(map(int,input().split()))

どちらも幾度となく使うことがあると思うので、データの与えられ方によって正しく使い分けられるように整理しておくことをおすすめします。

(1) 根幹
本問の出力は「N 個の商品を全て買うことができるか?」の判定によって異なって参ります。そこで、何を判断基準とするかを考えます。
今回の解答例では所持金(X)から商品の購入価格を順に引いていき、最終値が0以上かマイナスかで判断しています。(Xが0の時、手元にはお金は残っていないものの商品は全て買うことができているので"Yes"の出力になります)
そこで、問題文より偶数番目と奇数番目とで購入価格が異なることが分かるのでif文を用いて場合分けをしながら、Xから減算していくこととします。 それが次のコードです。

N,X = map(int,input().split())
A = list(map(int,input().split()))
#以下が新規追加分
for i in range(N):
  if (i + 1) % 2 == 0:
    X -= A[i] - 1
  else:
    X -= A[i]

for文を書く際、繰り返し変数iには0から順に代入されていくため、if文の条件式にはi + 1とする点に注意が必要です。 A_{i} iの範囲が 1 \le i \le Nと問題文に書いてあるためです。
for文を使うことで、リストAに格納されている商品それぞれの定価を取り出すことができます。取り出した後は、偶数番目なら定価から1を引いた額、奇数番目なら定価そのままを所持金から減算していきます。
for文による繰り返し処理が全て終わった後のXが最終的な所持金となります。

(2) 出力
所持金(X)の最終的な値が0以上なら"Yes"、マイナスなら"No"と出力するので、場合分けが必要となります。 そこで、解答例では209Aでも触れた三項演算子を用いていてprint文を書いています。

N,X = map(int,input().split())
A = list(map(int,input().split()))

for i in range(N):
  if (i + 1) % 2 == 0:
    X -= A[i] - 1
  else:
    X -= A[i]
#以下が新規追加分
print("Yes" if X >= 0 else "No")

これで解答例が完成しました!

3. まとめ

今回は初めてB問題を扱いました。文法としては、if文とfor文の組み合わせがメインとなっており、その他にリストの扱い方やそれに関連してfor文の繰り返し変数にも注意が必要なポイントがありました。
また、冒頭の標準入力は本問に限らず競技プログラミングにおいて必要不可欠な知識ですので、必要であればmap()split()list()について各自で詳しく調べてみるとより知識が身につくと思います。