Temps des amis.
Ceci est un article de synthèse pour les débutants des professionnels de la compétition.
La solution que j'écris ici est écrite en regardant les commentaires et les soumissions d'autres personnes. Ce n'est peut-être pas ce que vous avez réellement soumis.
Il s'agit de répondre au nombre d'attaques nécessaires pour réduire la force physique H avec la puissance d'attaque A.
La réponse est d'arrondir «H / A». J'ai utilisé math.ceil ()
pour le processus de résumé.
import math
H, A = map(int, input().split())
print(math.ceil(H/A))
Au fait, j'ai entendu dire que math.ceil ()
peut provoquer une erreur lorsque le nombre est trop grand. C'est correct d'écrire quelque chose comme (H + A-1) // A
, mais je ne l'ai pas aimé, alors je l'ai regardé légèrement.
Le style d'écriture suivant introduit dans cet article peut être intelligent.
H, A = map(int, input().split())
print(-(-H//A))
Comment écrire - (- H // A)
. Le traitement de troncature avec un nombre négatif semble être le même traitement que l'arrondi, tel que «-0,1» → «-1». Au fait, je l'ai vu dans d'autres réponses. Dois-je l'utiliser autant que possible à l'avenir?
C'est une question pour savoir si vous pouvez couper votre force physique $ H $ en utilisant pleinement la technique power $ A_i $.
Si la valeur totale du coup spécial est supérieure à la force physique, «Oui» est affiché.
H, N = map(int, input().split())
A = list(map(int, input().split()))
if H <= sum(A):
print('Yes')
else:
print('No')
Lorsque vous battez des monstres en utilisant pleinement les techniques de "faire 1 dégât" (nombre illimité de fois) et de "tuer instantanément" (jusqu'à K fois), il est difficile de répondre au nombre d'attaques normales.
Arrangez les HP des monstres dans l'ordre et excluez K monstres par ordre décroissant. La réponse est le nombre total de HP restants.
Notez que K peut être plus fréquent que N (une défaite).
N, K = map(int, input().split())
H = list(map(int, input().split()))
H.sort()
print(sum(H[:max(N-K, 0)]))
Post-scriptum: Prendre une valeur négative pour l'index du tableau en python se comportera spécialement.
a = [0, 1]
print(a[2:]) #L'index saillant est passé à travers
# []
print(a[-1:]) #Les index en surplomb sont comptés dans la direction opposée
# [1]
J'ai ajouté le traitement max
pour éviter cette spécification, mais si vous l'écrivez comme suit, vous n'avez pas besoin de comparer N et K.
N, K = map(int, input().split())
H = list(map(int, input().split()))
H.sort(reverse=True)
print(sum(H[K:]))
C'est un problème de répondre au nombre d'attaques requises pour un monstre qui se divise (tronqué) en divisant par deux les PV lors de l'attaque.
Tout d'abord, HP effectue toujours un traitement de troncature, donc même si la valeur $ H $ donnée est convertie en $ 2 ^ {k-1} $ (cependant, $ 2 ^ {k-1} \ leq H <2 ^ k $) Ce sera le même nombre de fois.
Alors comptons le nombre d'attaques contre des monstres avec $ 2 ^ {k-1} $ HP.
Commencez par attaquer un monstre dont les PV sont de 2 $ ^ {k-1} $. C'est une fois.
Ensuite, deux monstres avec des PV de 2 $ ^ {k-2} $. C'est deux fois.
Vient ensuite un monstre $ 2 ^ 2 $ avec $ 2 ^ {k-3} $, c'est $ 2 ^ 2 $ fois.
...
Répétez ceci et touchez finalement le monstre $ 2 ^ {k-1} $ avec HP1 pour $ 2 ^ {k-1} $ fois pour gagner.
Faisons-en une formule.
Si vous voulez suivre correctement la conversion ici, veuillez utiliser la formule de la somme des séquences de rapport égal.
Vous pouvez obtenir la réponse par "remplacer la valeur par $ 2 ^ {k-1} $" et "sortie $ 2 ^ {k} -1 $". J'ai écrit le code ci-dessous.
H = int(input())
k = 0
while H:
H //= 2
k += 1
print(2**k-1)
Le pouvoir magique $ A_i $ et le pouvoir magique consommé $ B_i $ sont passés. Il s'agit de répondre au moins de pouvoir magique possible afin de gratter le H.
Je l'ai soumis dans un simple DP et il a passé. Il suffit de stocker la consommation d'énergie minimale dans une baie pour chaque valeur HP et de mettre à jour la valeur minimale dans l'ordre. Je m'habitue à une planification dynamique.
H, N = map(int, input().split())
magic = [tuple(map(int, input().split())) for _ in range(N)]
DP = [0] + [10**9]*H
for h in range(H):
for damage, mp in magic:
DP[min(h + damage, H)] = min(DP[min(h + damage, H)], DP[h] + mp)
print(DP[H])
Cependant, seul PyPy3 a réussi cela, et TLE est sorti en Python3. En regardant ce qui s'est passé avec python, il y avait une réponse qui s'est accélérée en utilisant la notation d'inclusion. Je vais le réécrire.
H, N = map(int, input().split())
magic = [tuple(map(int, input().split())) for _ in range(N)]
DP = [0] * (H+10**4)
for h in range(1, H+1):
DP[h] = min(DP[h - damage] + mp for damage, mp in magic)
print(DP[H])
Notez que la signification de «h», qui est tournée par for, est différente du code précédent. Maintenant, il est passé en python.
C'est tout pour cet article. Même si c'était un concours passé, je suis heureux que ce soit la première fois que j'ai pu résoudre la question E par moi-même.
Recommended Posts