AtCoder Grand Contest 011 B – Colorful Creatures をPython3で解く

Share

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

出典:
AtCoder Grand Contest 011 B – Colorful Creatures

より小さな生物の色が残るための条件とは……といったところから考察を始めると、考えやすいと思う。

# AtCoder Grand Contest 011 B - Colorful Creatures
# https://atcoder.jp/contests/agc011/tasks/agc011_b
# tag: 事前ソート 累積和 考察

# 小さいものから順番に、ひとつ上の大きなものを吸収させていき、
# 吸収できなくなれば一旦ストップ・次のものを最初にして
# 再スタート。どこかから最後まで行き着くことができれば、
# 最後に再スタートしたところ~最後のどの色にもなることが
# できる……みたいな。

# 例えば、
# 1, 2, 3, 100, 200, 300 という大きさの生物がいるとしたら、
# 1, 2, 3 は、どう頑張っても最後に残ることが出来ない。
# その条件は、(1 + 2 + 3) * 2 が 100 未満であること。
# 逆に、100, 200, 300 については 
# 100←6, (100+6)←200, (100+6+200)←300
# と食べさせることで、100 を最後に残すことができるが、
# この場合 100 を 200 や 300 と入れ替えても同順の
# 捕食が可能なので、100, 200, 300 のどれでも最後に残せる。

# 吸収できるかどうかはそれまでに吸収したもの全ての大きさの
# 合計が関わってくるので、累積和を使用すると楽。

def main():
    N = int(input())
    A = list(map(int, input().split()))

    # ソートして累積和を取る
    A.sort()
    csum = []
    tmp = 0
    for a in A:
        tmp += a
        csum.append(tmp)

    start = 0
    now = 1
    while True:
        if now == N:
            break
        # 一つ前までの合計で、今考慮している生物を吸収可能かどうか
        if csum[now - 1] * 2 >= A[now]:
            now += 1
        else:
            start = now
            now += 1
    
    print(N - start)

main()
Share

コメントを残す

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