[Blue Bridge Cup Zhenti] Pitón de sprint de 16 días

¡La competencia es pronto, y espero que la fiesta PY que preparé conmigo pueda dominar Python de manera más competente! 

 1. Distancia y (preguntas para completar los espacios en blanco)

Descripción del problema:

La distancia entre dos letras se define como la distancia entre sus posiciones en el alfabeto. Por ejemplo, la distancia entre A y C es 2 y la distancia entre L y Q es 5.

Para una cadena, llamamos a la suma de las distancias entre dos caracteres en la cadena la distancia interna de la cadena.

Por ejemplo: ZOO la distancia interna es 22, donde la distancia entre ZZ y OO es 11.

Disculpe, ¿cuál LANQIAO es la distancia interna?

s=input()

ans=0
for i in range(len(s)):
    for j in range(i+1,len(s)):
        ans+=abs(ord(s[i])-ord(s[j]))
print(ans)

Análisis del tema:

Es examinar un código Ascii, y el valor absoluto de la diferencia entre las dos letras Ascii es la distancia 

Dos capas de bucle transversal y acumulación pueden ser


2. Difusión 

Esta pregunta es una pregunta para completar los espacios en blanco. Después de calcular el resultado, use la declaración de salida en el código para generar el resultado completo.

Xiao Lan pinta sobre un lienzo especial de tamaño infinito.

Este lienzo se puede ver como una cuadrícula, y cada cuadrícula se puede representar mediante una coordenada entera bidimensional.

Xiaolan primero hizo clic en algunos puntos en el lienzo: (0, 0), (2020, 11), (11, 14), (2000, 2000)

Solo estas cuadrículas son negras, el resto son blancas.

Cada minuto que pasa, el negro se extiende un poco. Específicamente, si una cuadrícula es negra, se extenderá a las cuatro cuadrículas adyacentes hacia arriba, abajo, izquierda y derecha, de modo que estas cuatro cuadrículas también se vuelvan negras (si originalmente eran negras, seguirán siendo negras).

Disculpe, después de 2020 minutos, cuántas cuadrículas están negras en el lienzo.

Análisis del tema:

Para investigar un BFS de múltiples fuentes, puede aprender del problema de riego de tierras agrícolas de la competencia de simulación ACwing, lo mismo, escribí un análisis detallado en este blog: [Blue Bridge Cup Zhenti] Experiencia de sprint de equipo de Python de 18 días resumen_Blog de Py Xiaozheng -CSDN Blog

Sin embargo, para esta pregunta, si el socio PY usa una lista ordinaria para simular la cola, no podrá ejecutarse, es demasiado lento.

Debido a que la complejidad de la eliminación e inserción de listas es O(n), la cantidad de datos es grande.

Necesita usar el deque (cola bidireccional) en la biblioteca que viene con PY. Su complejidad de tiempo es O (1) y puede agotarse en medio minuto.

¡Lo más importante para pasar esta pregunta es aprender a usar deque para ayudarnos a mejorar la velocidad!

Portal de aprendizaje collections.deque:  explicación detallada de deque() del módulo de colecciones de Python - Se busca programador

import collections

dx=[-1,1,0,0]
dy=[0,0,1,-1]

pre={(0,0):(0,0),(2020, 11):(2020,11),(11, 14):(11, 14),(2000, 2000):(2000, 2000)}
ans=4
queue=collections.deque()
queue.append((0,0,0))
queue.append((2020, 11, 0))
queue.append((11, 14, 0))
queue.append((2000, 2000, 0))

while queue:
    t=queue.popleft()
    if t[2]==2020:
        print(ans)
        break
    else:
        for i in range(4):
            nx,ny=t[0]+dx[i],t[1]+dy[i]
            if (nx,ny) not in pre.keys():
                pre[(nx,ny)]=(t[0],t[1])
                queue.append((nx,ny,t[2]+1))
                ans+=1
#扩散 20312088
                

