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()
相关推荐
牧羊人.33312 小时前
卷积神经网络之VGG
人工智能·深度学习·神经网络·算法·cnn
DeepVisionary13 小时前
为拿并网许可,OpenAI在佐治亚新园区同意高峰期断电三成
python·自动化
小郎君65813 小时前
Vue 多标签页的加载态设计:为什么我没有用 Suspense 实现 PageLoading
vue.js·算法
一支蜉蝣13 小时前
Day26 XD安全学习笔记--PHP 应用&模版引用&Smarty渲染&MVC 模型&数据联动&RCE 安全
笔记·网络安全·html·php
VIP_CQCRE13 小时前
内容自动化越跑越乱?先补上状态、去重和失败恢复
python·ai·工作流·幂等设计·内容自动化
JJJennie77713 小时前
MAI Gateway私有化部署全攻略:大模型网关如何接入?附架构图
算法·gateway·ai网关·魔芋ai
東隅已逝,桑榆非晚14 小时前
算法3.双指针法-快乐数
c++·笔记·学习·算法
我喜欢就喜欢14 小时前
RAG 重排序 Rerank 实战:用 bge-reranker 把 Top-K 命中率拉回来
python·大模型·向量检索·rag·rerank
专注仿真14 小时前
卷积神经网络(CNN)算法详解
人工智能·python·算法·代码·大模型训练