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

题目链接

题意

给定两个字符串数组keyNamekeyTime,分别表示名字为keytime[i]的人,在某一天内使用员工卡的时间(格式为24小时制,"HH:MM")。你要找出一小时内使用员工卡大于等于3的人,名字按字典序升序排列。注意,"23:51"-"00:10"不被视为一小时内,因为系统记录的是某一天内的使用情况

分析

给每个人创建一个数组,记录所有的打卡时间,然后将每个人名字字符串映射到相应的打卡时间数组。有个坑点是,题目给定的打卡时间不一定是顺序的,需要排序。另外,考虑到是记录当天的打卡时间,不妨将所有"HH:MM"换算为分钟制,比如"06:12"换算为\(372min\),便于后续判断。

class Solution {
public:
vector<string> alertNames(vector<string>& keyName, vector<string>& keyTime) {
unordered_map<string, vector<int>> t;
vector<string> ans;
for (int i = 0; i < keyName.size(); i++) {
string hours = keyTime[i].substr(0, 2);
string minutes = keyTime[i].substr(3, 2);
int dt = stoi(hours) * 60 + stoi(minutes);
t[keyName[i]].push_back(dt);
}
for (auto&& curName : t) {
vector<int> tt = curName.second;
if (tt.size() <= 2) continue;
sort(tt.begin(), tt.end());
for (int i = 2; i < tt.size(); i++) {
if (tt[i] - tt[i - 2] <= 60) {
ans.push_back(curName.first);
break;
}
}
}
sort(ans.begin(), ans.end());
return ans;
}
};

1605. 给定行和列的和求可行矩阵 #贪心 #稀疏矩阵

题目链接

题意

你不知道矩阵里每个元素的具体值,但已知每一行的总和和每一列的总和,求该矩阵。

分析

思路参考自@Durant。从\((0,0)\)元素出发,每到达一位置\((x, y)\),就判断当前位置对应的rowSum[x]colSum[x]最小值,假如这个最小值是​rowSum[x]​,那么就将该最小值直接放到ans[x][y]即可,将colSum[x] -= rowSum[x]; rowSum[x]=0;,对应的第\(x\)行其余元素全部置0,然后接下来移动到\((x+1, y)\)。假如这个最小值是colSum[x],同理。直到最终到达最后一行最后一列元素,即可终止。

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

1606. 找到处理最多请求的服务器 #STL #任务分配 #模拟

题目链接

题意

有\(k\)个服务器(编号从\(0\)开始),每个服务器不能同时处理超过一个的请求。第 \(i\)个请求到达时,请求分配到服务器的规则有:

  • 若所有服务器都已被占据,那么该请求被舍弃(完全不处理)。

  • 如果第$ (i % k)$ 个服务器空闲,那么对应服务器会处理该请求。

  • 否则,将请求安排给下一个空闲的服务器(服务器构成一个环,必要的话可能从第 0 个服务器开始继续找下一个空闲的服务器)。

给定一个 严格递增 的正整数数组 arrival ,其中arrival[i]表示第 $i $个任务的到达时间,和另一个数组 load ,其中 load[i] 表示第 $i $个请求的工作量(也就是服务器完成它所需要的时间)。你的任务是找到 最繁忙的服务器 。最繁忙定义为一个服务器处理的请求数是所有服务器里最多的。要返回包含所有 最繁忙服务器 序号的列表,你可以以任意顺序返回这个列表。

样例

分析

由于到达时间是\(1e9\)数量级,不可能直接枚举时间。我们应该用枚举“请求”的到达时间,如何维护服务器的工作状态?我们可以通过优先级队列,将工作中的服务器及对应的工作结束时间放到该队列中,工作时间结束得早,自然地就更早地放在队列队首或者弹出队列。怎么得知哪些服务器空闲?用\(set\)维护当前空闲服务器编号,之所以需要其自动排序的功能,是因为请求时是先从大到小寻找合适的编号的。由于\(set\)内部元素是顺序排列,那么我们自然通过二分查找到当前合适的服务器编号。这里,注意一下,对于\(set\)内部元素的查找,必须要用其自带的二分查找成员函数,否则会超时。具体原因戳此处的stackoverflow,感谢网友~

using PII = pair<int, int>;
class Solution {
public:
vector<int> busiestServers(int k, vector<int>& arrival, vector<int>& load) {
int n = arrival.size();
vector<int> cnt(k, 0); //cnt[i]表示第i个服务器接收请求次数
set<int> freeIdx; //表示当前空闲的服务器(set会对编号从小到大排序)
priority_queue<PII, vector<PII>, greater<PII>> busy; //值小优先级高,维护最快结束的服务器。pair的键对应该服务器结束时间,值对应于服务器编号
for (int i = 0; i < k; i++) freeIdx.emplace(i); //所有服务器空闲
for (int i = 0; i < n; i++) {
if (!freeIdx.empty()) {
auto it = freeIdx.lower_bound(i % k); //找到请求的服务器编号(大于等于)
int finish = arrival[i] + load[i], idx; //finish计算结束时间
if (it != freeIdx.end()) {
idx = *(it);
freeIdx.erase(it); //idx服务器不再空闲
}
else { //后面找不到,只能回到前面去找
idx = *(freeIdx.begin());
freeIdx.erase(freeIdx.begin());
}
busy.push({ finish, idx }); //idx服务器不再空闲
cnt[idx]++;
}
if (i + 1 < n) {
while (!busy.empty() && busy.top().first <= arrival[i + 1]) {
//如果某服务器工作结束时间比下一个请求的到达时间早,则
freeIdx.emplace(busy.top().second);//更新空闲服务器
busy.pop();
}
}
}
int most = -1; vector<int> ans;
for (int i = 0; i < k; i++) most = max(most, cnt[i]);
for (int i = 0; i < k; i++) if (cnt[i] == most) ans.push_back(i);
return ans;
}
};

