Dans cet article, les questions 10 + 1 d'AtCoder Beginners Selection recevront une réponse en Python (3.8).
AtCoder est un service de programmation de compétition originaire du Japon. Pour plus d'informations, consultez les articles de @ drken et @ e869120
S'il te plait regarde. Surtout @drken
Les 10 dernières questions résumées ci-dessus ont ensuite été adoptées par la formule AtCoder sous la forme AtCoder Beginners Selection en tant qu'exercices pour les débutants.
Il existe déjà des réponses Python pour AtCoder Beginners Selection, mais cet article a été particulièrement utile. Merci beaucoup. Dans cet article, je vais vous donner une réponse qui vous fait du bien. Si vous les comparez, vous pouvez voir qu'ils ont été améliorés en détail.
En passant, je pense que la "bonté" du code dépend du but et de la situation et n'est pas un concept qui peut être clairement défini, mais principalement
Il y a deux directions, et je pense qu'il y a souvent un compromis entre ces deux directions. Ce compromis est également apparu au moment de la sélection du langage avant d'écrire le code, et comme vous pouvez le voir en comparant la réponse en Python comme cet article avec la réponse en C ++ par drken, il est écrit en Python par rapport au C ++. Le choix semble être en mesure de donner la priorité à la lisibilité au détriment de l'effort de calcul.
La concision est souvent mentionnée comme la "bonté" du code, mais à moins qu'il ne s'agisse de code jetable, la concision n'a de valeur que lorsqu'elle contribue à la lisibilité, et si elle est moins lisible, il vaut mieux ne pas raccourcir le code. Je pense personnellement.
a = int(input())
b, c = map(int, input().split())
s = input()
print(a+b+c, s)
a, b = map(int, input().split())
print("Odd" if a%2 and b%2 else "Even")
--'A% 2 et b% 2peuvent être
(a * b)% 2` selon l'énoncé du problème
print(input().count("1"))
_ = input()
A = [*map(int, input().split())]
count = 0
while not any(a%2 for a in A):
A = [a/2 for a in A]
count += 1
print(count)
―― ʻa% 2 peut indiquer si ʻa
est impair, et ʻany (a% 2 pour a dans A) peut indiquer
bool si ʻA
contient un nombre impair. Les nombres autres que 0 sont interprétés comme «True», donc «any» peut être «sum», et pour une raison quelconque «sum» était plus rapide, mais pour plus de lisibilité, je l'ai fait «any».
«Résolvons-le selon l'énoncé du problème. Il existe également une méthode pour compter le nombre de fois que chaque nombre est divisé par 2 en lisant combien de 0 se poursuivent vers la droite en notation binaire.
import itertools as it
A, B, C, X = map(int, [input() for _ in range(4)])
count = 0
for a, b, c in it.product(range(A+1), range(B+1), range(C+1)):
if 500*a + 100*b + 50*c == X:
count += 1
print(count)
--Le montant du calcul de la recherche complète est $ O (50 ^ 3) $, et même s'il est surestimé comme $ O (100 ^ 3) = O (10 ^ 6) $, il s'agit d'une ligne directrice pour la limite supérieure du montant du calcul du temps $ O (10 ^ 8) ) C'est bien en dessous de $, donc une recherche complète est acceptable
for
en la réécrivant avec ʻitertools.product`.N, A, B = map(int, input().split())
print(sum(i for i in range(N+1) if A <= sum(map(int,str(i))) <= B))
--Pour ʻi` de "
_ = input()
a = sorted(map(int,input().split()), reverse=True)
print(sum(a[::2]) - sum(a[1::2]))
--Trier toutes les cartes et soustraire la somme impaire de la somme paire
N = int(input())
print(len(set(input() for _ in range(N))))
N, Y = map(int, input().split())
for n_10k in range(N+1):
for n_5k in range(N-n_10k+1):
n_1k = N - n_10k - n_5k
if n_10k*10000 + n_5k*5000 + n_1k*1000 == Y:
print(n_10k, n_5k, n_1k)
exit()
print(-1, -1, -1)
-- n_10k
, n_5k
, n_1k
représentent respectivement le nombre de billets de 10 000 yens, de 5 000 yens et de 1 000 yens.
«Grâce à la contrainte que la valeur totale de ces trois variables est« N », la recherche peut être effectivement effectuée avec deux variables. Étant donné que le montant du calcul de la recherche complète est $ O (2000 ^ 2) = O (8 \ fois 10 ^ 6) $, ce qui est inférieur à la valeur indicative de la limite supérieure du montant du calcul de $ O (10 ^ 8) $, la recherche complète est correcte.
--Quand vous voulez terminer une boucle imbriquée for
au milieu, si vous essayez de la casser avec break
, ce sera un peu de code délicat, donc je pense que vous pouvez terminer le programme avec ʻexit ()` comme ça.
S = input()
while S:
for x in ["dream","dreamer","erase","eraser"]:
if S.endswith(x):
S = S[:-len(x)]
break
else:
print("NO")
break
else:
print("YES")
――Quel préfixe n'est pas déterminé de manière unique, mais quel suffixe est déterminé de manière unique
--for ... else ...
etwhile ... else ...
'ʻelse fonctionne quand
pour et
while se terminent normalement et se terminent anormalement par
break`. Ne fonctionne pas si
t0, x0, y0 = 0, 0, 0
for _ in range(int(input())):
t, x, y = map(int, input().split())
margin = (t-t0) - abs(x-x0) - abs(y-y0)
if margin < 0 or margin%2 != 0:
print("No")
break
t0, x0, y0 = t, x, y
else:
print("Yes")
«Tout d'abord, si« margin »est négatif, vous ne pouvez pas atteindre le point cible. De plus, comme il n'y a pas d'option pour arrêter, si «margin» est impair, vous ne pouvez pas atteindre le point cible.
(t, x, y)
puis les traite par lots, la version en ligne du code qui traite chacun (t, x, y)
séquentiellement comme ceci ça peutRecommended Posts