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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です