吃汉堡题解

这道题首先我们可以发现可以吃掉的最大汉堡数量是一定的。那么我们从大到小枚举吃多少汉堡,用一个集合来维护当前可以被吃掉的汉堡组合,我们会发现,吃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;
    }
};
全部评论

相关推荐

点赞 评论 收藏
分享
过往烟沉:我说什么来着,java就业面就是广!
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务