文章目录
- 习题
- 1.抓猪拿国一
- 2.蓝桥字符
- 3.蓝桥大使
- 4.拳头对决
习题
比赛地址
1.抓猪拿国一
- 十分简单的签到题
print(sum(list(range(17))))
2.蓝桥字符
- 常见的字符匹配的问题,是一个
二维dp
的问题,转化为对应的动态规划
求解
力扣的相似题目
可以关注灵神的讲解
import os
import sys# 请在此输入您的代码# 动态规划的问题
s = input()
n = len(s)
# 定义dp[i][j]表示为lan [:i] 在 s[:j]中出现的次数
dp = [[0]*(n+1) for _ in range(4)]
s1 = "lan"
# 初始化dp[0][i] = 1
for i in range(n+1):dp[0][i] = 1
for i in range(3):for j in range(n):if s1[i] == s[j]:dp[i+1][j+1] = dp[i+1][j] + dp[i][j]else:dp[i+1][j+1] = dp[i+1][j]
print(dp[-1][-1])
- 另一种思路,使用前缀的思路
3.蓝桥大使
- 考察的知识点是:
排序+贪心
- 可以看到最后总共求解的是
总共的最大值
,那么我们可以先安排其中一方先选,另一方后选 - 在这里,我们让小蓝先选,那么小蓝应该选哪些元素?
贪心化的思路:选对应的下标中A[i]-B[i]差距最大的那些元素,这样的话,才可以发挥小蓝这边的优势
n = int(input())
A,B = [],[]
cha = []
for i in range(n):a,b = map(int,input().split())A.append(a)B.append(b)cha.append([a-b,i])
# 贪心化做法,排序,将A-B的结果作差,由小蓝先选
# 降序排序
ans = 0
cha.sort(reverse=True)
for j in range(n):if j <= n//2 -1:ans += A[cha[j][1]]else:ans += B[cha[j][1]]
print(ans)
4.拳头对决
- 题目有坑:
不是1v1
,并且蓝队和红队的对应的A,B
要区别好 - 题目的问题就转化为这个
如何在一个区间内,求解出小于A[i]的B[j]的个数?
,在这里,就用到这个树状数组
这一个工具
推荐大家先完成力扣的几个相关的知识,先感受一下
树状数组
的功能与作用
相关的博客
- 要学会适应在大范围的时候,离散化这个数值再使用这个树状数组,并且到底求解的是
正序对
还是逆序对
,对应的排序是升序还是降序
得区分好