[問題解決]プログラマー-多段歯ブラシ販売(ハッシュ)[3級]


問題の説明は省略します。リンクをクリックしてください。


提问链接


I/O例


enrollreferralselleramountresult ["john", "mary", "edward", "sam", "emily", "jaimie", "tod", "young"] ["-", "-", "mary", "edward", "mary", "mary", "jaimie", "edward"] ["young", "john", "tod", "emily", "mary"] [12, 4, 2, 5, 10][360, 958, 108, 0, 450, 18, 180, 1080] ["john", "mary", "edward", "sam", "emily", "jaimie", "tod", "young"] ["-", "-", "mary", "edward", "mary", "mary", "jaimie", "edward"] ["sam", "emily", "jaimie", "edward"] [2, 3, 5, 4][0, 110, 378, 180, 270, 450, 0, 0]

私の答え


最初のテストケースは10-タイムアウトです.
これはindex()関数が読み出すインデックスがリストサイズと同じであるため,速度が遅いためである.
  • 失敗コード
  • def solution(enroll, referral, seller, amount):
        answer = []
        dic = dict()
        for i in enroll:
            dic[i] = 0
        for i in range(len(seller)):
            temp = seller[i]
            profit =amount[i]*100
            dic[temp] += profit
            while referral[enroll.index(temp)] != "-":
                dic[temp] -= profit//10
                dic[referral[enroll.index(temp)]] += profit//10
                profit = profit//10
                temp = referral[enroll.index(temp)]
                if profit<1:
                    break
                print(dic)
            dic[temp] -= profit//10
        return list(dic.values())
    だから次のコードのように、ディック・シャナリーを利用して問題を解決しました.
    for i in range(len(enroll)):
    	dic[enroll[i]] =i
        #---
        temp = dic[seller[i]]
        
        
        # ---
         while referral[temp] != "-":
                answer[temp] -= profit//10
                answer[dic[referral[temp]]] += profit//10
                
    dic[enroll[i]] =iからdicディレクトリには、名前とインデックスがjohn : 0で格納されます.
    ドアから見るとanswer[dic[referral[temp]]]
    tempは現在の売り手のインデックスであるため,[temp]を参照して現在の売り手の親ノードとなる.
    dic親ノードとは、親ノードのインデックスを指します.
    以下に他の人のコードも添付します.

    コード#コード#


    マイコード

  • バイナリコード1
  • def solution(enroll, referral, seller, amount):
        dic = dict()
        answer = [0]*len(enroll)
        for i in range(len(enroll)):
            dic[enroll[i]] =i
        for i in range(len(seller)):
            profit =amount[i]*100
            temp = dic[seller[i]]
            answer[temp] += profit
            while referral[temp] != "-":
                answer[temp] -= profit//10
                answer[dic[referral[temp]]] += profit//10
                profit = profit//10
                temp = dic[referral[temp]]
                if profit<1:
                    break
            answer[temp] -= profit//10
        return answer

    別の分のコード

  • ディック郡コード2
  • import math
     
    def solution(enroll, referral, seller, amount):
        parentTree = dict(zip(enroll, referral))
        answer = dict(zip(enroll, [0 for i in range(len(enroll))]))
        for i in range(len(seller)):
            earn = amount[i] * 100
            target = seller[i]
            while True :
                if earn < 10 : #10원 단위 이하라면 모두 받고 레퍼럴 종료
                    answer[target] += earn
                    break
                else : #10% 레퍼럴을 제외하고 받는다
                    answer[target] += math.ceil(earn * 0.9)
                    if parentTree[target] == "-": #상위가 없다면 종료
                        break
                    earn = math.floor(earn*0.1)
                    target = parentTree[target]
                        
        return list(answer.values())
  • 再帰コード
  • import collections
    answer = []
    node = collections.defaultdict(str) 
    answer_ = collections.defaultdict(int) 
    def cal(now, earn):
        if now == "-" or earn<1:
            return
        answer_[now] += earn - earn//10
        cal(node[now], earn//10)
        
    def solution(enroll, referral, seller, amount):
        for i in range(len(enroll)):
            node[enroll[i]] = referral[i]
        print(node)
        for i in range(len(seller)):
            cal(seller[i], amount[i]*100)
        for i in range(len(enroll)):
            answer.append(answer_[enroll[i]])
        return answer