生活随笔
收集整理的這篇文章主要介紹了
LeetCode 1792. 最大平均通过率(优先队列)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
1. 題目
一所學校里有一些班級,每個班級里有一些學生,現在每個班都會進行一場期末考試。
給你一個二維數組 classes ,其中 classes[i] = [passi, totali] ,表示你提前知道了第 i 個班級總共有 totali 個學生,其中只有 passi 個學生可以通過考試。
給你一個整數 extraStudents ,表示額外有 extraStudents 個聰明的學生,他們 一定 能通過任何班級的期末考。
你需要給這 extraStudents 個學生每人都安排一個班級,使得 所有 班級的 平均 通過率 最大 。
一個班級的 通過率 等于這個班級通過考試的學生人數除以這個班級的總人數。
平均通過率 是所有班級的通過率之和除以班級數目。
請你返回在安排這 extraStudents 個學生去對應班級后的 最大 平均通過率。
與標準答案誤差范圍在 10^-5 以內的結果都會視為正確結果。
示例
1:
輸入:classes
= [[1,2],[3,5],[2,2]], extraStudents
= 2
輸出:
0.78333
解釋:你可以將額外的兩個學生都安排到第一個班級,
平均通過率為
(3/4 + 3/5 + 2/2) / 3 = 0.78333 。示例
2:
輸入:classes
= [[2,4],[3,9],[4,5],[2,10]], extraStudents
= 4
輸出:
0.53485提示:
1 <= classes
.length
<= 10^5
classes
[i
].length
== 2
1 <= passi
<= totali
<= 10^5
1 <= extraStudents
<= 10^5
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/maximum-average-pass-ratio
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
2. 解題
struct cmp
{bool operator()(vector
<int>& a
, vector
<int>& b
) const{return double(a
[0]+1)/(a
[1]+1)-double(a
[0])/a
[1] < double(b
[0]+1)/(b
[1]+1)-double(b
[0])/b
[1];}
};
class Solution {
public:double maxAverageRatio(vector
<vector
<int>>& classes
, int extraStudents
) {priority_queue
<vector
<int>, vector
<vector
<int>>, cmp
> q
;for(auto& c
: classes
)q
.push(c
);vector
<int> c
;while(extraStudents
--){c
= q
.top();q
.pop();q
.push({c
[0]+1, c
[1]+1});}double ans
= 0;while(!q
.empty()){ans
+= q
.top()[0]/double(q
.top()[1]);q
.pop();}return ans
/classes
.size();}
};
參考 zerotrac 🌸 的寫法才不超時。
- tuple<double,int,int>, auto [d, x, y] = q.top()
class Solution {
public:double maxAverageRatio(vector
<vector
<int>>& classes
, int extraStudents
) {priority_queue
<tuple
<double,int,int>> q
;for(auto& c
: classes
)q
.push(tuple(delta(c
[0], c
[1]), c
[0], c
[1]));while(extraStudents
--){auto [d
, x
, y
] = q
.top();q
.pop();q
.push(tuple(delta(x
+1, y
+1), x
+1, y
+1));}double ans
= 0;while(!q
.empty()){auto [d
, x
, y
] = q
.top();q
.pop();ans
+= x
/double(y
);}return ans
/classes
.size();}double delta(int x
, int y
){return double(x
+1)/(y
+1)-double(x
)/y
;}
};
1288 ms 91.2 MB C++
我的CSDN博客地址 https://michael.blog.csdn.net/
長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的LeetCode 1792. 最大平均通过率(优先队列)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。