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;
}
posted @ 2022-08-28 17:15  高尔赛凡尔娟  阅读(25)  评论(0编辑  收藏  举报