首页 > 其他分享 >Weekly Contest 318

Weekly Contest 318

时间:2022-11-14 23:25:58浏览次数:76  
标签:node 318 Contest int nums len height ans Weekly

Weekly Contest 318

Problem A

Apply Operations to an Array

思路

按照题意模拟即可

代码

class Solution:
    def applyOperations(self, nums: List[int]) -> List[int]:
        l = len(nums)
        for i in range(0,l-1):
            if nums[i]==nums[i+1]:
                nums[i]*=2
                nums[i+1] =0
                
        ans = []
        for i in range(l):
            if nums[i]!=0:
                ans.append(nums[i])
        # print(ans,l)
        d = l-len(ans)
        for i in range(len(ans),l):
            ans.append(0)
        
        return ans
        

Problem B

Maximum Sum of Distinct Subarrays With Length K

思路

滑动窗口,r一直加,l当出现重复或者是找到一个可行解时加。是一个MAP存储位置,方便找到下一个l的位置,在跳的过程别忘了更新SUM

代码

class Solution:
    def maximumSubarraySum(self, nums: List[int], k: int) -> int:
        ans = 0
        i,j,n = 0,0,len(nums)
        M = {}
        SUM = 0
        if n<k:
            return 0
        if k == 1:
            return max(nums)
        l,r = 0,0
        while r<n:
            t = nums[r]
            SUM+=nums[r]
            if (t not in M.keys() or M[t]==-1):
                if r-l+1==k:
                    ans = max(ans,SUM)
                    SUM-=nums[l]
                    M[nums[l]]=-1
                    l+=1
                
            else:
                site = M[t]
                while l<=site:
                    M[nums[l]] =-1
                    SUM-=nums[l]
                    l+=1
            M[nums[r]] = r
            r+=1
        return ans

Problem C

Total Cost to Hire K Workers

思路

本质上来说就是用优先队列来实现$log(N)$的查找(Python用的最小堆),但是写起来BUG有点多,调起来很麻烦,赛后才过的。

代码

class Solution:
    def totalCost(self, costs: List[int], k: int, candidates: int) -> int:
        n = len(costs)
        # print(n)
        if candidates>=n:
            costs.sort()
            return sum(costs[:k])
        L = []
        # print(1)
        for i in range(candidates):
            l,r = i,n-1-i
            if r>=l:
                L.append([costs[l],l,1])
                if r!=l:
                    L.append([costs[r],r,2])
        t = (len(L)+1)//2
        l,r = t-1,n-t
        heapq.heapify(L)
        ans = 0
        for i in range(k):
            v,s,x = heapq.heappop(L)
            ans+=v
            if r-l<=1:
                continue
            if x == 1:
                heapq.heappush(L,[costs[l+1],l+1,1])
                l+=1
            else:
                
                heapq.heappush(L,[costs[r-1],r-1,2])
                r-=1
        return ans
        

Problem D

Height of Binary Tree After Subtree Removal Queries

思路

思路很简单,就是两次DFS。一次dfs确定深度,一次得到结果,在第二次DFS时做的是得到除当前路径之外的最大深度,也就是答案。感觉这个思路蛮巧妙的

代码

class Solution:
    def treeQueries(self, root: Optional[TreeNode], queries: List[int]) -> List[int]:
        height = defaultdict(int)  # 每棵子树的高度
        def get_height(node: Optional[TreeNode]) -> int:
            if node is None: return 0
            height[node] = 1 + max(get_height(node.left), get_height(node.right))
            return height[node]
        get_height(root)

        res = [0] * (len(height) + 1)  # 每个节点的答案
        def dfs(node: Optional[TreeNode], depth: int, rest_h: int) -> None:
            if node is None: return
            depth += 1
            res[node.val] = rest_h
            dfs(node.left, depth, max(rest_h, depth + height[node.right]))
            dfs(node.right, depth, max(rest_h, depth + height[node.left]))
        dfs(root, -1, 0)

        for i, q in enumerate(queries):
            queries[i] = res[q]
        return queries

总结

出了3题,但是感觉蛮冗余的,最后一题的思路蛮巧妙地,可惜没想出来。

标签:node,318,Contest,int,nums,len,height,ans,Weekly
From: https://www.cnblogs.com/baihualiaoluan/p/16890893.html

相关文章

  • [Leetcode Weekly Contest]319
    链接:LeetCode[Leetcode]2469.温度转换给你一个四舍五入到两位小数的非负浮点数celsius来表示温度,以摄氏度(Celsius)为单位。你需要将摄氏度转换为开氏度(Kelvin)和华......
  • AtCoder Beginner Contest 277 (F,G,Ex)
    之前没细想过OSU那个题,被G薄纱,F也没写完,输麻了懒得放链接,代码可以直接去AtCoder上搜。ID:YunQianQwQF首先求出每列的最大最小值,然后依此排序,如果出现insertion......
  • 2022 China Collegiate Programming Contest (CCPC) Weihai Site
    比赛链接:https://codeforces.com/gym/104023A.Dunai题意:\(n\)个队伍获得过冠军,告知每个队伍中的人及对应的位置,现在已知\(m\)个选手及它们的位置,问能组成多少个五......
  • AtCoder Beginner Contest 277 E // 最短路
    CrystalSwitches题目来源:AtCoderBeginnerContest277E-CrystalSwitches题目链接:E-CrystalSwitches(atcoder.jp)题意给定一个\(N\)个点\(M\)条边的无向图。......
  • The 2021 ICPC Asia Shenyang Regional Contest B
    B.BitwiseExclusive-ORSequence我们考虑一种构造方式就是让一个点为0然后连接他的就一直异或上他连接的目标这样虽然不能符合题意达到最小但是我们可以发现这个如......
  • (AtCoder Beginner Contest 277)E(分层图+最短路 or bfs搜两种状态)
    E-CrystalSwitches题目大意:给你n个点,m条边,连接成一个无向图,每个边最初有一个状态(0or1)表示是否能够通过,同时给k个开关位于k的顶点上,每次点击开关会使得所有路的状......
  • AtCoder Beginner Contest 277 D Takahashi's Solitaire
    Takahashi'sSolitaire双指针&&尺取先排个序,然后把数组扩展到\(2\timesn\),为了处理循环的情况然后双指针跑一下,限定\(r\)扩展的条件为:当前数字等于前一个或者......
  • AtCoder Beginner Contest 277 F Sorting a Matrix
    SortingaMatrix拓扑序首先可以明确无论怎么交换行列,原本在同一行或者同一列的元素,还是会处于同一行或者同一列条件一每行每行地看,如果能满足从小到大的条件,说明第......
  • AtCoder Beginner Contest 277 E Crystal Switches
    CrystalSwitches分层图+\(01bfs\)按钮的操作就是走分层图的边因此就构建两张图,然后将特殊点加一个双向边\(01bfs\)跑一下就行#include<iostream>#include<cstd......
  • AtCoder Beginner Contest 277 题解
    掉大分力(悲A-^{-1}直接模拟。#include<bits/stdc++.h>#defineIOSios::sync_with_stdio(false)#defineTIEcin.tie(0),cout.tie(0)#defineintlonglongusing......