白駿10816号:デジタルカード2

1477 ワード

問題解決の考え方
  • Collectionsモジュールを利用するCounterクラス
  • 二分探索の応用
  • ✔コード
    import sys
    from collections import Counter
    
    N = int(sys.stdin.readline())
    own = list(map(int, sys.stdin.readline().split()))
    cnt = sorted(Counter(own).most_common())
    
    M = int(sys.stdin.readline())
    quest = list(map(int, sys.stdin.readline().split()))
    
    answer = []
    for i in range(M):
        end = len(cnt) - 1
        start = 0
        while True:
            if start > end:
                answer.append(0)
                break
            mid = (start + end) // 2
            if cnt[mid][0] < quest[i]:
                start = mid + 1
            elif cnt[mid][0] > quest[i]:
                end = mid - 1
            elif cnt[mid][0] == quest[i]:
                answer.append(cnt[mid][1])
                break
    
    for i in range(M):
        print("{} ".format(answer[i]), end="")
    print()
  • Counterクラスのmost common()メソッドを使用すると、登場回数を基準に降順に並べられます.しかし二分探索のために数字を基準に昇順で並べ替えるのが便利であるため,並べ替え関数を用いて並べ替えた.
  • 以降,並べられたcntリストで二分探索を行い,探す数字があれば対応する出現回数を出力し,なければ0を出力する.
  • は同じコードで、Python 3ではだめ、PyPy 3ではだめです.
  • ✔関連概念
  • の最も値を求めます:https://codepractice.tistory.com/712
  • 二分ルックアップアルゴリズム:https://satisfactoryplace.tistory.com/392