AtCoder Beginner Contest 061 C – Big Array をPython3で解く

Share

AtCoder上にある問題のうち、AtCoder Problemsでdiff 800以上と判定されているものを順番に解いていく企画。
基本的な考え方は全てコード中のコメントに入れてあるので、参照のこと。

出典:
AtCoder Beginner Contest 061 C- Big Array

一見簡単に見えるので、つい言われるがままの操作をして引っかかる人もいるだろう。制約が厳しい場合には、同じものはまとめたまま取り扱うという考え方をする必要がある。

# AtCoder Beginner Contest 061 C- Big Array
# https://atcoder.jp/contests/abc061/tasks/abc061_c
# tag: 考察

# 制約が大きいので、馬鹿正直に配列に数字を一個一個入れていくのはよくない。
# 下手すると 10^5 個の数字を 10^5 回入れた上で、ソートする羽目になる。
# 入れた数字の種類と個数だけを保存しておくのがいいだろう。
# 最終的に種類だけでソートし、後はそれぞれの数字が入っている個数を
# 確認しながら、上から K 番目の数字を確認すればいい。

def main():
    N, K = map(int, input().split())
    inserts = [list(map(int, input().split())) for _ in range(N)]

    # カウント用の辞書を用意
    counter = {}

    # 順に見ていき、最終的に何がいくつ入っているのかをカウントしておく
    for num, volume in inserts:
        if num not in counter:
            counter[num] = 0
        counter[num] += volume
    
    checked = 0

    # 入っている数字をソートしつつ順に取り出していく
    for num in sorted(counter.keys()):
        # 求める順位が次の数字の個数で達成できるなら、その数字を回答
        if checked <=  K <= checked + counter[num]:
            print(num)
            return
        # 足りないなら、数字の個数をチェック済みとして、次の数字を見る
        checked += counter[num]

main()
Share

コメントを残す

メールアドレスが公開されることはありません。