Please sign in first.
Submission #10080104
Source Code Expand
class MinHeap
def initialize(source)
@arr = []
source.each do |e|
push(e)
end
end
def size
@arr.size
end
def empty?
@arr.empty?
end
def top
@arr.first
end
# ヒープに値を追加する
def push(value)
@arr << value # 最後尾に追加
i = @arr.size - 1 # 追加されたノード番号
# 親子関係を修復していく
while i > 0
parent = (i - 1) / 2 # 親のノード番号
# 親子関係が逆転してなかったら終了
break if @arr[parent].first <= value.first
# 親と自分をswap
@arr[parent], @arr[i] = @arr[i], @arr[parent]
i = parent
end
# 追加したい値は最終的にこの位置に決定する
@arr[i] = value
end
# ヒープから最小値を取り出す
def pop
min = top # 最小値 = 返り値
# ここからヒープを再構築する
# ひとまず最後尾をルートノードにもっていくる
tmp_node = @arr.last
@arr.pop
# ルートノードから降ろしていく
i = 0
while (i * 2 + 1) < size
# 左側の子が配列のサイズを超えるまで
# = 左側の子が配列サイズを超えているということは、
# そのノードには子が存在しないということになる
# 左右の子ノードの値を比較して小さい方をmin_childとする
lhs_child = i * 2 + 1 # 左側の子
rhs_child = i * 2 + 2 # 右側の子
min_child = lhs_child # とりあえず左側が小さいと仮定しておく(右側の子が存在しないこともあるため)
if rhs_child < size
# 右側の子のインデックスが配列のサイズを超えていないとき
# = 超えているということは、右側の子は存在しないということ
# => その場合は左側の子が採用される
if @arr[lhs_child].first > @arr[rhs_child].first
min_child = rhs_child
end
end
# 逆転していなければ終了
break if @arr[min_child].first >= tmp_node.first
# 自分のノードを子の値にする
@arr[i] = @arr[min_child]
i = min_child
end
# 選んだノードは最終的にこの位置に決定(空なら最後の要素だったということなのでセット不要)
@arr[i] = tmp_node unless empty?
min
end
end
n, k = gets.strip.split.map(&:to_i)
ab = n.times.map { gets.strip.split.map(&:to_i) }
heap = MinHeap.new([])
ab.each do |e|
heap.push e
end
ans = 0
k.times do
min = heap.pop
heap.push([min.first + min.last, min.last])
ans += min.first
end
puts ans
Submission Info
| Submission Time | |
|---|---|
| Task | C - Factory |
| User | akht |
| Language | Ruby (2.3.3) |
| Score | 300 |
| Code Size | 2782 Byte |
| Status | AC |
| Exec Time | 1194 ms |
| Memory | 12084 KiB |
Judge Result
| Set Name | Sample | All | ||||
|---|---|---|---|---|---|---|
| Score / Max Score | 0 / 0 | 300 / 300 | ||||
| Status |
|
|
| Set Name | Test Cases |
|---|---|
| Sample | sample_01.txt, sample_02.txt, sample_03.txt |
| All | sample_01.txt, sample_02.txt, sample_03.txt, subtask_1_1.txt, subtask_1_10.txt, subtask_1_11.txt, subtask_1_12.txt, subtask_1_13.txt, subtask_1_14.txt, subtask_1_15.txt, subtask_1_16.txt, subtask_1_17.txt, subtask_1_18.txt, subtask_1_2.txt, subtask_1_3.txt, subtask_1_4.txt, subtask_1_5.txt, subtask_1_6.txt, subtask_1_7.txt, subtask_1_8.txt, subtask_1_9.txt |
| Case Name | Status | Exec Time | Memory |
|---|---|---|---|
| sample_01.txt | AC | 8 ms | 1916 KiB |
| sample_02.txt | AC | 254 ms | 1916 KiB |
| sample_03.txt | AC | 84 ms | 1916 KiB |
| subtask_1_1.txt | AC | 11 ms | 1788 KiB |
| subtask_1_10.txt | AC | 1194 ms | 6520 KiB |
| subtask_1_11.txt | AC | 7 ms | 1788 KiB |
| subtask_1_12.txt | AC | 233 ms | 10420 KiB |
| subtask_1_13.txt | AC | 7 ms | 1788 KiB |
| subtask_1_14.txt | AC | 280 ms | 4660 KiB |
| subtask_1_15.txt | AC | 1050 ms | 12084 KiB |
| subtask_1_16.txt | AC | 124 ms | 1788 KiB |
| subtask_1_17.txt | AC | 85 ms | 1788 KiB |
| subtask_1_18.txt | AC | 946 ms | 12084 KiB |
| subtask_1_2.txt | AC | 677 ms | 3708 KiB |
| subtask_1_3.txt | AC | 119 ms | 6392 KiB |
| subtask_1_4.txt | AC | 492 ms | 2172 KiB |
| subtask_1_5.txt | AC | 242 ms | 10420 KiB |
| subtask_1_6.txt | AC | 776 ms | 2812 KiB |
| subtask_1_7.txt | AC | 319 ms | 2044 KiB |
| subtask_1_8.txt | AC | 962 ms | 12084 KiB |
| subtask_1_9.txt | AC | 951 ms | 10420 KiB |