青になりたい

競技プログラミングの記録です

DISCO presents ディスカバリーチャンネル コードコンテスト2017 予選 C-収納

テストも兼ねての初投稿です☆

収納
https://ddcc2017-qual.contest.atcoder.jp/tasks/ddcc2017_qual_c

問題概要

長さCの容器と、いろんな長さのN本の棒がある。1つの容器には2本まで入れられる。なるべく少ない容器に収納したい。

解法

ソートして貪欲(300点問題にはよくある)。小さい方と大きい方から見ていき、2本入れられれば入れる。
普通のリストだと間に合わなそうなのでdequeを使った。これは両端からすばやく要素を取り出せるので便利。

from collections import deque
N, C = map(int,input().split())
L = [int(input()) for k in range(N)]

M = deque(sorted(L))
ans = 0
while len(M) > 1:
    l = M[0]
    r = M[-1]
    if l+r+1 <= C:
        M.popleft()
        M.pop()
        ans += 1
    else:
        M.pop()
        ans += 1

print(ans if len(M)==0 else ans+1)