本文最后更新于:2025年4月2日 晚上
3.12 三十
2暴力 + 2贪心
总算没再摆烂,不过题目还是要问问豆包,才能理解,过几天重写一遍题目再试试
3.13 二十九
6 简单
贪心排序,其实就是排序
406.
根据身高重建队列 - 力扣(LeetCode)
1 2 3 4 5 people = [[7 ,0 ],[4 ,4 ],[7 ,1 ],[5 ,0 ],[6 ,1 ],[5 ,2 ]] people.sort(key = lambda x: (-x[0 ], x[1 ]))
贪心 ,但是我感觉就是排序,可能这俩就经常结合着用吧
3074.
重新分装苹果 - 力扣(LeetCode)
排序 + 贪心
2279.
装满石头的背包的最大数量 - 力扣(LeetCode)
1 2 chak = [a - b for a, b in zip (capacity, rocks)]
这玩意,力扣第一题吗,
可暴力
可哈希 + 前缀
1.
两数之和 - 力扣(LeetCode)
1 2 3 d = {} d[11 ] = 0 d[7 ] = 1
前缀和
P8218
【深进1.例1】求区间和 - 洛谷
洛谷的IDE感觉有点小麻烦
emmm,纯史来的
二分查找 & bisect库
P2249
【深基13.例1】查找 - 洛谷
这个题目:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 from bisect import *import sysinput = lambda : sys.stdin.readline().strip() n, m = map (int , input ().split()) nums = list (map (int , input ().split())) Q = list (map (int , input ().split())) s = set (nums) for q in Q: if q not in s: print (-1 , end = " " ) else : print (bisect(nums, q - 1 ) + 1 , end = " " )
3.14 二十八
坏,今天怎么感觉激情减退力
莫斯,我直接去写题去
二分-中等
二分主要就是它边界的问题,一定要搞清楚
2563.
统计公平数对的数目 - 力扣(LeetCode)
二分-中等
34.
在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)
3.15 二十七
草了wd,摆了一天
我再也不考虑宿舍学习了😭
3.16 二十六
library!
3 二分
二分答案 模板:代码模板
(Python) - Open Wiki Community
“二分答案”
这个名称源于其核心的解题思路,即通过二分法来枚举答案并判断其是否可行。
具体来说,在面对一个问题时,如果能够确定答案所在的范围,并且这个范围具有单调性(例如随着某个变量的增加,答案要么单调递增要么单调递减),就可以使用二分答案的方法。
它就像在一个有序的 “答案序列”
中进行查找,每次都取中间的那个值作为尝试答案,然后根据这个答案是否满足问题的条件来决定是继续在左半部分还是右半部分寻找,不断将答案的范围缩小一半,直到找到满足条件的最优答案。这种将答案空间不断二分以逼近正确答案的方式,就如同在有序数组中进行二分查找元素一样,所以被称为
“二分答案”。例如,在一些求满足某种条件下的最大(小)值问题中,通过二分答案可以高效地找到符合条件的最值。
二分答案
2226.
每个小孩最多能分到多少糖果 - 力扣(LeetCode)
二分答案
3.冶炼金属
- 蓝桥云课
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 import sysinput = lambda : sys.stdin.readline().strip() n = int (input ()) a, b = zip (*[map (int , input ().split()) for _ in range (n)])def bisect (lo, hi, check ): while lo < hi: i = (lo + hi) // 2 if check(i): hi = i else : lo = i + 1 return lodef check_min (v ): return all (A // v <= B for A, B in zip (a, b))def check_max (v ): return any (A // v < B for A, B in zip (a, b)) m = bisect(1 , 10 **9 , check_min) M = bisect(1 , 10 **9 , check_max) - 1 print (m, M)
1.分巧克力
- 蓝桥云课
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 import osimport sys h = [0 ] * 100000 w = [0 ] * 100000 def check (a ): num = 0 for i in range (n): num += (w[i] // a) * (h[i] // a) if num >= k: return True return False n, k = map (int , input ().split())for i in range (n): h[i], w[i] = map (int , input ().split()) l, r = 1 , 100000 while l < r: mid = (l + r) // 2 if check(mid): l = mid + 1 else : r = mid print (r - 1 )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 import osimport sys def check (a ): num = 0 for h, w in c: num += (h // a) * (w // a) if num >= k: return True return False n, k = map (int , input ().split()) c = [list (map (int , input ().split())) for _ in range (n)] l, r = 1 , 100000 while l < r: mid = (l + r) // 2 if check(mid): l = mid + 1 else : r = mid print (r - 1 )
3.17 二十五
md改成倒计时,急迫感一下就上来了😭
二分
730.
机器人跳跃问题 - AcWing题库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 def check (x ): for i in range (n): x = 2 *x - h[i] if x < 0 : return False return True n = int (input ()) h = list (map (int , input ().split())) l, r = 0 , 100000 while l < r: mid = (l + r) // 2 if check(mid): r = mid else : l = mid + 1 print (l)
二分吗?暴力吧
1221. 四平方和
- AcWing题库
1 2 3 4 5 6 7 8 9 10 11 12 import mathimport sys n = int (input ())for i in range (int (math.sqrt(n // 4 )) + 1 ): for j in range (int (math.sqrt((n - i*i) // 3 )) + 1 ): for k in range (int (math.sqrt((n - i*i - j*j) // 2 )) + 1 ): z = int (math.sqrt(n - i*i - j*j - k*k)) if n == z*z + i*i + j*j + k*k: print (i, j , k, z) sys.exit()
暴力
4.最少刷题数
- 蓝桥云课
BFS
695.
岛屿的最大面积 - 力扣(LeetCode)
3.18 二十四
都怪牢宇,光聊天
贪心
1963.
使字符串平衡的最小交换次数 - 力扣(LeetCode)
暴力
2614.
对角线上的质数 - 力扣(LeetCode)
3.19 二十三
BFS
0长草
- 蓝桥云课
DFS
5.最大数字
- 蓝桥云课
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 import sysinput = lambda : sys.stdin.readline().strip() N, A, B = map (int , input ().split()) sN = str (N) res = 0 def dfs (i, n, a, b ): global res if i == len (sN): res = max (res, n) return x = int (sN[i]) d = min (9 - x, a) dfs(i + 1 , n * 10 + (x + d), a - d, b) if b >= x + 1 : dfs(i + 1 , n * 10 + 9 , a, b - (x + 1 )) dfs(0 , 0 , A, B)print (res)
DFS
1.小朋友崇拜圈
- 蓝桥云课
这题牛魔的这么简单吗,感觉还是upTsingPig 讲得好
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 import sysinput = lambda : sys.stdin.readline().strip() sys.setrecursionlimit(10000 ) n = int (input ()) g = [0 ] + list (map (int , input ().split())) res = 0 d = {}def dfs (u, idx ): global res if d.get(u) is not None : res = max (res, idx - d[u]) return d[u] = idx dfs(g[u], idx + 1 )for u in range (1 , n + 1 ): dfs(u, 1 )print (res)
3.20 二十二
时光时光慢些吧,我还什么都不会呢😭😭
枚举
1210.
连号区间数 - AcWing题库
并查集
P1551 亲戚 -
洛谷
3.21 二十一
3.22 二十
3.23 十九
3.24 十八
3.25 十七
3.26 十六
并查集 8太懂
P1536 村村通 -
洛谷
并查集
1.合根植物
- 蓝桥云课
前缀和
1.卡片
- 蓝桥云课
1 2 3 4 5 6 7 8 9 10 11 12 import osimport sys n = int (input ()) ans = 0 for i in range (1 , n + 1 ): ans = ans + i if ans >= n: print (i) break
模拟
1.裁纸刀
- 蓝桥云课
3.27 十五
3.28 十四
3.29 十三
我tmd真的是,该啊,哎
没紧迫感,总是想玩
3.30 十二
动态规划
70. 爬楼梯 -
力扣(LeetCode)
1 2 3 4 5 6 7 8 9 10 from functools import *class Solution : def climbStairs (self, n: int ) -> int : @lru_cache(maxsize = None ) def dfs (n ): if n == 0 or n ==1 : return 1 else : return dfs(n - 1 ) + dfs(n - 2 ) return dfs(n)
动态规划
198.
打家劫舍 - 力扣(LeetCode)
选或者不选
\(f[i][1]\) 表示考虑完前 \(i\) 个屋子, 且第 \(i\) 个屋子选的最大金额
\(f[i][0]\) 表示考虑完前 \(i\) 个屋子,且第 \(i\) 个屋子不选的最大金额
不选,\(f[i][0] = \text{max(f[i - 1][1],
f[i - 1][0])}\)
选, \(f[i][1] = \text{f[i - 1][0] + nums[i
- 1]}\)
1 2 3 4 5 6 7 8 9 class Solution : def rob (self, nums: List [int ] ) -> int : n = len (nums) f = [[0 ] * 2 for _ in range (n + 1 )] for i in range (1 , n + 1 ): f[i][0 ] = max (f[i-1 ][1 ], f[i-1 ][0 ]) f[i][1 ] = f[i-1 ][0 ] + nums[i-1 ] return max (f[n][1 ], f[n][0 ])
1 2 3 4 5 6 7 8 9 class Solution : def rob (self, nums: List [int ] ) -> int : n = len (nums) dp = [0 ] * (n + 1 ) dp[0 ] = 0 dp[1 ] = nums[0 ] for k in range (2 , n + 1 ): dp[k] = max (dp[k - 1 ], nums[k - 1 ] + dp[k - 2 ]) return dp[n]
3.31 十一
§1.1 爬楼梯
动态规划
746.
使用最小花费爬楼梯 - 力扣(LeetCode)
1 2 3 4 5 6 7 8 9 10 11 12 13 from functools import *class Solution : def minCostClimbingStairs (self, cost: List [int ] ) -> int : @lru_cache(maxsize = None ) def dfs (n ): if n == 0 or n == 1 : return 0 else : return min (dfs(n - 1 ) + cost[n - 1 ], dfs(n - 2 ) + cost[n - 2 ]) n = len (cost) return dfs(n)
4.1 十
递归
sort
一维前缀和
DFS
整数二分
素数
GCD
图的存储
Dijkstra
dp
4.2 九
模拟
1.门牌制作
- 蓝桥云课
1 2 3 4 5 6 7 8 9 10 import osimport sys ans = 0 for i in range (2 , 2021 ): s = str (i) for j in s: if j == '2' : ans = ans + 1 print (ans)
count方法
1 2 3 4 5 6 7 8 9 import osimport sys b = 0 for i in range (1 , 2021 ): a = str (i).count('2' ) b += aprint (b)
4.3 八
6
模拟
1.小球反弹
- 蓝桥云课
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import osimport sysprint (1100325199.77 )
模拟
1.平方差
- 蓝桥云课
范围中奇数数量的计算
一个数的倍数的计算
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import osimport sys L, R = map (int , input ().split()) ans1 = (R + 1 ) // 2 - (L - 1 + 1 ) // 2 ans2 = R // 4 - (L-1 ) // 4 print (ans1 + ans2)
模拟
2.幸运数
- 蓝桥云课
数字转成字符串,字符串又转成列表,列表的计算
1 2 3 4 5 6 7 8 9 10 11 12 13 14 import osimport sys ans = 0 for i in range (1 , 100000000 ): c = len (str (i)) if c % 2 == 0 : k = c // 2 cnt = list (map (int , list (str (i)))) if sum (cnt[:k]) == sum (cnt[k:]): ans = ans + 1 print (ans)
模拟
3.幸运数字
- 蓝桥云课
注意check函数怎么写的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 def check (n, mod ): x = n ans = 0 while x > 0 : ans += x % mod x //= mod return n % ans == 0 cnt = 0 i = 1 while True : if check(i,2 ) and check(i,8 ) and check(i,10 ) and check(i,16 ): cnt = cnt + 1 if cnt == 2023 : break i = i + 1 print (215040 )
暴力 or 前缀和
2.大学里的树木要维护
- 蓝桥云课
列表的应用: sum(A[a-1:b])计算a-b之间数字的和
1 2 3 4 5 6 7 8 N, M = map (int , input ().split()) A = list (map (int , input ().split()))for i in range (M): a, b = map (int , input ().split()) print (sum (A[a-1 :b]))
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 N, M = map (int , input ().split()) A = list (map (int , input ().split())) ans = [0 ] * (N + 1 ) for i in range (N): ans[i + 1 ] = A[i] + ans[i]for j in range (M): a, b = map (int , input ().split()) kkk = ans[b] - ans[a-1 ] print (kkk)
暴力 or 前缀和
1.异或和之和
- 蓝桥云课
咱就暴力吧先
1 2 3 4 5 6 7 8 9 10 11 12 13 n = int (input ()) A = list (map (int , input ().split())) ans = 0 for L in range (n): sum1 = 0 for R in range (L,n): sum1 = sum1 ^ A[R] ans = ans + sum1print (ans)
暴力 or 前缀和
1.求和
- 蓝桥云课
1 2 3 4 5 6 7 8 9 10 11 12 n = int (input ()) A = list (map (int , input ().split())) ans = 0 for i in range (n): for j in range (i + 1 , n): ans = ans + A[i] * A[j]print (ans)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 n = int (input ()) A = list (map (int , input ().split())) sum1 = sum (A) ans = 0 for i in range (n): sum1 = sum1 - A[i] ans = ans + A[i] * sum1 print (ans) n = int (input ()) a = list (map (int , input ().split())) sum1 = [0 ] * (n + 1 ) ans = 0 for i in range (n): sum1[i + 1 ] = sum1[i] + a[i] ans = ans + a[i] * sum1[i] print (ans)
4.4 七
满分100,难度为0
1.九进制转十进制
- 蓝桥云课
前缀和
1.二维前缀和
- 蓝桥云课
前缀和
2.棋盘
- 蓝桥云课
前缀和
3.挖矿
- 蓝桥云课
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 n, m = map (int , input ().split()) a = list (map (int , input ().split())) r = [0 ] * (m + 1 ) l = [0 ] * (m + 1 )for i in a: if i > 0 and i <= m: r[i] = r[i] + 1 elif i < 0 and abs (i) <= m: l[abs (i)] = l[abs (i)] + 1 for i in range (m): r[i + 1 ] = r[i + 1 ] + r[i] l[i + 1 ] = l[i + 1 ] + l[i] ans = 0 for i in range (1 , m + 1 ): k = l[i] if m - 2 *i > 0 : k = k + r[m - 2 *i] ans = max (ans, k)for i in range (1 , m + 1 ): k = r[i] if m - 2 *i > 0 : k = k + l[m - 2 *i] ans = max (ans, k)if 0 in a: ans = ans + 1 print (ans)
4.5 六
1.寻找整数
- 蓝桥云课
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 L=[5458460249 , 12590206409 ] step=L[1 ]-L[0 ] flag=0 for i in range (L[0 ],10 **17 ,step): if i%20 ==9 and i%25 ==9 and i%26 ==23 and i%27 ==20 and i%28 ==25 and i%29 ==16 and i%30 ==29 and i%31 ==27 and i%32 ==25 and i%33 ==11 and i%34 ==17 and i%35 ==4 and i%36 ==29 and i%37 ==22 and i%38 ==37 and i%39 ==23 and i%40 ==9 and i%41 ==1 and i%42 ==11 and i%43 ==11 : print (i) break
4.6 五
4..7 四
贪心
B-小紫的劣势博弈_牛客周赛
Round 85
小红想最小,那就拿最小的数,小紫想最大,那就减最小的数,排个序,然后奇加偶减即可
1 2 3 4 5 6 7 8 9 10 11 12 13 n = int (input ()) nums = list (map (int , input ().split())) nums2 = sorted (nums) ans = 0 for i in range (1 , n + 1 ): if (i % 2 == 1 ): ans = ans + nums2[i - 1 ] else : ans = ans - nums2[i - 1 ]print (ans)
前缀和
1.二维前缀和
- 蓝桥云课
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 n, m, q = map (int , input ().split()) a = [[0 ] * (m + 1 ) for _ in range (n + 1 )] k = [[0 ] * (m + 1 ) for _ in range (n + 1 )] for i in range (1 , n + 1 ): a[i] = [0 ] + list (map (int , input ().split())) for j in range (1 , m + 1 ): k[i][j] = k[i][j-1 ] + a[i][j] + k[i-1 ][j] - k[i - 1 ][j - 1 ]def get_k (x1, y1, x2, y2 ): if x1 > x2 or y1 > y2: return 0 return k[x2][y2] - k[x1 - 1 ][y2] - k[x2][y1 - 1 ] + k[x1 - 1 ][y1 - 1 ]for _ in range (q): x1, y1, x2, y2 = map (int , input ().split()) print (get_k(x1, y1, x2, y2))
4.8 三
4.9 二
U535982 J-A
小梦的AB交换 - 洛谷
1 2 3 4 5 6 7 8 9 10 11 12 T = int (input ())for _ in range (T): n = int (input ()) s = input () a = 0 for i in range (2 *n): if i % 2 != 0 : if s[i] == 'A' : a = a + 1 print (min ())
4.10 一
贪心
C-小苯的Z串匹配_牛客周赛
Round 87
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 t = int (input ())for _ in range (t): n = int (input ()) arr = list (map (int , input ().split())) s = input ().strip() cnt = 0 for i in range (n): char = s[i] if char == '<' : if arr[i] >= 0 : cnt = cnt + 1 arr[i] = -1 elif char == '>' : if arr[i] <= 0 : cnt = cnt + 1 arr[i] = 1 elif char == 'Z' : if arr[i - 1 ] * arr[i] <= 0 : cnt = cnt + 1 arr[i] = arr[i - 1 ] print (cnt)
枚举
D-小红杀怪_2024BistuACM萌新练习赛01
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 import mathdef main (): a, b, x, y = map (int , input ().split()) ans = float ('inf' ) max_k = max ((a + y - 1 ) // y, (b + y - 1 ) // y) for i in range (max_k + 1 ): num_a = max (0 , a - i * y) num_b = max (0 , b - i * y) res_a = (num_a + x - 1 ) // x res_b = (num_b + x - 1 ) // x ans = min (ans, i + res_a + res_b) print (ans)if __name__ == "__main__" : main()
4.11 〇
前缀和
B3612
【深进1.例1】求区间和 - 洛谷
1 2 3 4 5 6 7 8 9 10 11 12 n = int (input ()) a = [0 ] + list (map (int , input ().split())) sa = [0 ] * (n + 1 ) for i in range (1 , n + 1 ): sa[i] = sa[i - 1 ] + a[i] q = int (input ())for _ in range (q): m, n = map (int , input ().split()) print (sa[n] - sa[m - 1 ])
前缀和
U549625
小苯的区间和疑惑 - 洛谷
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 def main (): n = int (input ()) a = [0 ] + list (map (int , input ().split())) max_left = [0 ] * (n + 1 ) max_right = [0 ] * (n + 1 ) res = [0 ] * (n + 1 ) max_left[1 ] = a[1 ] for i in range (2 , n + 1 ): max_left[i] = max (a[i], max_left[i - 1 ] + a[i]) max_right[n] = a[n] for i in range (n - 1 , 0 , -1 ): max_right[i] = max (a[i], max_right[i + 1 ] + a[i]) for i in range (1 , n + 1 ): res[i] = max_left[i] + max_right[i] - a[i] print (*res[1 :n + 1 ], sep=' ' ) if __name__ == "__main__" : main()
前缀和
[P3131 USACO16JAN]
Subsequences Summing to Sevens S - 洛谷
有思路的前缀和
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 n = int (input ()) pre = [0 ] * (n + 1 ) first = [-1 ] * 7 last = [-1 ] * 7 for i in range (1 , n + 1 ): num = int (input ()) pre[i] = (pre[i - 1 ] + num) % 7 for i in range (n, 0 , -1 ): first[pre[i]] = i first[0 ] = 0 for i in range (1 , n + 1 ): last[pre[i]] = i max_len = 0 for i in range (7 ): if first[i] != -1 and last[i] != -1 : max_len = max (max_len, last[i] - first[i])print (max_len)
前缀和
[P8649 蓝桥杯 2017
省 B] k 倍区间 - 洛谷
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 n, k = map (int , input ().split()) arr = [0 ] * n for i in range (n): arr[i] = int (input ()) res = 0 m = 0 nums = [0 ] * k nums[0 ] = 1 for i in range (n): m = (m + arr[i]) % k res += nums[m] nums[m] += 1 print (res)
DFS
[P2036 COCI
2008/2009 #2] PERKET - 洛谷
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 from math import inf M = 15 a = [0 ] * (M + 1 ) b = [0 ] * (M + 1 ) n = 0 ans = inf def dfs (i, x, y ): """ 深度优先搜索配料组合 :param i: 当前配料编号 :param x: 当前总酸度(酸度的乘积) :param y: 当前总甜度(甜度的和) """ global ans if i > n: if x == 1 and y == 0 : return ans = min (abs (x - y), ans) return dfs(i + 1 , x * a[i], y + b[i]) dfs(i + 1 , x, y) n = int (input ()) for i in range (1 , n + 1 ): a[i], b[i] = map (int , input ().split()) dfs(1 , 1 , 0 ) print (ans)