[Blue Bridge Cup Zhenti] Python de sprint de 16 jours

Le concours est pour bientôt, et j'espère que la soirée PY que j'ai préparée avec moi pourra maîtriser Python plus efficacement ! 

 1. Distance et (questions à remplir)

Description du problème:

La distance entre deux lettres est définie comme la distance entre leurs positions dans l'alphabet. Par exemple, la distance entre A et C est 2 et la distance entre L et Q est 5.

Pour une chaîne, nous appelons la somme des distances entre deux caractères de la chaîne la distance interne de la chaîne.

Par exemple : ZOO la distance intérieure est de 22, où la distance entre ZZ et OO est de 11.

Excusez-moi, quelle LANQIAO est la distance interne ?

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)

Analyse du sujet :

Il s'agit d'examiner un code Ascii, et la valeur absolue de la différence entre les deux lettres Ascii est la distance 

Deux couches de parcours de boucle et d'accumulation peuvent être


2. Diffusion 

Cette question est une question à remplir. Après avoir calculé le résultat, utilisez l'instruction de sortie dans le code pour afficher le résultat rempli.

Xiao Lan peint sur une toile spéciale de taille infinie.

Ce canevas peut être vu comme une grille, et chaque grille peut être représentée par une coordonnée entière bidimensionnelle.

Xiaolan a d'abord cliqué sur quelques points sur la toile : (0, 0), (2020, 11), (11, 14), (2000, 2000)

Seules ces grilles sont noires, les autres sont blanches.

A chaque minute qui passe, le noir s'étale un peu. Plus précisément, si une grille est noire, elle s'étendra aux quatre grilles adjacentes en haut, en bas, à gauche et à droite, de sorte que ces quatre grilles deviennent également noires (si elles étaient noires à l'origine, elles sont toujours noires).

Excusez-moi, après 2020 minutes, combien de grilles sont noires sur la toile.

Analyse du sujet :

Pour étudier un BFS multi-sources, vous pouvez apprendre du problème d'irrigation des terres agricoles de la compétition de simulation ACwing, de même, j'ai écrit une analyse détaillée dans ce blog : [Blue Bridge Cup Zhenti] Résumé de l'expérience de sprint en équipe Python de 18 jours_Blog de Py Xiaozheng -CSDN Blog

Cependant, pour cette question, si le partenaire PY utilise une liste ordinaire pour simuler la file d'attente, il ne pourra pas s'exécuter, il est trop lent.

Étant donné que la complexité de la suppression et de l'insertion de la liste est O(n), la quantité de données est importante.

Vous devez utiliser la deque (file d'attente bidirectionnelle) dans la bibliothèque fournie avec PY. Sa complexité temporelle est O (1) et elle peut s'épuiser en une demi-minute.

La chose la plus importante pour passer cette question est d'apprendre à utiliser deque pour nous aider à améliorer la vitesse !

Portail d'apprentissage collections.deque :  explication détaillée de deque() du module de collections Python - Programmeur recherché

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. Mauvais billet 

Vous pouvez voir la première question de mon article 

Blue Bridge Cup préparation pratique python impact province un - Blog de Py Xiaozheng - Blog CSDN

4. Problème multiple

Comme nous le savons tous, l'oignon Xiao est bon en calcul, particulièrement bon pour calculer si un nombre est un multiple d'un autre nombre. Mais les échalotes ne sont bonnes qu'à deux chiffres, et quand il y a beaucoup de chiffres, elles seront plus affligées. Maintenant, l'oignon vous a donné n nombres, et j'espère que vous pourrez trouver trois nombres à partir de ces n nombres, de sorte que la somme de ces trois nombres soit un multiple de K, et cette somme soit la plus grande. Les données garantissent qu'il doit y avoir une solution.

entrez la description

La première ligne contient 2 entiers positifs n, K.

La deuxième ligne contient n entiers positifs représentant les n nombres donnés.

description de la sortie

Une ligne de sortie est un nombre entier représentant la somme souhaitée.

Analyse du sujet : 

Cette question doit être bien expliquée, car Xiao Zheng l'a également étudiée pendant longtemps, et il ne l'a pas résolue la dernière fois...

Un merci spécial à un bon frère à moi ici

 Optimisation de l'énumération de problèmes multiples Blue Bridge

J'ai appris beaucoup de mes idées de lui, donc bon nombre des analyses suivantes citeront ses mots originaux (parce qu'il parle si bien !)

Tout d'abord, la méthode violente, la boucle for à 3 couches doit expirer, indiquant que la méthode doit être modifiée.

Soit x+y+z=nk (x,y,z,n,k>0), alors il doit y avoir

(x%k+y%k+z%k)%k=0 (obtenu selon l' algorithme )

Le problème se transforme en, sachant que les n nombres d'origine forment un ensemble A, puis en prenant le reste de chaque nombre pour former un nouvel ensemble B, dans l'ensemble B, prenons 3 éléments pour que leur somme soit un multiple de k, et le reste Les éléments correspondants dans l'ensemble A sont additionnés et la somme est la plus grande.

Nous pourrions tout aussi bien définir un dictionnaire dic[i]=[x,y,z...] : représentant les nombres x, y, z.. Le résultat en prenant le reste de k est i

Puisqu'on veut toujours prendre un nombre plus grand, autant trier l'ensemble A par ordre décroissant (du grand au petit), pour que le reste de tous les nombres soit mis dans le dictionnaire, et la liste correspondant à chaque clé doit être du grand au petit.

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])

