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()
相关推荐
游乐码几秒前
C#Dicitionary
算法·c#
飞鸟真人5 分钟前
关于能所合一豆包问答笔记
笔记
华清远见IT开放实验室5 分钟前
AI 算法核心知识清单(深度实战版1)
人工智能·python·深度学习·学习·算法·机器学习·ai
牧瀬クリスだ5 分钟前
七大排序一次满足
数据结构·算法·排序算法
liu****6 分钟前
第15届省赛蓝桥杯大赛C/C++大学B组
开发语言·数据结构·c++·算法·蓝桥杯·acm
wb1896 分钟前
docker-ce容器技术重习
运维·笔记·docker·容器·云计算
咖啡忍者7 分钟前
【SAP CO】4.COPC产品成本控制-5.生产订单
笔记
_李小白10 分钟前
【OSG学习笔记】Day 40: EventCallback(事件回调)
笔记·学习
百结21410 分钟前
Python网络编程
网络·python
无缘之缘18 分钟前
蓝桥杯手把手教你备战(C/C++ B组)(最全面!最贴心!适合小白!)
c语言·c++·算法·蓝桥杯