Python 算法竞赛 —— 基础篇(更新ing)

前言

这篇文章主要整理一些算法竞赛常用模板的 Python 实现,适用于编程算法竞赛,大厂手撕代码,算法设计与分析期末考试等等...

话不多说,我们开始吧~

建议先食用:

python基础语法--输入和输出

Python 算法竞赛/刷题全指南

题目来源:AcWing


目录

  • 前言
  • 第一章------基础算法
    • [1.1 二分](#1.1 二分)
        • [题1 数的范围](#题1 数的范围)
        • [题2 数的三次方根](#题2 数的三次方根)
    • [1.2 前缀和](#1.2 前缀和)
        • [题1 一维前缀和](#题1 一维前缀和)
        • [题2 二维前缀和](#题2 二维前缀和)

第一章------基础算法

1.1 二分

题1 数的范围

输入样例:

6 3

1 2 2 3 3 4

3

4

5

输出样例:

3 4

5 5

-1 -1

链接:789. 数的范围

python 复制代码
import os 
import sys


def solve(x: int) -> None:
    # 二分查找 x 最左边的位置
    l, r = 0, n - 1
    while l < r:
        mid = (l + r) >> 1
        if a[mid] < x:
            l = mid + 1
        else:
            r = mid
    
    if a[l] == x:
        print(l, end = " ")
    else:
        print("-1 -1") # 不存在 x 按要求返回 -1 -1
        return 
    # 二分查找 x 最左边的位置
    l, r = 0, n - 1
    while l < r:
        mid = (l + r + 1) >> 1
        if a[mid] > x:
            r = mid - 1 
        else:
            l = mid
    print(r)


if __name__ == '__main__':
    
    n, k = map(int, input().split())
    a = list(map(int, input().split()))
    
    for i in range(k):
        q = int(input())
        solve(q)
题2 数的三次方根

输入样例:

1000.00

输出样例:

10.000000

链接:790. 数的三次方根

python 复制代码
import os
import sys


def solve():
    n = float(input())
    l, r = -10000.0, 10000.0
    while r - l >= 1e-8:
        mid = (l + r) / 2
        if mid**3 > n:
            r = mid
        else:
            l = mid
    
    print('{:.6f}'.format(l))


if __name__ == '__main__':
    solve()

1.2 前缀和

题1 一维前缀和

输入样例:

5 3

2 1 3 6 4

1 2

1 3

2 4

输出样例:

3

6

10

链接:795. 前缀和

python 复制代码
import os 
import sys


def solve():
    n, m = map(int, sys.stdin.readline().split())
    array = [0] + list(map(int, sys.stdin.readline().split()))
    
    suma = [0] * (n + 1)
    
    for i in range(1, n + 1):
        suma[i] = suma[i - 1] + array[i]
    
    for i in range(m):
        l, r = map(int, sys.stdin.readline().split())
        print(suma[r] - suma[l - 1])


if __name__ == '__main__':
    solve()
题2 二维前缀和

输入样例:

3 4 3

1 7 2 4

3 6 2 8

2 1 2 3

1 1 2 2

2 1 3 4

1 3 3 4

输出样例:

17

27

21

链接:796. 子矩阵的和

python 复制代码
import os
import sys


def solve_2d():
    n, m, k = map(int, sys.stdin.readline().split())
    array = list(list(map(int, sys.stdin.readline().split())) for i in range(n))
    
    suma = [[0] * (m + 1) for i in range(n + 1)]
    
    for i in range(1, n + 1):
        for j in range(1, m + 1):
            # 注意 array 的下标要 - 1,因为 array 是从 0 索引的
            suma[i][j] = suma[i - 1][j] + suma[i][j - 1] - suma[i - 1][j - 1] + array[i-1][j-1]
            
    for i in range(k):
        x1, y1, x2, y2 = map(int, sys.stdin.readline().split())
        print(suma[x2][y2] - suma[x1 - 1][y2] - suma[x2][y1 - 1] + suma[x1 - 1][y1 - 1])


if __name__ == '__main__':
    solve_2d()
相关推荐
花酒锄作田28 分钟前
使用 pkgutil 实现动态插件系统
python
灵感__idea2 小时前
Hello 算法:众里寻她千“百度”
前端·javascript·算法
前端付豪4 小时前
LangChain链 写一篇完美推文?用SequencialChain链接不同的组件
人工智能·python·langchain
曲幽5 小时前
FastAPI实战:打造本地文生图接口,ollama+diffusers让AI绘画更听话
python·fastapi·web·cors·diffusers·lcm·ollama·dreamshaper8·txt2img
老赵全栈实战5 小时前
Pydantic配置管理最佳实践(一)
python
阿尔的代码屋11 小时前
[大模型实战 07] 基于 LlamaIndex ReAct 框架手搓全自动博客监控 Agent
人工智能·python
Wect12 小时前
LeetCode 130. 被围绕的区域:两种解法详解(BFS/DFS)
前端·算法·typescript
NAGNIP1 天前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
AI探索者1 天前
LangGraph StateGraph 实战:状态机聊天机器人构建指南
python
AI探索者1 天前
LangGraph 入门:构建带记忆功能的天气查询 Agent
python