生活随笔
收集整理的這篇文章主要介紹了
LeetCode 1792. 最大平均通过率(优先队列)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
文章目錄
1. 題目
一所學(xué)校里有一些班級,每個班級里有一些學(xué)生,現(xiàn)在每個班都會進(jìn)行一場期末考試。
給你一個二維數(shù)組 classes ,其中 classes[i] = [passi, totali] ,表示你提前知道了第 i 個班級總共有 totali 個學(xué)生,其中只有 passi 個學(xué)生可以通過考試。
給你一個整數(shù) extraStudents ,表示額外有 extraStudents 個聰明的學(xué)生,他們 一定 能通過任何班級的期末考。
你需要給這 extraStudents 個學(xué)生每人都安排一個班級,使得 所有 班級的 平均 通過率 最大 。
一個班級的 通過率 等于這個班級通過考試的學(xué)生人數(shù)除以這個班級的總?cè)藬?shù)。
平均通過率 是所有班級的通過率之和除以班級數(shù)目。
請你返回在安排這 extraStudents 個學(xué)生去對應(yīng)班級后的 最大 平均通過率。
與標(biāo)準(zhǔn)答案誤差范圍在 10^-5 以內(nèi)的結(jié)果都會視為正確結(jié)果。
示例
1:
輸入:classes
= [[1,2],[3,5],[2,2]], extraStudents
= 2
輸出:
0.78333
解釋:你可以將額外的兩個學(xué)生都安排到第一個班級,
平均通過率為
(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
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
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/
長按或掃碼關(guān)注我的公眾號(Michael阿明),一起加油、一起學(xué)習(xí)進(jìn)步!
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎
總結(jié)
以上是生活随笔為你收集整理的LeetCode 1792. 最大平均通过率(优先队列)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。