#時間切れコード
Python
1from itertools import groupby 2from math import factorial 3def comb(n, k): 4 if n >= k: 5 return factorial(n) // (factorial(k) * factorial(n - k)) 6 else: 7 return 0 8 9N = int(input()) 10A = list(map(int, input().split())) 11 12dic = {} 13for i in range(1, N + 1): 14 dic[i] = 0 15for a in A: 16 dic[a] += 1 17 18v_sum = 0 19for k, v in dic.items(): 20 v_sum += comb(v, 2) 21 22for a in A: 23 ans = v_sum - comb(dic[a], 2) + comb(dic[a] - 1, 2) 24 print(ans)
#正解コード
Python
1from itertools import groupby 2from math import factorial 3def comb(n, k): 4 if n >= k: 5 return factorial(n) // (factorial(k) * factorial(n - k)) 6 else: 7 return 0 8 9N = int(input()) 10A = list(map(int, input().split())) 11 12dic = {} 13for k, v in groupby(sorted(A)): 14 dic[k] = len(list(v)) 15 16v_sum = 0 17for k, v in dic.items(): 18 v_sum += comb(v, 2) 19 20for a in A: 21 ans = v_sum + 1 - dic[a] 22 print(ans)
#質問
コードを書き換えたのは下から2行目の部分のみです。comb(dic[a], 2) + comb(dic[a] - 1, 2)だと見栄えが悪いなと思い手で計算をして1 - dic[a]としたら思いもよらず実行時間が縮まった次第です。ループを回すような関数であればともかく、今回用いたcomb関数は計算量O(1)でおさまるからfor a in Aのループに入れておいても大丈夫だろうと高を括っていたところ、実行時間は2秒を超過してしまいましたが、dicへのアクセスのみに変えることで実行時間が1.1秒ほどになりました。forループの中でcombを呼び出しただけでどうしてそれほどの計算量負荷がかかっていたのでしょうか。素人質問にて恐縮ですが、ご教授のほどお願い申し上げます。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。