# LeetCode 1792. Maximum Average Pass Ratio https://leetcode.com/problems/maximum-average-pass-ratio/description/ ## 題目大意 已知每班的人數已經通過人數,如何投入神仙學霸 (保證通過) 到各班使平均的通過率最大? ## 思考 野性的直覺告訴你 greedy 就對了 C++ 參考解答: ```cpp! class Solution { public: double maxAverageRatio(vector<vector<int>> &classes, int extraStudents) { priority_queue<ClassRatio> maxHeap; for (auto &cl : classes) { maxHeap.emplace(cl[0], cl[1]); } while (extraStudents--) { auto topClass = maxHeap.top(); maxHeap.pop(); topClass.addStudent(); maxHeap.push(topClass); } double ans = 0; while (!maxHeap.empty()) { auto topClass = maxHeap.top(); maxHeap.pop(); ans += ratio(topClass.passStdnt, topClass.totalStdnt); } return ans / classes.size(); } private: static double ratio(int a, int b) noexcept { return static_cast<double>(a) / b; } struct ClassRatio { int passStdnt; int totalStdnt; ClassRatio(int pass, int total) noexcept : passStdnt(pass), totalStdnt(total) {} double impact() const noexcept { return ratio(passStdnt + 1, totalStdnt + 1) - ratio(passStdnt, totalStdnt); } void addStudent() noexcept { ++passStdnt; ++totalStdnt; } bool operator<(const ClassRatio &other) const noexcept { return impact() < other.impact(); } }; }; ``` Go 參考解答: ```go! func maxAverageRatio(classes [][]int, extraStudents int) float64 { h := &ClassHeap{} heap.Init(h) for _, c := range classes { heap.Push(h, &Class{pass: c[0], total: c[1]}) } for i := 0; i < extraStudents; i++ { top := heap.Pop(h).(*Class) top.addStudent() heap.Push(h, top) } ans := 0.0 for h.Len() > 0 { top := heap.Pop(h).(*Class) ans += top.ratio() } return ans / float64(len(classes)) } type Class struct { pass, total int } func (c *Class) ratio() float64 { return float64(c.pass) / float64(c.total) } func (c *Class) impact() float64 { return (float64(c.pass+1)/float64(c.total+1) - c.ratio()) } func (c *Class) addStudent() { c.pass++ c.total++ } type ClassHeap []*Class func (h ClassHeap) Len() int { return len(h) } func (h ClassHeap) Less(i, j int) bool { return h[i].impact() > h[j].impact() } // Max-heap based on impact. func (h ClassHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] } func (h *ClassHeap) Push(x interface{}) { *h = append(*h, x.(*Class)) } func (h *ClassHeap) Pop() interface{} { old := *h n := len(old) item := old[n-1] *h = old[:n-1] return item } ```