公式

C - Reindeer and Sleigh 2 解説 by toam


ソリに乗るトナカイの集合を \(S\) とすると,条件は

\[\displaystyle \sum_{i\notin S}P_i\geq \sum_{i \in S}W_i\]

です.\(\displaystyle \sum_{i\notin S}P_i=\sum_{i=1}^N P_i - \sum_{i \in S}P_i\) を代入してして整理すると

\[\displaystyle \sum_{i\in S}(W_i+P_i)\leq \sum_{i=1}^N P_i\]

です.右辺は定数なので,\(W_i+P_i\) が小さいトナカイから貪欲にソリに乗せていくのが最適になります.

計算量は \(W_i+P_i\) でソートするのがボトルネックになり \(O(N\log N)\) です.

def solve():
    n = int(input())
    wp = [list(map(int, input().split())) for i in range(n)]
    wp.sort(key=lambda x: x[0] + x[1]) # w_i + p_i でソート
    sum_p = 0
    for w, p in wp:
        sum_p += p
    res = 0
    for i in range(n):
        w, p = wp[i]
        res += w + p
        if sum_p < res:
            print(i)
            return


for _ in range(int(input())):
    solve()

投稿日時:
最終更新: