日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 1792. 最大平均通过率(优先队列)

發布時間:2024/7/5 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 1792. 最大平均通过率(优先队列) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1. 題目
    • 2. 解題

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. 最大平均通过率(优先队列)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。