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;
}
};
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;
}
};
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;
}
};
- 用优先队列模拟按时间顺序跳出使用状态的服务器,使用二元组
<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;
}
};