lc第 308 场周赛 ABC
https://leetcode.cn/contest/weekly-contest-308/
—————————————————————————————————
6160. 和有限的最长子序列
给你一个长度为 n 的整数数组 nums ,和一个长度为 m 的整数数组 queries 。
返回一个长度为 m 的数组 answer ,其中 answer[i] 是 nums 中 元素之和小于等于 queries[i] 的 子序列 的 最大 长度 。
子序列 是由一个数组删除某些元素(也可以不删除)但不改变剩余元素顺序得到的一个数组。
示例 1:
输入:nums = [4,5,2,1], queries = [3,10,21]
输出:[2,3,4]
示例 2:
输入:nums = [2,3,4,5], queries = [1]
输出:[0]
class Solution {
public:
vector<int> answerQueries(vector<int>& nums, vector<int>& queries) {
int n=nums.size();
int m=queries.size();
sort(nums.begin(),nums.end());
vector<int> ans;
for(int i=0;i<m;i++)
{
int sum=0;
for(int j=0;j<n;j++)
{
sum+=nums[j];
if(sum>queries[i])
{
ans.push_back(j);
break;
}
}
if(sum<=queries[i]) ans.push_back(n);
}
return ans;
}
};
6161. 从字符串中移除星号
给你一个包含若干星号 * 的字符串 s 。
在一步操作中,你可以:
选中 s 中的一个星号。
移除星号 左侧 最近的那个 非星号 字符,并移除该星号自身。
返回移除 所有 星号之后的字符串。
注意:
生成的输入保证总是可以执行题面中描述的操作。
可以证明结果字符串是唯一的。
示例 1:
输入:s = "leet**cod*e"
输出:"lecoe"
示例 2:
输入:s = "erase*****"
输出:""
class Solution {
public:
string removeStars(string s) {
string c;
for(int i=0;i<s.size();i++)
{
if(s[i]!='*') c+=s[i];
else c.pop_back();
}
return c;
}
};
6162. 收集垃圾的最少总时间
给你一个下标从 0 开始的字符串数组 garbage ,其中 garbage[i] 表示第 i 个房子的垃圾集合。garbage[i] 只包含字符 'M' ,'P' 和 'G' ,但可能包含多个相同字符,每个字符分别表示一单位的金属、纸和玻璃。垃圾车收拾 一 单位的任何一种垃圾都需要花费 1 分钟。
同时给你一个下标从 0 开始的整数数组 travel ,其中 travel[i] 是垃圾车从房子 i 行驶到房子 i + 1 需要的分钟数。
城市里总共有三辆垃圾车,分别收拾三种垃圾。每辆垃圾车都从房子 0 出发,按顺序 到达每一栋房子。但它们 不是必须 到达所有的房子。
任何时刻只有 一辆 垃圾车处在使用状态。当一辆垃圾车在行驶或者收拾垃圾的时候,另外两辆车 不能 做任何事情。
请你返回收拾完所有垃圾需要花费的 最少 总分钟数。
示例 1:
输入:garbage = ["G","P","GP","GG"], travel = [2,4,3]
输出:21
示例 2:
输入:garbage = ["MMM","PGM","GP"], travel = [3,10]
输出:37
class Solution {
public:
int garbageCollection(vector<string>& lj, vector<int>& che) {
int rm=-1,rp=-1,rg=-1;
for(int i=0;i<lj.size();i++)
{
for(int j=0;j<lj[i].size();j++)
{
if(lj[i][j]=='M') rm=i;
else if(lj[i][j]=='P') rp=i;
else if(lj[i][j]=='G') rg=i;
}
}
int sm=0,sp=0,sg=0;
for(int i=0;i<lj.size();i++)
{
for(int j=0;j<lj[i].size();j++)
{
if(lj[i][j]=='M') sm++;
else if(lj[i][j]=='P') sp++;
else if(lj[i][j]=='G') sg++;
}
if(rm>i) sm+=che[i];
if(rp>i) sp+=che[i];
if(rg>i) sg+=che[i];
}
int sum=sm+sp+sg;
return sum;
}
};
6163. 给定条件下构造矩阵
D是个拓扑排序
写起来好烦啊。格式卡半天
贴上拓扑模板,我开溜了
拓扑排序 —— 模板题 AcWing 848. 有向图的拓扑序列
时间复杂度 O(n+m)O(n+m), nn 表示点数,mm 表示边数
bool topsort()
{
int hh = 0, tt = -1;
// d[i] 存储点i的入度
for (int i = 1; i <= n; i ++ )
if (!d[i])
q[ ++ tt] = i;
while (hh <= tt)
{
int t = q[hh ++ ];
for (int i = h[t]; i != -1; i = ne[i])
{
int j = e[i];
if (-- d[j] == 0)
q[ ++ tt] = j;
}
}
// 如果所有点都入队了,说明存在拓扑序列;否则不存在拓扑序列。
return tt == n - 1;
}