【競プロ】過去問精選100問「How many ways?」解法
Free-PhotosによるPixabayからの画像

はじめに

このシリーズではレッドコーダーが教える、競プロ・AtCoder上達のガイドライン【中級編:目指せ水色コーダー!】でまとめられている100問をPythonで解いています。

問題

How many ways?

https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_7_B&lang=ja

ポイント

この問題は全探索を用いて解くことができます。

問題の解となる3つの数を小さい順にa,b,cと置くと、a + b + c = x でありこの時aの値はxの3分の1よりも

小さいことに注意してください。また、2番目に大きい数のbは x - a を2で割った数よりも小さいです。

このことを用いて、ループ回数を減らすのが今回のポイントになるかと思います。

コード

def main():
    while True:
        N, X = map(int, input().split(" "))
        if N == X == 0:
            break
        count = 0
        for i in range(1, X//3+1):  # 一番小さい数のループ
            for j in range(i+1, X-i//2+1):  # 二番目に小さい数のループ
                l = X - i - j  # 三番目は一意に定まる
                if j < l <= N:
                    count += 1
        print(count)

if __name__ == '__main__':
    main()
おすすめの記事