LeetCode双周赛#36的更多相关文章

  1. leetcode 双周赛9 进击的骑士

    一个坐标可以从 -infinity 延伸到 +infinity 的 无限大的 棋盘上,你的 骑士 驻扎在坐标为 [0, 0] 的方格里. 骑士的走法和中国象棋中的马相似,走 “日” 字:即先向左(或右 ...

  2. leetcode 双周赛9 找出所有行中最小公共元素

    给你一个矩阵 mat,其中每一行的元素都已经按 递增 顺序排好了.请你帮忙找出在所有这些行中 最小的公共元素. 如果矩阵中没有这样的公共元素,就请返回 -1. 示例: 输入:mat = [[,,,,] ...

  3. [每日一题2020.06.16] leetcode双周赛T3 5423 找两个和为目标值且不重叠的子数组 DP, 前缀和

    题目链接 给你一个整数数组 arr 和一个整数值 target . 请你在 arr 中找 两个互不重叠的子数组 且它们的和都等于 target .可能会有多种方案,请你返回满足要求的两个子数组长度和的 ...

  4. LeetCode双周赛#35

    1589. 所有排列中的最大和 #差分 #贪心 题目链接 题意 给定整数数组nums,以及查询数组requests,其中requests[i] = [starti, endi] .第i个查询求 num ...

  5. LeetCode双周赛#34

    5492. 分割字符串的方案数 #组合公式 #乘法原理 #区间分割 题目链接 题意 给定01二进制串\(s\),可将\(s\)分割为三个非空 字符串\(s_1,s_2,s_3\),即(\(s_1+s_ ...

  6. LeetCode双周赛#33 题解

    5480. 可以到达所有点的最少点数目 #贪心 题目链接 题意 给定有向无环图,编号从0到n-1,一个边集数组edges(表示从某个顶点到另一顶点的有向边),现要找到最小的顶点集合,使得从这些点出发, ...

  7. Leetcode 双周赛#32 题解

    1540 K次操作转变字符串 #计数 题目链接 题意 给定两字符串\(s\)和\(t\),要求你在\(k\)次操作以内将字符串\(s\)转变为\(t\),其中第\(i\)次操作时,可选择如下操作: 选 ...

  8. LeetCode第8场双周赛(Java)

    这次我只做对一题. 原因是题目返回值类型有误,写的是 String[] ,实际上应该返回 List<String> . 好吧,只能自认倒霉.就当涨涨经验. 5068. 前后拼接 解题思路 ...

  9. LeetCode 第 15 场双周赛

    1287.有序数组中出现次数超过25%的元素 1288.删除被覆盖区间 1286.字母组合迭代器 1289.下降路径最小和 II 下降和不能只保留原数组中最小的两个,hacked. 1287.有序数组 ...

随机推荐

  1. A. Arena of Greed 解析(思維)

    Codeforce 1425 A. Arena of Greed 解析(思維) 今天我們來看看CF1425A 題目連結 題目 略,請直接看原題. 前言 明明是難度1400的題目,但總感覺不是很好寫阿, ...

  2. Redis---05主从复制(一般模式)

    一.什么是主从复制 主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主 二.用处 读写分离,性能扩展:容灾快速恢复 三.主从配置 1 ...

  3. Luogu P6830 [IOI2020]Connecting Supertrees

    题意 好复杂,我就不写了. 题解 口胡了一下,发现我居然会 IOI 的题? 首先发现有 \(3\) 一定不合法,因为连通块里面有一个环的话 \(p_{i,j}\) 最多为 \(2\),有两个环的话就存 ...

  4. windows下redis的PHP扩展安装

    1.查看已安装PHP的信息,打印phpinfo(); 主要看三个信息:PHP版本,是否线程安全(TS或NTS),系统是x64还是x86.用以确定扩展文件的版本. 2.需要php_redis.dll这个 ...

  5. MyBatis重要核心概念

    一.SqlSessionFactoryBuilder 从命名上可以看出,这个是一个 Builder 模式的,用于创建 SqlSessionFactory 的类.SqlSessionFactoryBui ...

  6. .NetCore简单封装基于IHttpClientFactory的HttpClient请求

    IHttpClientFactory是什么?为什么出现了IHttpClientFactory 一.IHttpClientFactory是什么? IHttpClientFactory是.netcore2 ...

  7. vim编辑器使用简介

    使用格式 vim [option] /path/to/somefile ... option: -o水平分割 -O垂直分割 +打开后在最后一行 +Num打开后在地Num行,加号与Num之间不能有空格 ...

  8. mysql千万级大数据SQL查询优化30条经验(Mysql索引优化注意)

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  9. php 之根据mysql字段 批量生成 array 数组

    ci框架 验证字段 需要 生成类似为: array('field' => 'admin_id','label' => '账号ID','rules' => 'integer'),    ...

  10. JS中的Array之方法(1)

    a=[2,4,5,6,7,90]; [1]. a.toString();  // 返回字符串表示的数组,逗号分隔 "2,4,5,6,7,90" [2]. a.join('||'); ...