O segundo dia aprendendo python --- diferença

1. Altere os elementos da matriz (diferença)

insira a descrição da imagem aqui

Método 1: matriz de diferenças

map(int,input().split())

Isso retorna um objeto, não um inteiro

para b em arr[:n]:

arr[:n] é uma operação de divisão em Python que representa a sublista desde o início (índice 0) até o n-1º elemento da lista arr.

print(1 if b else 0,end=' ')

O que esse código faz é converter o valor booleano b em um número inteiro e imprimi-lo. Se b for True, imprima 1, caso contrário imprima 0. O end=' ' no código significa que o resultado impresso não será quebrado, mas finalizado com um espaço.

#只用关心某个数字位置是否被覆盖过,不关心覆盖过几次
for i in range(int(input())):#读入输入数组的次数
    n,a=int(input()),list(map(int,input().split()))#前面是传入一个数,后面传的一个数组
    arr=[0]*(n+5)#数组的大小
    for j in range(n):
        arr[max(0,j-a[j]+1)]+=1
        arr[j+1]-=1
    for j in range(1,n):
        arr[j]+=arr[j-1]#差分数组
    for b in arr[:n]:
        print(1 if b else 0,end=' ')#这个用法好绝,对于初学者来说
    print()#换行

Método 2: Mesclagem de intervalo

Este código é um algoritmo para lidar com problemas de intervalo, que implementa principalmente as seguintes etapas:

1. Leia um inteiro n e uma lista de inteiros a de comprimento n.

2. Para cada elemento a[j] na lista a, se não for zero, adicione o intervalo [max(0, ja[j]+1), j] à lista de intervalos.

3. Classifique a lista de intervalos de acordo com o ponto final esquerdo do intervalo.

4. Para cada intervalo na lista de intervalos classificados, marque todos os elementos no intervalo como 1 na lista arr.

5. Emita a lista arr marcada.

Pode-se ver que a complexidade de tempo do algoritmo é O(nlogn) e a operação mais demorada é a classificação da lista de intervalos.

intervalo.sort(key=lambda x:x[0])

Este código é classificado de acordo com o endpoint esquerdo, se você quiser classificar de acordo com o endpoint direito

intervalo.sort(key=lambda x: x[1])

for i in range(int(input())):#input()返回为str,转换为int
    n,a=int(input()),list(map(int,input().split()))#输入数组大小及数组元素
    arr,interval=[0]*n,[]
    for j in range(n):
        if a[j]:
            interval.append([max(0,j-a[j]+1),j])#记录区间
    interval.sort(key=lambda x:x[0])#按照区间端点进行排序
    if interval:#检查interval是否为空,若为空则直接输出长度为n的全0数组,
        # 如果不为空,则按照一定的规则将1填充到arr数组中
        p=1#编号为0的区间
        for j in range(1,len(interval)):
            if interval[j][0]>interval[p-1][1]+1:#如果区间左端点大于编号为p-1的一个区间右端点+1,则说明这是两个区间
                interval[p]=interval[j]
                p+=1
            else:#如果在内部,则可以这两个区间
                interval[p-1][1]=max(interval[p-1][1],interval[j][1])
        for j in range(p):#枚举每个区间,将每个区间内所包含的置1
            for k in range(interval[j][0],interval[j][1]+1):
                arr[k]=1
    for a in arr:
        print(a,end=' ')
    print()

Observe o recuo! ! !

Em segundo lugar, a diferença

insira a descrição da imagem aqui

a = [0] + list(map(int, input().split())) + a[n + 1:]

A função dessa linha de código é substituir os elementos do subscrito 1 até n (incluindo 1 e n) na lista a pelos elementos de entrada e adicionar um 0 no início e no final da lista para garantir que as operações subsequentes não aparece Erro de índice. especificamente:

a[:n+1] significa os elementos do índice 0 até n, onde a[0] é o primeiro elemento da lista, a[n] é o último elemento da lista, a[n+1:] significa de Todos os elementos do subscrito n+1 até o final da lista.

Portanto, o efeito de a = [0] + list(map(int, input().split())) + a[n +1:] é primeiro adicionar 0 ao início da lista e, em seguida, adicionar o elementos de entrada para Na posição original, finalmente adicione todos os elementos do original n+1 ao final da lista, obtendo assim uma nova lista a de comprimento n+2.

n,q=map(int,input().split())
a=[0]*(n+10)
b=[0]*(n+10)

#a的0位是0,第1位到第n位是输入的数,第n+1位起往后都是0
a=[0]+list(map(int,input().split()))+a[n+1:]
for i in range(1,n+1):
    b[i]=a[i]-a[i-1]#初始化b数组
    
while q:
    l,r,c=map(int,input().split())
    b[l]+=c
    b[r+1]-=c
    q-=1
    
#a数组没有用了,将a更新一遍
for i in range(1,n+1):
    a[i]=a[i-1]+b[i]
    print(a[i],end=' ')

3. Matriz de diferenças

insira a descrição da imagem aqui

Método de escrita um:

