[LeetCode周赛复盘] 第 104 场双周赛20230513

一、本周周赛总结

  • T1 模拟。
  • T2 排序。
  • T3 前后缀分解/计数。
  • T4 排序+贡献法。
    在这里插入图片描述

6366. 老人的数目

6366. 老人的数目

1. 题目描述

在这里插入图片描述

2. 思路分析

按题意模拟即可。

3. 代码实现

class Solution:
    def countSeniors(self, details: List[str]) -> int:
        ans = 0
        for s in details:
            if int(s[11:13]) > 60:
                ans += 1
        return ans

6367. 矩阵中的和

6367. 矩阵中的和

1. 题目描述

在这里插入图片描述

2. 思路分析

  • 这题好像出过类似的,每次都删最大的,那排序后挨个删就行了。

3. 代码实现

class Solution:
    def matrixSum(self, nums: List[List[int]]) -> int:
        for r in nums:
            r.sort()
        m,n = len(nums),len(nums[0])
        ans = 0 
        for j in range(n):
            ans += max(nums[i][j] for i in range(m))
        return ans 

6369. 最大或值

6369. 最大或值

1. 题目描述

在这里插入图片描述

2. 思路分析

  • 首先贪心思路是,一定是对一个数操作k次才会最大,并且一定是操作位数最长的数。
  • 那我们尝试操作每个数,用较小的时间尝试答案。
  • 计数每个位置上的1个数,删除一个数时,某位上如果只有它一个1,那置0,否则还是1。最后或起来即可。

  • 另外可以前后缀分解,由于或运算可以继承,因此记录每个数前边所有数的或值和后边所有数的或值,尝试每个数操作k次和前后或在一起即可。

3. 代码实现

class Solution:
    def maximumOr(self, nums: List[int], k: int) -> int:
        cnt = [0]*30
        p = 0
        for v in nums:
            for j in range(30):
                if v>>j & 1:
                    p |= 1<<j
                    cnt[j] += 1
      
    
        ans = p
        for v in nums:
            mask = p
            for j in range(30):
                if (v>>j & 1) and cnt[j] == 1:
                    mask ^= 1<<j 
            
            ans = max(ans,mask|(v<<k))
        
        
        return ans

6423. 英雄的力量

6423. 英雄的力量

1. 题目描述

在这里插入图片描述

2. 思路分析

  • 这题的关键点在于,公式里的min没有平方。
  • 那么min是可以累计着算的。
  • 数据顺序无关,因此先排序,向右遍历的过程中,计算每个数v作为最大值时的贡献。
  • 那么ans += vv(前边所有的min)。
  • 而这题要子序列,前边的每个数y作为min时,y~v之间的数都可以取或不取,因此要计算2^x次。
  • 则每次v后移,前边的数要乘一次2,那么正好把v加进去,一起乘2即可。
  • 也可以推一下公式,更严谨一些,没必要罢了。

3. 代码实现

class Solution:
    def sumOfPower(self, nums: List[int],MOD = 10**9+7) -> int:           
        p = ans = 0 
        for v in sorted(nums):
            ans = (ans + v*v*(p+v))%MOD 
            p=(p*2+v)%MOD
        return ans     

参考链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值