3. Billete equivocado 

Puedes ver la primera pregunta de mi artículo. 

Práctica de preparación de la copa Blue Bridge python impacto provincia uno - Py Xiaozheng's Blog - CSDN Blog

4. Problema múltiple

Como todos sabemos, la cebolla Xiao es buena para calcular, especialmente buena para calcular si un número es múltiplo de otro número. Pero los chalotes solo son buenos en dos números, y cuando hay muchos números, estarán más angustiados. Ahora la cebolla te ha dado n números, y espero que puedas encontrar tres números de estos n números, de modo que la suma de estos tres números sea un múltiplo de K, y esta suma sea la mayor. Los datos garantizan que debe haber una solución.

ingrese la descripción

La primera línea contiene 2 enteros positivos n, K.

La segunda línea contiene n enteros positivos que representan los n números dados.

descripción de salida

Una línea de salida es un número entero que representa la suma deseada.

Análisis del tema: 

Esta pregunta debe explicarse bien, porque Xiao Zheng también la ha estudiado durante mucho tiempo y no la resolvió la última vez...

Un agradecimiento especial a un buen hermano mío aquí.

 Optimización de enumeración de problemas múltiples de Blue Bridge

Aprendí muchas de mis ideas de él, por lo que muchos de los siguientes análisis citarán sus palabras originales (¡porque habla muy bien!)

En primer lugar, el método violento, el bucle for de 3 capas, se debe agotar, lo que indica que se debe cambiar el método.

Sea x+y+z=nk (x,y,z,n,k>0), entonces debe haber

(x%k+y%k+z%k)%k=0 (obtenido según el algoritmo )

El problema se transforma en, sabiendo que los n números originales forman un conjunto A, y luego tomando el resto de cada número para formar un nuevo conjunto B, en el conjunto B, tomar 3 elementos para que su suma sea un múltiplo de k, y el resto Los elementos correspondientes en el conjunto A se suman y la suma es la mayor.

También podríamos establecer un diccionario dic[i]=[x,y,z...]: representando los números x, y, z.. El resultado de tomar el resto de k es i

Dado que siempre queremos tomar un número mayor, también podemos ordenar el conjunto A en orden descendente (de mayor a menor), de modo que el resto de todos los números se coloque en el diccionario, y la lista correspondiente a cada clave debe ser de grande a pequeño. de.

n,k=map(int,input().split())

a=list(map(int,input().split()))
a.sort(reverse=True)
b=dict()

for i in range(len(a)):
    r=a[i]%k
    if r not in b.keys():
        b[r]=[a[i]]
    else:
        b[r].append(a[i])

Establezca la respuesta en ans, el valor inicial es 0, el siguiente paso es encontrar la combinación restante (satisfacer la suma es un múltiplo de k) y actualizar ans

Si se enumeran los dos primeros restos i, j, entonces el tercer resto t se determina de forma única , sin necesidad de tres capas de bucles (reduzca el optimizador de bucle tanto como sea posible)

La razón es la siguiente, si i, j, t son todos elementos del conjunto A obtenido tomando el resto de k, es necesario que i, j, t satisfagan todos el rango (0, k)

Entonces i+j+t debe satisfacer el rango (0,3k), entonces i+j+t= k o 2k está en línea con el significado de la pregunta

Y i+j satisface el rango (0,2k), entonces cuando 2k>i+j>k, t=2k-ij,

Cuando 0<i+j<k, t=kij, para un conjunto de i, j, se determina el rango de i+j, por lo que el tercer resto t se determina de forma única

for i in range(k):
    for j in range(k):
        t = k-i-j if (i+j)<= k else 2*k-i-j

Luego actualice ans.

Para 3 restos, no hay más de tres casos, tres restos son iguales, dos restos son iguales y un resto es igual (mutuamente diferentes)

Si los tres restos son iguales y la longitud de la lista (número de elementos) correspondiente al resto es >=3, entonces es una solución factible, de lo contrario no hay solución, porque no se pueden formar tres números.

