题目一:1792. 最大平均通过率
最大平均通过率
思路:
- 使用优先队列完成数据第一次排序。(优先队列与队列的区别在与其优先级,即可以以我们的意愿定义合适的优先级)== 本题中要使得班级j的优先级比班级i的优先级大
==
将此式化简为
此时便不得不提
该数据优先级的定义,毕竟我们我们只有定义优先级才能使得该队列以特定的顺序存储。==而此时我们不能简单的在定义队列时写(greater,less)了,而应定义结构体时使用 bool operato
bool operator<(const Ratio& oth)const{
return (long long)(oth.total+1)*oth.total*(total-pass)<(long long)(total+1)*total*(oth.total-oth.pass);
注意*‘<’右边便是优先级高的值,其位置更靠前,先弹出.
此式我们每从队列中弹出的数据,经过处理得到的增长率最高)。
c++的默认降序队列
代码
class Solution {
public:
struct Ratio{
int pass,total;
bool operator<(const Ratio& oth)const{
return (long long)(oth.total+1)*oth.total*(total-pass)<(long long)(total+1)*total*(oth.total-oth.pass);
}
};
double maxAverageRatio(vector<vector<int>>& classes, int extraStudents) {
double ans=0;
priority_queue<Ratio>q;
for(auto &c:classes)
{
q.push({c[0],c[1]});
}
for(int i=0;i<extraStudents;i++)
{
auto[pass,total]=q.top();
q.pop();
q.push({pass+1,total+1});
}
for(int i=0;i<classes.size();i++)
{
auto[pass,total]=q.top();
q.pop();
ans+=1.0*pass/total;
}
return ans/classes.size();
}
};