首页 > 其他分享 >第 120 场双周赛(前缀和,双指针,树形dp+贪心)

第 120 场双周赛(前缀和,双指针,树形dp+贪心)

时间:2023-12-24 20:12:35浏览次数:27  
标签:return nums int List 双周 120 len ans dp

 

class Solution:
    def largestPerimeter(self, nums: List[int]) -> int:
        nums.sort()
        n = len(nums)
        s = list(accumulate(nums))
        for i in range(n - 1, 1, -1):
            if nums[i] < s[i - 1]:
                return nums[i] + s[i - 1]
        
        return -1

 

 

思考问题: 特殊 -> 一般,不熟悉的 -> 学过的

 统计子数组个数,固定一个端点,计算另一个端点个数。

设我们移除中间[l, r]的子数组之后满足题意,左侧 [0, l) 是递增的, 右侧(r, n - 1] 也是递增的, 此时我们可以移除 [l-1, r], [l-2, r] ... [0, r] 都是可以的,及ans += l + 2

再来考虑右端点如何移动,我们的前提是去掉中间左侧和右侧都是递增的,及当 a[j] < a[j + 1] 的时候,我们就可以将j左移。

class Solution:
    def incremovableSubarrayCount(self, a: List[int]) -> int:
        n = len(a)
        i = 0

        while i < n - 1 and a[i] < a[i + 1]:
            i += 1
        
        if i == n - 1:
            return n * (n + 1) // 2
        
        ans = i + 2
        j = n - 1
        while j > 0 and (j == n - 1 or a[j] < a[j + 1]):
            while i >= 0 and a[i] >= a[j]:
                i -= 1
            ans += i + 2
            j -= 1

        return ans

 

 

 树形dp问题,dfs

在数组中,要想是三个数乘积最大,可以选三个最大的正数,也可以选两个最小的负数,一个最大的正数。

我们采用自底向上的思想,先递归到叶子结点,在回溯过程中我们将子数组最大的三个数和最小的两个数返回给父节点。这样父节点就可以根据子节点提供的信息进行代价的计算。

class Solution:
    def placedCoins(self, edges: List[List[int]], cost: List[int]) -> List[int]:
        n = len(cost)
        ans = [1] * n
        g = [[] for _ in range(n)]

        for a, b in edges:
            g[a].append(b)
            g[b].append(a)

        def dfs(u: int, fa: int) -> List[int]:
            a = [cost[u]]
            for y in g[u]:
                if y != fa:
                    a.extend(dfs(y, u))
            
            a.sort()
            m = len(a)
            if m >= 3:
                ans[u] = max(a[-3] * a[-2] * a[-1], a[0] * a[1] * a[-1], 0)
            if m > 5:
                a = a[:2] + a[-3:]

            return a
        
        dfs(0, -1)
        return ans

 

标签:return,nums,int,List,双周,120,len,ans,dp
From: https://www.cnblogs.com/zk6696/p/17924725.html

相关文章

  • TCP与UDP协议有何区别?在LiteCVR中应该选择哪种方式?
    TCP(TransmissionControlProtocol)和UDP(UserDatagramProtocol)是互联网传输协议中最常用的两种协议。有用户在使用我们的平台时,经常会出现对于端口的疑问,同时也不了解端口的差别。今天我们来解释说明下LiteCVR平台关于国标GB28181协议接入下的TCP和UDP模式的说明及差异。1、TCP......
  • [ATdp v] Subtree
    [ATdpv]Subtree思路不难想到令\(f_u\)表示\(u\)子树内满足条件的答案数。有\[f_{u}=\prod_{v\inson_{u}}(f_v+1)\]然后换根求出\(g\)表示整棵树里的答案:\[g_u=(\dfrac{g_{fa}}{f_u+1}+1)f_u\]但是你会发现取模之后不一定有逆元,很尴尬。所以如果把\(f_......
  • 阿里云安装opensuse,并开启xrdp,让windows远程连接
    一、安装gnome桌面和xrdpzypperupdatezypperinstallpatterns-gnome-gnome_basicxrdp 二、通过yast开启vnc保存退出三、windows下使用远程桌面连接输入账号密码,即可登录。 ......
  • SDP(SERVICE DISCOVERY PROTOCOL)
    SDP是基于C/S架构的,即客户端可以发送请求来获取服务端的信息客户端和服务端不是固定的,一个设备既可以做客户端也可以做服务端,即谁发出请求谁做客户端,谁发出响应谁就做服务端。 服务记录: 每个profile都会提供一个服务记录,即通过sdp就能发现该profile所支持的一些信息......
  • TCP与UDP协议有何区别?在LiteCVR中应该选择哪种方式?
    TCP(TransmissionControlProtocol)和UDP(UserDatagramProtocol)是互联网传输协议中最常用的两种协议。有用户在使用我们的平台时,经常会出现对于端口的疑问,同时也不了解端口的差别。今天我们来解释说明下LiteCVR平台关于国标GB28181协议接入下的TCP和UDP模式的说明及差异。1、TCP......
  • 2023年12月传统行业产品经理认证NPDP在这学
    NPDP产品经理国际资格认证是国际公认的唯一的新产品开发专业认证,集理论、方法与实践为一体的全方位的知识体系,为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。我们针对互联网时代的个人、互联网企业、与传统企业推出一系列学习。课程从商业实战角度出发,梳理出在互联网......
  • 概率dp
    概率dpf[x]表示能走到x号城市的概率,f[1]=1考虑从x号城市出发到y号城市的高速公路,通过x号城市走到y号城市的概率有多大?f[y]+=f[x]/d[x],d[x]表示从x号城市出发的高速公路一共有多少条;能走到y号城市的概率\[f[y]=\sum_{x\inpre(y)}{\frac{f[x]}{d[x]}}\]pr......
  • 状压dp
    状压dp暴力枚举每一天摸不摸鱼,对于每一组方案,我们都可以判断其可不可行,从可行方案中选择快乐值总和最大的一组;复杂度\(O(2^{20})\)每一组方案可以用一个长度为n的二进制串来表示;从右到左第i个位置表示第i天摸不摸鱼(1表示,0表示不摸)当n=5时,10111表示在1,2,......
  • k8s~ingress_service_endpoint_pod四壮士
    在Kubernetes中,Service和Endpoints是两个重要的概念,它们之间存在着密切的关系。Service:Service是Kubernetes中用于定义一组Pod的访问方式的抽象。通过创建Service,可以为一组具有相同标签的Pod提供统一的访问入口,使得客户端可以通过Service来访问这些Pod,而无需了解其具体的IP地......
  • class080 状压dp-上【算法】
    class080状压dp-上【算法】算法讲解080【必备】状压dp-上Code1464.我能赢吗//我能赢吗//给定两个整数n和m//两个玩家可以轮流从公共整数池中抽取从1到n的整数(不放回)//抽取的整数会累加起来(两个玩家都算)//谁在自己的回合让累加和>=m,谁获胜//若先出手的玩家能稳赢则......