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

    科技2025-02-10  17

    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; } };
    Processed: 0.009, SQL: 8