[LeetCode周赛复盘] 第 104 场双周赛20230513
- 一、本周周赛总结
- 6366. 老人的数目
- 1. 题目描述
- 2. 思路分析
- 3. 代码实现
- 6367. 矩阵中的和
- 1. 题目描述
- 2. 思路分析
- 3. 代码实现
- 6369. 最大或值
- 1. 题目描述
- 2. 思路分析
- 3. 代码实现
- 6423. 英雄的力量
- 1. 题目描述
- 2. 思路分析
- 3. 代码实现
- 参考链接
一、本周周赛总结
- 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