吃汉堡题解
这道题首先我们可以发现可以吃掉的最大汉堡数量是一定的。那么我们从大到小枚举吃多少汉堡,用一个集合来维护当前可以被吃掉的汉堡组合,我们会发现,吃3个汉堡包的集合一定是吃2个汉堡包的集合的子集。那么我们从大到小枚举,每次只需要选取当前集合中鸡肉汉堡包最多的来吃就好了。选取最多的我们用优先队列来维护。时间复杂度O(nlogn),空间复杂度O(n)。
class Solution {
public:
/**
*
* @param n int整型
* @param a int整型一维数组
* @param aLen int a数组长度
* @param b int整型一维数组
* @param bLen int b数组长度
* @return long长整型
*/
struct node{
int x,y;
bool friend operator <(node a,node b) {
return a.x+a.y>b.x+b.y;
}
}A[100001];
long long EatingHamburger(int n, int* a, int aLen, int* b, int bLen) {
// write code here
for(int i=1;i<=n;i++) A[i].x=a[i-1],A[i].y=b[i-1];
sort(A+1,A+1+n);
int pos=1;
long long ans=0;
priority_queue<int>q;
for(int i=200000;i;i--) {
while(A[pos].x+A[pos].y>=i&&pos<=n) q.push(A[pos].x),pos++;
if(!q.empty()) {
ans+=max(0,i-q.top());
q.pop();
}
}
return ans;
}
};