Définissez la réponse sur ans, la valeur initiale est 0, l'étape suivante consiste à trouver la combinaison restante (en satisfaisant la somme est un multiple de k) et à mettre à jour ans

Si les deux premiers restes i,j sont énumérés, alors le troisième reste t est déterminé de manière unique , pas besoin de trois couches de boucles (réduisez autant que possible l'optimiseur de boucle)

La raison est la suivante, si i, j, t sont tous des éléments de l'ensemble A obtenu en prenant le reste de k, il faut que i, j, t satisfassent tous l'intervalle (0, k)

Alors i+j+t doit satisfaire la plage (0,3k), alors i+j+t= k ou 2k est conforme au sens de la question

Et i+j satisfait la plage (0,2k), alors quand 2k>i+j>k, t=2k-ij,

Lorsque 0<i+j<k, t=kij, pour un ensemble de i, j, la plage de i+j est déterminée, donc le troisième reste t est déterminé de manière unique

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

Ensuite, mettez à jour ans.

Pour 3 restes, il n'y a pas plus de trois cas, trois restes sont les mêmes, deux restes sont les mêmes et un reste est le même (mutuellement différent)

Si les trois restes sont les mêmes, et que la longueur de la liste (nombre d'éléments) correspondant au reste est >=3, alors c'est une solution faisable, sinon il n'y a pas de solution, car on ne peut pas composer trois nombres

Si les deux restes sont égaux , et que la longueur de la liste (nombre d'éléments) correspondant à ce reste est >=3, et la longueur de la liste (nombre d'éléments) correspondant au troisième reste (différent de ces deux) est >=1 (c'est-à-dire non vide), alors c'est une solution réalisable, sinon il n'y a pas de solution

Si l'un des restes est le même, tant que la liste correspondant aux trois restes mutuellement différents n'est pas vide, il existe une solution réalisable.

Ensuite, continuez à comparer ans avec des solutions réalisables, et ans est constamment mis à jour et plus grand. En fait, dans le cas où les deux restes sont identiques, il peut être divisé en 3 types, car il peut être 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])

 L'erreur de clé est signalée, car la clé n'existe pas, donc lorsque le reste n'est pas en b, le cycle suivant peut être effectué directement

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])

Pour résumer le code

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 cela vous est utile, pouvez-vous rester trois années consécutives ?

Si vous avez des questions, n'hésitez pas à les poser dans la section des commentaires !

Je suppose que tu aimes

Origine blog.csdn.net/m0_62277756/article/details/123701617
conseillé
Classement