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】解説記事