LeetCode 第 36 场双周赛 (模拟、模拟、贪心+构造、优先队列+平衡树)

1603. 设计停车系统
很无聊

class ParkingSystem {
    
    
public:
    int a[4];
    ParkingSystem(int big, int m, int s) {
    
    
        a[1] = big;
        a[2] = m;
        a[3] = s;
    }
    bool addCar(int c) {
    
    
        if(a[c]==0) return false;
        a[c]--;
        return true;
    }
};

1604. 警告一小时内使用相同员工卡大于等于三次的人

class Solution {
    
    
public:
    set<string> ans;
    vector<string> res;
    unordered_map<string,vector<string>> mp;
    vector<string> alertNames(vector<string>& kn, vector<string>& kt) {
    
    
        int n = kn.size();
        for(int i=0;i<n;i++){
    
    
            mp[kn[i]].push_back(kt[i]);
        }
        for(auto &it:mp){
    
    
            sort(it.second.begin(),it.second.end());
            if(it.second.size()>=3){
    
    
                int size = it.second.size();
                for(int i=0;i+2<size;i++){
    
    
                    if(ok(it.second[i],it.second[i+2])){
    
    
                        ans.insert(it.first);
                        break;
                    }
                }
            }
        }
        for(const string&s:ans){
    
    
            res.push_back(s);
        }
        return res;
    }
    int f(const string&s){
    
    
        int h = (s[0]-'0')*10+(s[1]-'0');
        int m = (s[3]-'0')*10+(s[4]-'0');
        return h*60+m;
    }
    bool ok(const string&s1,const string&s2){
    
    
        return  f(s2)-f(s1)<=60 && f(s2)-f(s1)>=0;
    }
};

1605. 给定行和列的和求可行矩阵
证明看这里

class Solution {
    
    
public:
    vector<vector<int>> restoreMatrix(vector<int>& rowSum, vector<int>& colSum) {
    
    
        int m = rowSum.size(), n = colSum.size();  
        vector<vector<int>> ans(m,vector<int>(n));
        for(int i=0;i<m;i++){
    
    
            for(int j=0;j<n;j++){
    
    
                int cur = min(rowSum[i],colSum[j]);
                ans[i][j] = cur;
                rowSum[i] -= cur;
                colSum[j] -= cur;
            }
        }
        return ans;
    }
};

1606. 找到处理最多请求的服务器

  • 优先队列模拟按时间顺序跳出使用状态的服务器,使用二元组<time,id>
  • 由于要快速知道下一个可以使用的服务器,不能线性的去查找。
    所以使用set去记录还有哪些服务器可以使用,使用set自带的二分查找。
class Solution {
    
    
public:
    typedef pair<int,int> P;
    int f[100100] = {
    
    0};
    vector<int> ans;
    priority_queue<P,vector<P>,greater<P> > pq;
    set<int> s;
    vector<int> busiestServers(int k, vector<int>& a, vector<int>& t) {
    
    
        int n = a.size();
        for(int i=0;i<k;i++){
    
    
            s.insert(i);
        }
        for(int i=0;i<n;i++){
    
    
            // 用完的全部出队
            while(!pq.empty() && pq.top().first<=a[i]){
    
    
                int id = pq.top().second;
                pq.pop();
                s.insert(id);
            }
            // 有服务器空闲
            if(s.size()){
    
    
                int id = i%k;
                if(s.find(id) != s.end()){
    
    
                    s.erase(id);
                    pq.push({
    
    a[i]+t[i],id});
                    f[id]++;
                }else{
    
    
                    // 按题目的要求去模拟
                    auto it = s.upper_bound(id);
                    int nid;
                    if(it!=s.end()){
    
    
                        nid = *it;
                        s.erase(it);
                    }else{
    
    
                        nid = *s.begin();
                        s.erase(s.begin());
                    }
                    pq.push({
    
    a[i]+t[i],nid});
                    f[nid]++;
                }
            }
        }
        int mmax = *max_element(f,f+k);
        for(int i=0;i<k;i++){
    
    
            if(f[i]==mmax){
    
    
                ans.push_back(i);
            }
        }
        return ans;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_44846324/article/details/108957335