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()
相关推荐
江上清风山间明月2 小时前
使用python将markdown文件生成pdf文件
开发语言·python·pdf
天远Date Lab2 小时前
Java微服务实战:聚合型“全能小微企业报告”接口的调用与数据清洗
java·大数据·python·微服务
ss2732 小时前
阻塞队列:ArrayBlockingQueue如何用Lock与Condition实现高效并发控制
开发语言·python
lizz312 小时前
C++操作符重载深度解析
java·c++·算法
阿拉斯攀登2 小时前
电子签名:笔迹特征比对核心算法详解
人工智能·算法·机器学习·电子签名·汉王
_OP_CHEN2 小时前
【Python基础】(三)Python 语法基础进阶:条件循环 + 实战案例,从入门到精通的核心跳板
开发语言·python·python入门·条件语句·循环语句·python基础语法
ytttr8732 小时前
matlab进行利用遗传算法对天线阵列进行优化
开发语言·算法·matlab
一招定胜负2 小时前
机器学习算法三:决策树
算法·决策树·机器学习
无限进步_2 小时前
【C语言】队列(Queue)数据结构的实现与分析
c语言·开发语言·数据结构·c++·算法·链表·visual studio