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

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 - Sheep and Wolves

S mouton et loup loup, gagner est une question à se poser.

Si S est supérieur à W, le mouton ne sera pas attaqué.

S, W = map(int, input().split())
if S > W:
    print('safe')
else:
    print('unsafe')

B - Battle

Il s'agit de répondre à laquelle gagnera si la puissance d'attaque B avec la force physique A et la puissance d'attaque D avec la force physique C se touchent.

Takahashi-kun et Aoki-kun ont chacun besoin du nombre d'attaques arrondi à $ C / B $ et $ A / D $. Celui avec le plus petit nombre l'emporte. Aussi, si les chiffres sont les mêmes, Takahashi, qui peut être battu en premier, est avantageux.

Je l'ai implémenté avec l'idée ci-dessus. J'ai utilisé math.ceil () pour le processus de résumé. Si vous écrivez quelque chose comme (C + (B-1)) // B, vous n'avez pas besoin d'une bibliothèque.

import math
A, B, C, D = map(int, input().split())
if math.ceil(C/B) <= math.ceil(A/D):
  print('Yes')
else:
  print('No')

C - gacha

C'est un problème de compter le nombre de types de chaînes de caractères $ S_i $ saisies N fois.

Je l'ai mis dans un objet de type défini et j'ai compté la longueur.

N = int(input())
S = [input() for _ in range(N)]
print(len(set(S)))

D - Multiple of 2019

Il s'agit de savoir combien de nombres peuvent être rendus divisibles d'ici 2019 lorsque le nombre d'entrée S est découpé dans une section arbitraire.

Je pensais que c'était un sujet similaire à this et j'ai écrit le code suivant. (En fait, je n'ai pas pu le faire pendant le concours parce que j'ai fait une erreur ou ne pouvais pas raccourcir le temps.)

import collections
S = input()
N = len(S)
M = [0]
mod = 0
ten = 1
for s in S[::-1]:
  mod += (int(s) * ten) % 2019
  mod %= 2019
  M.append(mod)
  ten *= 10
  ten %= 2019 
count = collections.Counter(M)
print(sum([c*(c-1)//2 for c in count.values()]))

Par exemple, s'il existe un nombre «1234567», ce processus calcule le surplus de «7», «67», «567», «4567», «34567», «234567» et «1234567», et le surplus correspond. S'il y a un certain nombre de chiffres, la section est divisible.

Dans le traitement réel, le temps de calcul est économisé en le divisant fréquemment et en effectuant le calcul de l'excédent.

Pour une explication mathématique détaillée, voir la question E dans article que j'ai écrit précédemment.

E - Two Currencies

Le problème est de trouver l'itinéraire le plus court de la gare 1 à toutes les stations. Cependant, vous aurez besoin de pièces d'argent pour utiliser le train et vous devrez passer un temps différent à échanger de l'argent à chaque gare.

Jusqu'à présent, ABC n'a posé que la question E, mais c'est presque la première fois pour un problème de graphe solide. Je n'ai pas du tout compris et j'ai abandonné.

J'ai vu beaucoup d'explications et d'autres réponses.

Tout d'abord, en raison de la limite de 2 $ \ leq N \ leq 50 $, 1 $ \ leq A_i \ leq 50 $, le nombre total de pièces d'argent pouvant être transportées dans ce système est de 49 $ \ times50 = 2450 $. (Ce nombre peut être encore réduit en fonction de la valeur réelle de «N», «A», mais je vais expliquer avec ce nombre pour plus de commodité)

"Temps minimum $ T $ lors de la détention de pièces à la station n" est stocké dans le tableau suivant.

T[n][coins]

Vous pouvez le créer comme suit. Entrez une valeur suffisamment grande comme valeur initiale.

T = [[10**18 for _ in range(2451)] for _ in range(N)]

Les modèles de comportement possibles pour chaque station sont les feuilles de "coût cost, temps $ t $ pour aller à la station adjacente $ m $" "temps $ t $ pour utiliser des pièces d'or à la même station -Il n'y a pas d'autre choix que d'échanger contre des «coûts» (passez à $ m = n $ et pensez que vous avez consommé des «coûts» négatifs). Traitez ce comportement comme un taple.

(m, cost, t)

Enregistrez ce taple en tant que tableau pour chaque station $ n $.

act[n] = [(Action 1), (Action 2), (Action 3), ....]

Le code suivant stockera les valeurs entrées dans ces derniers.

N, M, S = map(int, input().split())

act = [[] for _ in range(N)]


for i in range(M):
  U, V, A, B = map(int, input().split())
  U -= 1
  V -= 1
  act[U] += [(V, A, B)]
  act[V] += [(U, A, B)]

for i in range(N):
  C, D = tuple(map(int, input().split()))
  act[i] += [(i, -C, D)]

Puisque la recherche est effectuée à partir d'ici, l'état qui est la source de recherche est enregistré dans la file d'attente prioritaire. Traitez un état comme un taple. L'heure actuelle $ currentT $, la station actuelle $ n $ et le nombre de pièces d'argent en possession $ pièces $ sont exprimées comme suit.

(currentT, n, coins)

L'état initial de la file d'attente prioritaire est le suivant.

que = [(0, 0, S)]

Le tableau bidimensionnel "T" est rempli en extrayant de cette file d'attente dans l'ordre croissant de t et en effectuant une recherche. Enfin, si vous retirez la plus petite valeur de T [n], cela représente le temps minimum pour atteindre la station n.

Ensuite, le code écrit est le suivant.

from heapq import *

N, M, S = map(int, input().split())

T = [[10**18 for _ in range(2451)] for _ in range(N)]

act = [[] for _ in range(N)]

for i in range(M):
  U, V, A, B = map(int, input().split())
  U -= 1
  V -= 1
  act[U] += [(V, A, B)]
  act[V] += [(U, A, B)]

for i in range(N):
  C, D = tuple(map(int, input().split()))
  act[i] += [(i, -C, D)]

que = [(0, 0, S)]

while que:
  (currentT, n, coins) = heappop(que)
  for m, cost, t in act[n]:
    #Si "au montant que vous pouvez payer" "temps minimum T"[Destination][Argent de possession]Mettez à jour la valeur lorsque vous pouvez mettre à jour et ajoutez l'état à la file d'attente.
    #Si le résultat de l'échange dépasse 2450, traitez-le comme 2450 et il n'y a pas de problème.
    if coins >= cost and currentT + t < T[m][min(2450, coins - cost)]:
      T[m][min(2450, coins - cost)] = currentT + t
      heappush(que, (currentT + t, m, min(2450, coins - cost)))

for i in range(1, N):
  print(min(T[i]))

Il semble que ce soit un algorithme appelé la méthode Dyxtra. J'ai senti que c'était un problème difficile pour la question E, mais j'ai été surpris que l'algorithme de la partie de recherche finale soit extrêmement facile à écrire.

C'est tout pour cet article.

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)
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 113 Revue des questions précédentes
AtCoder Beginner Contest 074 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 054 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 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 069 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 093 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