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()
相关推荐
一隅论数智3 天前
给AI一张“业务概念地图“:本体如何从哲学走向企业智能
大数据·人工智能·经验分享·笔记·学习·学习方法·政务
倒头就睡的小比特3 天前
算法竞赛C++常用的STL
c++·算法
默_笙3 天前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
qq_426003963 天前
启动playwright录制codegen生成自动化测试脚本
python·自动化
虎头金猫3 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
长沙三为智能科技3 天前
家政小程序开发从0到上线:五阶段交付流程与验收清单
python
伞伞悦读3 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
猎头南楼3 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
只睡四小时3 天前
Canvas 弹道联机实战:700 行 + 固定时间步长
python·websocket·html5·游戏开发·canvas