def insert(matrix,x1,y1,x2,y2,c):#差分数组
    matrix[x1][y1]+=c
    matrix[x2+1][y1]-=c
    matrix[x1][y2+1]-=c
    matrix[x2+1][y2+1]+=c

def main():
    n, m, q = map(int, input().split())
    matrix=[[0 for i in range(m+10)] for j in range(n+10)]#定义二维数组
    for i in range(1,n+1):
        row =list(map(int, input().split()))
        for j in range(m):
            insert(matrix,i,j+1,i,j+1,row[j])
            
    for i in range(q):
        x1,y1,x2,y2,c=map(int,input.split())
        insert(matrix,x1,y1,x2,y2,c)
        
    for i in range(1,n+1):
        for j in range(1,m+1):
            matrix[i][j]+=matrix[i-1][j]+matrix[i][j-1]-matrix[i-1][j-1]
            print(matrix[i][j],end=" ")
        print()

if __name__=="__main__":
    main()

Método de escrita dois:

print(" ".join(map(str,dt[i][1:m+1])))

Essa linha de código converte os elementos na lista dt[i][1:m+1] em strings, concatena-os com espaços e os imprime. em:

  1. map(str, dt[i][1:m+1]) significa converter cada elemento na lista dt[i][1:m+1] em um tipo string;
  2. " ".join(…) significa juntar os elementos na lista de strings com espaços para formar uma nova string;
  3. print(…) significa imprimir a string concatenada.
def insert(b,x1,y1,x2,y2,c):
    b[x1][y1] += c
    b[x2+1][y1] -= c
    b[x1][y2+1] -= c
    b[x2+1][y2+1] += c

n,m,q = map(int,input().split())
ls = []
dt = [[0 for _ in range(1010)] for _ in range(1010)]
for i in range(n):
    ls.append(list(map(int,input().split())))
for i in range(1,n+1):
    for j in range(1,m+1):
        insert(dt,i,j,i,j,ls[i-1][j-1])
while q >0:
    q -= 1
    x1,y1,x2,y2,c = map(int,input().split())
    insert(dt,x1,y1,x2,y2,c)
for i in range(1,n+1):
    for j in range(1,m+1):
        dt[i][j] +=dt[i-1][j]+dt[i][j-1] - dt[i-1][j-1]
for i in range(1,n+1):
    print(" ".join(map(str,dt[i][1:m+1])))

4. Aumente e diminua a sequência

A diferença resolve o problema de aumento ou diminuição simultânea em uma seção de área
. Adicione uma constante c ao intervalo [L, R], então b[L] += c , b[R + 1] -=c

Encontre a sequência de diferenças b de a, onde b1 = a1, b(i) = a(i) - a(i - 1) (2 <= i <= n). Seja b(n + 1) = 0, a operação do título na sequência a é equivalente a selecionar quaisquer dois números em b1, b2...b(n + 1) de cada vez, adicionando 1 a um e subtraindo 1 de o outro. O objetivo é mudar b2,b3,...bn para todos os 0s. A sequência final a é composta por n b1

O método de escolha de dois números pode ser dividido em quatro categorias
1, 2 <= i , j <= n (prioridade)
2, i = 1, 2 <= j <= n
3, 2 <= i <= n , j = n + 1
4, i = 1, j = n + 1 (não faz sentido)

Seja a soma dos números positivos em b2, b3...bn p, e o valor absoluto da soma dos números negativos seja q. Primeiro, tente executar operações do tipo 1 combinando números positivos e negativos, e você pode executar min(p,q) vezes. As correspondências |p - q| restantes são pares, cada um dos quais pode ser selecionado para corresponder a b1 ou b(n + 1), ou seja, para realizar 2 ou 3 tipos de operações, exigindo um total de |p - q| vezes

Em resumo, o número mínimo de operações é min(p,q) + |p - q|. De acordo com a seleção das 2ª e 3ª operações de |p - q| vezes, diferentes valores de b1 em |p - q| + 1 podem ser gerados, ou seja, a sequência final a pode ter |p - q| + 1 tipos

insira a descrição da imagem aqui

print(f"{max(pos, neg)}\n{abs(pos - neg) + 1}")

Esta é uma maneira de escrever f-string, que é usada para formatar strings. Entre eles, a parte dentro das chaves será substituída pelo valor da variável ou expressão correspondente. Especificamente:

f"xxx": Indica que esta é uma string f, onde xxx é o conteúdo da string, que pode conter texto comum e expressões de colchetes.
{max(pos, neg)}: Indica uma expressão de colchetes, que será substituída pelo valor máximo de pos e neg.
\n: Indica um caractere de nova linha.
{abs(pos - neg) + 1}: Indica uma expressão de colchetes, que será substituída pelo valor absoluto da diferença entre pos e neg mais 1.

n = int(input())
a = [0] * (n + 2)
for i in range(1,n+1):
    x = int(input())
    a[i] += x
    a[i+1] -= x

pos, neg = 0, 0
for i in range(2, n+1):
    if a[i] > 0:
        pos += a[i]
    else:
        neg -= a[i]

print(f"{
      
      max(pos, neg)}\n{
      
      abs(pos - neg) + 1}")

Acho que você gosta

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