[LeetCode周赛复盘] 第 99 场双周赛20230304

一、本周周赛总结

  • T1 贪心。
  • T2 数学/dp。
  • T3 线段合并/快速幂取模。
  • T4 换根DP。

二、 [Easy] 2578. 最小和分割

链接: 2578. 最小和分割

1. 题目描述

在这里插入图片描述

2. 思路分析

  • 这题如果不写暴力枚举的话,是个贪心,想了好一会。
  • 排序后奇偶交错分配即可。
  • 枚举的话,状压枚举可能写的更快一些。

3. 代码实现

class Solution:
    def splitNum(self, num: int) -> int:              
        s = []
        for c in str(num):
            if c != '0':
                s.append(c)
        s = sorted(s)
        n = len(s)
        h = n // 2
        a = []
        b = []
        for i,c in enumerate(s):
            if i & 1:
                b.append(c)
            else:
                a.append(c)
        x = int('0'+''.join(a))
        y = int('0'+''.join(b))
        return x + y 

三、[Medium] 2579. 统计染色格子数

链接: 2579. 统计染色格子数

1. 题目描述

在这里插入图片描述

2. 思路分析

数学能力已经退化,比赛时肯定不优先推公式。

  • 找规律dp。
  • 发现每次增加i*4个。

3. 代码实现

f = [1]*(10**5+1)
x = [1]*(10**5+1)
for i in range(2,10**5+1):
    x[i] = (i-1)*4
    f[i] = f[i-1] + x[i]
class Solution:
    def coloredCells(self, n: int) -> int:
        return f[n]        

四、[Medium] 2580. 统计将重叠区间合并成组的方案数

链接: 2580. 统计将重叠区间合并成组的方案数

1. 题目描述

在这里插入图片描述

2. 思路分析

  • 分析题意发现,有交集的区间一定在一起,那么划分完会变成x个集合,这x个集合分别可以在左边或右边就互不影响了。
  • 因此答案就是2**x。

3. 代码实现

MOD = 10 ** 9 + 7
class Solution:
    def countWays(self, ranges: List[List[int]]) -> int:
        cnt = 1
        ranges.sort()
        print(ranges)
        p = ranges[0][1]
        for x,y in ranges:
            if x <= p:
                p = max(p,y)
            else:
                cnt += 1
                p = y
        
        return pow(2,cnt,MOD)

五、[Hard] 2581. 统计可能的树根数目

链接: 2581. 统计可能的树根数目

1. 题目描述

在这里插入图片描述

2. 思路分析

  • 知道是换根DP,之前学了max版的换根dp,这次遇到加法的就不会了。
  • 学了一下。
  • 当然用模板也能做。

3. 代码实现

class Solution:
    def rootCount(self, edges: List[List[int]], guesses: List[List[int]], k: int) -> int:
        n = len(edges)+ 1
        g = [[] for _ in range(n)]
        for u,v in edges:
            g[u].append(v)
            g[v].append(u)
        s = set(tuple(x) for x in guesses)
        f = [0]*n
        def dfs(u,fa):
            for v in g[u]:
                if v != fa:
                    if (u,v) in s:
                        f[0] += 1
                    dfs(v,u)
        
        def reroot(u,fa):
            for v in g[u]:
                if v != fa:
                    f[v] = f[u] + int((v,u) in s) - int((u,v) in s)
                    reroot(v,u)
        dfs(0,-1)
        reroot(0,-1)
        return sum(x >= k for x in f)      

六、参考链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值