首页 > 其他分享 >Leetcode第357场周赛

Leetcode第357场周赛

时间:2023-08-06 17:00:11浏览次数:36  
标签:std 周赛 items long st 357 Ans Leetcode size

https://leetcode.cn/contest/weekly-contest-357/

C 寻找不安全路径

以所有小偷点为源点,跑多源点BFS,求出每个点到最近小偷点的曼哈顿距离,记为w[i, j]

二分答案Mid,只允许走w[i, j] >= mid的点,从源店跑DFS/BFS,看是否能抵达汇点。

D 子序列最大优雅度

反悔贪心,首先将所有项目按照利润排序,先选前k大的利润。

然后考虑往后选,如果当前项目的类别已经出现过了,用它换掉前面任何一个必然是亏的,忽略。

如果当前项目的类别没出现过,考虑类别+1,优先换掉前面不是第一个出现该类别的利润最小的项目(用栈维护),这是当前这个类别数量下的最优解。

最后所有类别数量各自的解取最大值就是答案。std::sort自定义排序函数改成传引用才过,不然会一直超时。

class Solution {
public:
    long long findMaximumElegance(vector<vector<int>>& items, int k) {
        std::sort(items.begin(), items.end(), [&](std::vector<int> &x, std::vector<int> &y) {
            return x[0] > y[0];
        });
        std::set<int> st;
        std::vector<int> pr;
        long long ans = 0, Ans = 0;
        for (int i = 0; i < k; i++) {
            if (!st.count(items[i][1])) st.insert(items[i][1]);
            else pr.push_back(items[i][0]);
            ans += items[i][0];
        }
        Ans = std::max(Ans, (long long)(ans + 1ll * st.size() * st.size()));
        for (int i = k; i < items.size(); i++) {
            if (st.count(items[i][1])) continue;
            if (pr.size()) {
                ans -= pr.back();
                pr.pop_back();
                ans += items[i][0];
                st.insert(items[i][1]);
                Ans = std::max(Ans, (long long)(ans + 1ll * st.size() * st.size()));
                continue;
            }
        }
        return Ans;
    }
};

标签:std,周赛,items,long,st,357,Ans,Leetcode,size
From: https://www.cnblogs.com/zhanglichen/p/17609574.html

相关文章

  • 357周赛
    故障键盘水题。classSolution{public:stringfinalString(strings){stringres;for(charc:s){if(c=='i'){reverse(res.begin(),res.end());}else{res+=c;......
  • 【动态规划】【力扣357次周赛】6953. 判断是否能拆分数组
    【力扣357次周赛】6953.判断是否能拆分数组给你一个长度为n的数组nums和一个整数m。请你判断能否执行一系列操作,将数组拆分成n个非空数组。在每一步操作中,你可以选择一个长度至少为2的现有数组(之前步骤的结果)并将其拆分成2个子数组,而得到的每个子数组,至少需......
  • 一支笔,一双手,一道力扣(Leetcode)做一宿
    (文章目录)一、分享自己相关的经历我是一名计算机专业的学生,之前在学习算法和数据结构时,对于简单题目还算能够顺利地刷过去。但是当我开始尝试刷一些medium难度的题目时,就感觉自己卡在原地了。明明看过题解,知道解题思路,但真正动手做题时,就觉得无从下手,甚至一道题目做了好几天都......
  • 【LeetCode剑指offer#06】实现pow函数、计算x的平方根
    实现pow函数实现pow(x,n),即计算x的整数n次幂函数(即,xn)。示例1:输入:x=2.00000,n=10输出:1024.00000示例2:输入:x=2.10000,n=3输出:9.26100示例3:输入:x=2.00000,n=-2输出:0.25000解释:2-2=1/22=1/4=0.25代码classSolution{public:do......
  • LeetCode从算法到算命—每日一题(0805)
    21. 合并两个有序链表题目信息将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例1:输入:l1=[1,2,4],l2=[1,3,4]输出:[1,1,2,3,4,4]示例2:输入:l1=[],l2=[]输出:[]示例3:输入:l1=[],l2=[0]输出:[0]......
  • LeetCode 206 反转链表,LeetCode 92反转链表Ⅱ
    反转链表给你单链表的头节点head,请你反转链表,并返回反转后的链表。示例1:输入:head=[1,2,3,4,5]输出:[5,4,3,2,1]示例2:输入:head=[1,2]输出:[2,1]示例3:输入:head=[]输出:[]提示:链表中节点的数目范围是[0,5000]-5000<=Node.val<=5000写法一:不使用头节点,......
  • LeetCode -- 722. 删除注释
     利用双指针来进行删除操作 classSolution{public:vector<string>removeComments(vector<string>&source){stringstr;for(autoit:source)str+=it+"'";intn=str.size();vector<string&g......
  • #yyds干货盘点# LeetCode程序员面试金典:课程表
    题目:你这个学期必须选修numCourses门课程,记为 0 到 numCourses-1。在选修某些课程之前需要一些先修课程。先修课程按数组 prerequisites给出,其中 prerequisites[i]=[ai,bi],表示如果要学习课程 ai则必须先学习课程 bi。例如,先修课程对 [0,1]表示:想要学习......
  • #yyds干货盘点# LeetCode程序员面试金典:统计各位数字都不同的数字个数
    1.简述:给你一个整数n,统计并返回各位数字都不同的数字x的个数,其中0<=x<10n 。 示例1:输入:n=2输出:91解释:答案应为除去11、22、33、44、55、66、77、88、99外,在0≤x<100范围内的所有数字。示例2:输入:n=0输出:12.代码实现:classSolution{publicintcount......
  • LeetCode 3. 无重复字符的最长子串
    classSolution{public:intres=0;intlengthOfLongestSubstring(strings){intn=s.size();if(!n)return0;boolst[128]={false};for(intj=0,i=0;j<n;j++){while(j&&st[s[j]]==true......