Si los dos restos son iguales , y la longitud de la lista (número de elementos) correspondiente a este resto es >=3, y la longitud de la lista (número de elementos) correspondiente al tercer resto (diferente de estos dos) es >=1 (es decir, no vacío), entonces es una solución factible, de lo contrario no hay solución

Si uno de los residuos es el mismo, siempre que la lista correspondiente a los tres residuos mutuamente diferentes no esté vacía, existe una solución factible.

Luego, siga comparando ans con soluciones factibles, y ans se actualizará constantemente y será más grande. De hecho, en el caso de que los dos restos sean iguales, se puede dividir en 3 tipos, porque puede ser 12, 13, 23.

for i in range(k):
    for j in range(k):
        t = k-i-j if (i+j)<= k else 2*k-i-j
        if i==j==t:
            if len(b[t])>=3:
                ans=max(ans,b[t][0]+b[t][1]+b[t][2])
        elif i==j:
            if len(b[i])>=2 and len(b[t])>=1:
                ans=max(ans,b[i][0]+b[i][1]+b[t][0])
        elif i==t:
            if len(b[i])>=2 and len(b[j])>=1:
                ans=max(ans,b[i][0]+b[i][1]+b[j][0])
        elif j==t:
            if len(b[j])>=2 and len(b[i])>=1:
                ans=max(ans,b[j][0]+b[j][1]+b[i][0])
        else:#三个互异
            if len(b[i])>=1 and len(b[j])>=1and len(b[t])>=1:
                ans=max(ans,b[i][0]+b[j][0]+b[t][0])

 Se informa el error de clave, porque la clave no existe, por lo que cuando el resto no está en b, el siguiente ciclo se puede realizar directamente

for i in range(k):
    for j in range(k):
        t = k-i-j if (i+j)<= k else 2*k-i-j
        if i not in b or j not in b or t not in b:
            continue
        if i==j==t:
            if len(b[t])>=3:
                ans=max(ans,b[t][0]+b[t][1]+b[t][2])
        elif i==j:
            if len(b[i])>=2:
                ans=max(ans,b[i][0]+b[i][1]+b[t][0])
        elif i==t:
            if len(b[i])>=2:
                ans=max(ans,b[i][0]+b[i][1]+b[j][0])
        elif j==t:
            if len(b[j])>=2:
                ans=max(ans,b[j][0]+b[j][1]+b[i][0])
        else:#三个互异
            ans=max(ans,b[i][0]+b[j][0]+b[t][0])

Para resumir el código

n,k=map(int,input().split())

a=list(map(int,input().split()))
a.sort(reverse=True)
b=dict()

for i in range(len(a)):
    r=a[i]%k
    if r not in b.keys():
        b[r]=[a[i]]
    else:
        b[r].append(a[i])

ans=0

for i in range(k):
    for j in range(k):
        t = k-i-j if (i+j)<= k else 2*k-i-j
        if i not in b or j not in b or t not in b:
            continue
        if i==j==t:
            if len(b[t])>=3:
                ans=max(ans,b[t][0]+b[t][1]+b[t][2])
        elif i==j:
            if len(b[i])>=2:
                ans=max(ans,b[i][0]+b[i][1]+b[t][0])
        elif i==t:
            if len(b[i])>=2:
                ans=max(ans,b[i][0]+b[i][1]+b[j][0])
        elif j==t:
            if len(b[j])>=2:
                ans=max(ans,b[j][0]+b[j][1]+b[i][0])
        else:#三个互异
            ans=max(ans,b[i][0]+b[j][0]+b[t][0])
print(ans)

Si es útil para usted, ¿está bien quedarse por tres años consecutivos?

Si tiene alguna pregunta, por favor pregunte en la sección de comentarios!

Supongo que te gusta

Origin blog.csdn.net/m0_62277756/article/details/123701617
Recomendado
Clasificación