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)