dengxinyi 6 年之前
父节点
当前提交
a8bcf03550
共有 1 个文件被更改,包括 56 次插入0 次删除
  1. 56 0
      oj/tencent-2019-summer/no6/ring.go

+ 56 - 0
oj/tencent-2019-summer/no6/ring.go

@@ -0,0 +1,56 @@
+package main
+
+import (
+	"container/heap"
+	"fmt"
+)
+
+type pair struct {
+	_1 int
+	_2 int
+}
+
+type maxHeap []pair
+
+func (h maxHeap) Len() int           { return len(h) }
+func (h maxHeap) Less(i, j int) bool { return h[j]._1 < h[i]._1 }
+func (h maxHeap) Swap(i, j int)      { h[i], h[j] = h[j], h[i] }
+
+func (h *maxHeap) Push(x interface{}) {
+	*h = append(*h, x.(pair))
+}
+
+func (h *maxHeap) Pop() interface{} {
+	l := len(*h)
+	x := (*h)[l-1]
+	*h = (*h)[:l-1]
+	return x
+}
+
+func main() {
+	var n, m int
+	fmt.Scan(&n, &m)
+	nums := make([]int, n)
+	l, r := make([]int, n), make([]int, n)
+	var h maxHeap
+	for i := 0; i < n; i++ {
+		fmt.Scan(&nums[i])
+		heap.Push(&h, pair{nums[i], i})
+		l[i] = (i + n - 1) % n
+		r[i] = (i + 1) % n
+	}
+	sum := 0
+	for i := 0; i < m; i++ {
+		p := heap.Pop(&h).(pair)
+		for l[p._2] == -1 {
+			p = heap.Pop(&h).(pair)
+		}
+		sum += p._1
+		left, right := l[p._2], r[p._2]
+		l[p._2], r[p._2] = l[left], r[right]
+		l[left], l[right] = -1, -1 // Mark element as used
+		np := pair{nums[left] + nums[right] - p._1, p._2}
+		heap.Push(&h, np)
+	}
+	fmt.Println(sum)
+}