El primer día de aprendizaje de python --- prefijo y

1. 3956. Matriz truncada (suma de prefijo)

inserte la descripción de la imagen aquí
*** Significado de la pregunta: ***
Se requiere cortar una matriz dos veces y dividirla en tres partes, y luego los elementos de la matriz de estas tres partes son los mismos.
*** Idea: ***
Use el prefijo suma para enumerar la posición donde aparece el primer cuchillo. Si el prefijo suma de la posición que aparece es 2/3 suma, entonces significa que se puede cortar un cuchillo aquí, que es el segundo cuchillo, y se agrega el primer cuchillo Cuántos métodos de corte hay; si la suma del prefijo es 1/3 suma, entonces significa que se puede cortar uno, que es el primer corte.

n=int(input())#input的返回类型是str
a=list(map(int,input().split()))
s=sum(a)
if s%3:#不能被3整除说明不行
    print(0)
else:
    p=ans=pre=0
    for i in range(n-1):#i是第三段的起点,cnt表示有多少个j满足要求
        pre+=a[i]
        if pre==s*2//3:#'//'除完之后只取整数部分
            ans+=p
        if pre==s//3:
            p+=1
    print(ans)

Dos, prefijo y (prefijo y)

inserte la descripción de la imagen aquí
Esta pregunta es una típica suma de prefijos, recuerda este foro.

[0]+lista(mapa(int,entrada().split()))

La expresión [0] en Python se usa para crear una lista con un solo elemento, que es el número entero 0. Cuando combina [0] con el operador +, concatena esta lista con el resultado de la expresión list(map(int,input().split()).

En Python, la función input() lee una línea de texto de la entrada estándar (generalmente el teclado), y el método split() de la cadena divide la cadena en una lista de subcadenas según los delimitadores. El delimitador utilizado por split() tiene como valor predeterminado los espacios, por lo que input().split() divide la línea de entrada en una lista de cadenas separadas por espacios.

La función map() aplica la función int() a cada cadena en la lista devuelta por split(), produciendo una lista de enteros.

Entonces, cuando combina [0] con el operador +, crea una nueva lista que consta del número entero 0 y la lista de números enteros producidos por map(int,input().split()) . El propósito de agregar el número entero 0 al principio de la lista puede depender del contexto del código, pero puede usarse como marcador de posición o como valor etiquetado.

n,m=map(int,input().split())
pre=[0]+list(map(int,input().split()))#一维数组的读取
for i in range(1,n+1):
    pre[i]+=pre[i-1]
for _ in range(m):
    l,r=map(int,input().split())
    print(pre[r]-pre[l-1])

3. La suma de submatrices (prefijo suma)

inserte la descripción de la imagen aquí
Prefijos bidimensionales típicos y

rango(1,n+1)

Cuando se usa la función range() en Python, devuelve una secuencia de números, comenzando en 0 y aumentando en 1 de forma predeterminada, hasta que se detiene un número específico.
Entonces, cuando se usa range(1, n+1), generará una secuencia de números a partir de 1 y hasta n inclusive, es decir, generará los números 1, 2, 3, ..., n.
Tenga en cuenta que el límite superior especificado en range() siempre se excluye de la secuencia, lo que significa que el último número generado será n, no n+1.

n,m,q=map(int,input().split())#n行m列的矩阵,q次询问
a=[[0] for i in range(n+1)]#先构造一个一维数组
a[0]=[0]*(m+1)#m行矩阵
for i in range(1,n+1):
    a[i]+=list(map(int,input().split()))#读入
for i in range(1,n+1):
    for j in range(1,m+1):
        a[i][j]+=a[i-1][j]+a[i][j-1]-a[i-1][j-1]#初始化
for _ in range(q):
    x1,y1,x2,y2=map(int,input().split())
    print(a[x2][y2]+a[x1-1][y1-1]-a[x2][y1-1]-a[x1-1][y2])#二维前缀和

Cuatro, intervalo de tiempo K (prefijo suma)

inserte la descripción de la imagen aquí
Si (a[i]-a[j])%k=0, significa que los restos de los dos %k son iguales.

n,k=map(int,input().split())#n行m列的矩阵,q次询问
s=[0]
for i in range(1,n+1):
    s.append(int(input()))
    s[i]+=s[i-1]
cnt=[0]*k
cnt[0]+=1#处理s[0]=0的这种情况,后面是从1开始的,就要先把s[0]放进去
res=0
for i in range(1,n+1):
    res+=cnt[s[i]%k]
    cnt[s[i]%k]+=1
print(res)

5. Bomba láser (prefijo y)

inserte la descripción de la imagen aquí

a=[[0]*5002 para _ en el rango (5002)]

Esta línea de código crea una lista bidimensional denominada a con 5002 filas y 5002 columnas, y cada elemento se inicializa en 0. En otras palabras, esta lista es una matriz de 5002x5002 que se puede usar para almacenar datos bidimensionales.

(n,r),N,res=map(int,input().split(' ')),0,0
a=[[0]*5002 for _ in range(5002)]
for _ in range(n):
    x,y,w=map(int,input().split(' '))
    N=max(N,x+1,y+1)
    a[x+1][y+1]+=w

for i in range(1,N+1):#预处理前缀和数组
    for j in range(1,N+1):
        a[i][j]+=a[i-1][j]+a[i][j-1]-a[i-1][j-1]

if r<N:#枚举所有边长是R的矩形,枚举(i,j)为右下角
    for i in range(r,N+1):
        for j in range(r,N+1):
            res=max(res,a[i][j]-a[i-r][j]-a[i][j-r]+a[i-r][j-r])
else:
    res=a[N][N]

print(res)

Supongo que te gusta

Origin blog.csdn.net/qq_51408826/article/details/129189489
Recomendado
Clasificación