LeetCode第 221 场周赛

1705. 吃苹果的最大数目

class Solution {
public:
    #define PII pair<int,int>
    int eatenApples(vector<int>& a, vector<int>& d) {
        priority_queue<PII,vector<PII>,greater<PII> >q;
        int n=a.size(),s=0;
        for(int i=0;i<n||!q.empty();i++){
            while(!q.empty()&&q.top().first==i) q.pop();
            if(i<n&&a[i]) q.push({i+d[i],a[i]});
            if(!q.empty()){
                PII u=q.top();
                q.pop();
                u.second--;s++;
                if(u.second) q.push(u);
            }
        }return s;
    }
};

贪心:考虑优先选择快过期的吃。

1706. 球会落何处

class Solution {
public:
    vector<int>ans;
    int m,n;
    int dfs(vector<vector<int>>& g,int x,int y){
        if(x==n) return y;
        if(y+1<m&&g[x][y]==1&&g[x][y+1]==1){
            return dfs(g,x+1,y+1);
        }
        if(y>0&&g[x][y]==-1&&g[x][y-1]==-1) return dfs(g,x+1,y-1);
        return -1;
    }
    vector<int> findBall(vector<vector<int>>& g) {
         n=g.size(),m=g[0].size();ans.resize(m);
        for(int i=0;i<m;i++) ans[i]=dfs(g,0,i);
        return ans;
    }
};

d f s dfs dfs,只需判两种情况。往右下和往左下走。

在这里插入代码片

1707. 与数组中元素的最大异或值

01字典树,每个节点存储一个该子树的最小数,然后贪心选。

class Solution {
public:
    struct node{
        int lo;
        node* son[2]={NULL};
       node(){lo=1e9;}
    };
    vector<int> maximizeXor(vector<int>& a, vector<vector<int>>& q) {
        node * rt=new node();
        //printf("%d\n",rt->lo);
        for(int x:a){
            node *p=rt;
            for(int j=30;j>=0;j--){
                int w=(x>>j&1)?1:0;
                if(!p->son[w]) p->son[w]=new node();
                p=p->son[w];
                p->lo=min(p->lo,x);
            }
        }
        vector<int>ans(q.size());
        for(int i=0;i<q.size();i++){
            int x=q[i][0],m=q[i][1];
            node *p=rt;
            int sum=0;
            for(int j=30;j>=0;j--){
                if((x>>j)&1){
                    if(p->son[0]){
                        p=p->son[0],sum+=1<<j;
                    }
                    else if(!p->son[1]||p->son[1]->lo>m){
                        ans[i]=-1;
                        break;
                    }
                    else p=p->son[1];
                }
                else {
                    if(p->son[1]&&p->son[1]->lo<=m){
                        p=p->son[1],sum+=1<<j;
                    }else if(!p->son[0]){
                        ans[i]=-1;break;
                    }
                    else p=p->son[0];
                }
             //   printf("sum=%d,j=%d\n",sum,j);
                if(!j) ans[i]=sum;
            }
        }return ans;
    }
}sol;