力扣第 126 场双周赛(A~B)
100262. 求出加密整数的和
321变成333,全都变成最大的那一个。
#include <bits/stdc++.h>
//#define int long long
#define per(i,j,k) for(int (i)=(j);(i)<=(k);++(i))
#define rep(i,j,k) for(int (i)=(j);(i)>=(k);--(i))
#define debug(a) cout<<#a<<"="<<a<<endl
#define all(x) x.begin(),x.end()
#define EX exit(0)
#define fr first
#define se second
#define endl '\n'
using namespace std;
using ll=long long;
class Solution{
public:
int bitmax(int x){
int res=0;
while(x){
res=max(x%10,res);
x/=10;
}
return res;
}
int bitlen(int x){
int res=0;
while(x){
res++;
x/=10;
}
return res;
}
int sumOfEncryptedInt(vector<int>& nums) {
int ans=0;
per(i,0,nums.size()-1){
int res=bitmax(nums[i]);
int tmp=bitlen(nums[i]);
int sum=0;
while(tmp--){
sum+=res;
res*=10;
}
ans+=sum;
}
return ans;
}
};
100209. 执行操作标记数组中的元素
每次访问前先执行两个操作。
减去下标为x的数,如果没有则忽略。
最小的前y个数,全部删除。
每次输出目前数组求和。
考虑用优先队列维护数组的最小值,因为要删前y个,所以当值相等的时候,需要按照下标从小到大排序,需要注意的是小根堆是相反的,所以比较时使用降序。
#include <bits/stdc++.h>
#define per(i,j,k) for(int (i)=(j);(i)<=(k);++(i))
#define rep(i,j,k) for(int (i)=(j);(i)>=(k);--(i))
#define debug(a) cout<<#a<<"="<<a<<endl
#define all(x) x.begin(),x.end()
#define EX exit(0)
#define fr first
#define se second
#define endl '\n'
using namespace std;
using ll=long long;
class Solution{
public:
vector<long long>ans;
struct Node{
ll val,idx;
};
struct CMP{
bool operator() (const Node &A,const Node &B)const{
if(A.val>B.val)return true;
if(A.val==B.val)return A.idx>B.idx;
return false;
}
};
priority_queue<Node,vector<Node>,CMP>q;
vector<long long> unmarkedSumArray(vector<int>& nums, vector<vector<int>>& queries) {
ll sum=0;
per(i,0,nums.size()-1){
q.push({nums[i],i});
sum+=nums[i];
}
bool vis[nums.size()+1];
per(i,0,nums.size()-1)vis[i]=false;
per(i,0,queries.size()-1){
auto j=queries[i];
if(!vis[j[0]]){
vis[j[0]]=true;
sum-=nums[j[0]];
}
//j[1];//最小的j[1]个
while(j[1]--){
while(q.size() and vis[q.top().idx])q.pop();
if(q.size()){
sum-=q.top().val;
vis[q.top().idx]=true;
q.pop();
}
}
ans.push_back(sum);
}
return ans;
}
};