Examen du concours AtCoder Beginner Contest 153, jusqu'à la question E (Python)

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.

A - Serval vs Monster

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?

B - Common Raccoon vs Monster

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

C - Fennec vs Monster

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

D - Caracal vs Monster

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.

Remplacer les nombres

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.

Pensez au nombre d'attaques

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.

x = 1 + 2 + 2^2 + \cdots + 2^{k-1}
= 2^k - 1

Si vous voulez suivre correctement la conversion ici, veuillez utiliser la formule de la somme des séquences de rapport égal.

alors

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)

E - Crested Ibis vs Monster

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

Examen du concours AtCoder pour débutants 159, jusqu'à la question E (Python)
Examen du concours AtCoder Beginner Contest 163, jusqu'à la question E (Python)
Examen du concours AtCoder Beginner Contest 164, jusqu'à la question E (Python)
Examen du concours AtCoder Beginner Contest 162, jusqu'à la question E (Python)
Examen du concours AtCoder Beginner Contest 154, jusqu'à la question E (Python)
Examen du concours AtCoder Beginner Contest 153, jusqu'à la question E (Python)
Examen de AtCoder Beginner Contest 160, jusqu'à la question E (Python)
Examen du concours AtCoder Beginner Contest 167, jusqu'à la question E (Python)
Examen du concours AtCoder Beginner Contest 157, jusqu'à la question E (Python)
Examen du concours AtCoder pour débutants 161, jusqu'à la question E (Python)
Examen du concours AtCoder Beginner Contest 155, jusqu'à la question E (Python)
Examen du concours AtCoder Beginner Contest 156, jusqu'à la question E (Python)
Examen du concours AtCoder Beginner Contest 166, jusqu'à la question E (Python)
Examen du concours AtCoder Beginner Contest 165, jusqu'à la question E (Python)
atcoder Review of Panasonic Programming Contest 2020, jusqu'à la question E (Python)
Examen de atcoder ABC158, jusqu'à la question E (Python)
AtCoder Beginner Contest 102 Revue des questions précédentes
AtCoder Beginner Contest 072 Revue des questions précédentes
AtCoder Beginner Contest 085 Revue des questions précédentes
AtCoder Beginner Contest 062 Revue des questions précédentes
AtCoder Beginner Contest 051 Revue des questions précédentes
AtCoder Beginner Contest 127 Revue des questions précédentes
AtCoder Beginner Contest 119 Revue des questions précédentes
AtCoder Beginner Contest 151 Revue des questions précédentes
AtCoder Beginner Contest 075 Revue des questions précédentes
AtCoder Beginner Contest 110 Revue des questions précédentes
AtCoder Beginner Contest 117 Revue des questions précédentes
AtCoder Beginner Contest 070 Revue des questions précédentes
AtCoder Beginner Contest 105 Revue des questions précédentes
AtCoder Beginner Contest 112 Revue des questions précédentes
AtCoder Beginner Contest 076 Revue des questions précédentes
AtCoder Beginner Contest 089 Revue des questions précédentes
AtCoder Beginner Contest 079 Revue des questions précédentes
AtCoder Beginner Contest 056 Revue des questions précédentes
AtCoder Beginner Contest 087 Revue des questions précédentes
AtCoder Beginner Contest 067 Revue des questions précédentes
AtCoder Beginner Contest 046 Revue des questions précédentes
AtCoder Beginner Contest 123 Revue des questions précédentes
AtCoder Beginner Contest 049 Revue des questions précédentes
AtCoder Beginner Contest 078 Revue des questions précédentes
AtCoder Beginner Contest 081 Revue des questions précédentes
AtCoder Beginner Contest 047 Revue des questions précédentes
AtCoder Beginner Contest 060 Revue des questions précédentes
AtCoder Beginner Contest 104 Revue des questions précédentes
AtCoder Beginner Contest 057 Revue des questions précédentes
AtCoder Beginner Contest 121 Revue des questions précédentes
AtCoder Beginner Contest 126 Revue des questions précédentes
AtCoder Beginner Contest 090 Revue des questions précédentes
AtCoder Beginner Contest 103 Revue des questions précédentes
AtCoder Beginner Contest 061 Revue des questions précédentes
AtCoder Beginner Contest 059 Revue des questions précédentes
AtCoder Beginner Contest 044 Revue des questions précédentes
AtCoder Beginner Contest 083 Revue des questions précédentes
AtCoder Beginner Contest 048 Revue des questions précédentes
AtCoder Beginner Contest 124 Revue des questions précédentes
AtCoder Beginner Contest 116 Revue des questions précédentes
AtCoder Beginner Contest 097 Revue des questions précédentes
AtCoder Beginner Contest 088 Revue des questions précédentes
AtCoder Beginner Contest 092 Revue des questions précédentes
AtCoder Beginner Contest 099 Revue des questions précédentes
AtCoder Beginner Contest 065 Revue des questions précédentes