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;