【ABC051 B】「Sum of Three Integer」を解く【Python3】

abc051b

コンテスト一覧へ

 

2つの整数K,Sと3つの変数X,Y,Zが与えられ、

0 ≦ X,Y,Z ≦ K
X + Y + Z = S

を満たす X,Y,Z が何通りあるか、という問題です。

 

for文を用いて、X,Y,Z全部のパターンを調べる方法が予想できます。

ですが、Kの最大値が2500となるため、最大「2500の3乗分」のパターンを調べることになり、実行時間が足りなくなります。

 

そこで、Zに注目し、「Z = S – X – Y」と考えます。

Sは与えられているので、XとYが決まればZは自ずと決まります。

XとYのパターンを調べれば良いことがわかります。

 

実際に書いてみます。

提出
k, s = map(int, input().split())
ans = 0

for i in range(k + 1):
    for j in range(k + 1):
        if i + j <= s and i + j + k >= s:
            ans += 1

print(ans)

二つの整数を受け取り、k,sに代入します。

for文を用いて、XとYの全パターンを調べます。

range()の引数を「k+1」にすることに注意です。

if文を用いて、条件を満たしているか確認し、満たしている場合、ansを1増やします。

最後にansを出力します。

split()メソッド

split()メソッドは、区切り文字を指定して、文字列を分割します。

区切り文字を指定しない場合、空白、タブ、改行で分割されます。

str.split(区切り文字)
map()関数

map()関数は、配列内のすべての要素に関数の処理を適用します。

map(関数、配列)
range()関数

range()関数は、連続した数のリストを返します。

引数の指定が1つの場合、stopの指定になります。

引数stopの値は含まれず、最後の数字は「stop-1」です。

range(start,stop,step)

【ABC051】解説記事

コンテスト一覧に戻る

コメントを残す

メールアドレスが公開されることはありません。