はじめに
AtCoder Problems の Recommendation を利用して、過去の問題を解いています。
AtCoder さん、AtCoder Problems さん、ありがとうございます。
今回のお題
AtCoder Beginner Contest D - Project Planning
Difficulty: 1643
今回のテーマ、二分探索 + 鳩ノ巣原理
青レートは難しいですが、解いてみました。
Ruby
n, k = gets.split.map(&:to_i)
a = gets.split.map(&:to_i).sort
b =[0]
n.times do |i|
b[i + 1] = b[i] + a[i]
end
ans = (0..).bsearch do |x|
c = a.bsearch_index{ _1 >= x } || n
b[c] + x * (n - c) < k * x
end
puts ans - 1
まず、1 つのプロジェクトは K 個の相異なる部署から 1 人ずつ選出
となっていますので、鳩ノ巣原理
より、各部署より選出できる人数は、作成するプロジェクト数が上限となります。
# あらかじめ累積和を作成
b =[0]
n.times do |i|
b[i + 1] = b[i] + a[i]
end
# プロジェクトに選出できる人数を計算
c = a.bsearch_index{ _1 >= x } || n
b[c] + x * (n - c)
次に、プロジェクト数の最大を求めますが、各部署の社員が最大10の12乗
人所属していますので、先頭から順番に探索してはTLE
になってしまいます。
そこで、二分探索
の登場となります。
ans = (0..).bsearch do |x|
ここで、上限をうまく設定しないとWA
になったなりますのが、Ruby
ではハッピーな書き方があり、二分探索の威力もあって気楽にコーディングできます。
Ruby | |
---|---|
コード長 (Byte) | 233 |
実行時間 (ms) | 146 |
メモリ (KB) | 33588 |
まとめ
- ABC 227 D を解いた