** Les problèmes A, B, C, D ** du ** AtCoder Beginner Contest 183 ** seront expliqués aussi soigneusement que possible avec ** Python 3 **.
Je vise à expliquer une solution qui satisfait les trois points suivants, pas seulement une méthode qui peut être résolue.
--Simple: vous n'avez à penser à rien de plus --Facile à mettre en œuvre: je suis content qu'il y ait moins d'erreurs et de bugs ――Cela ne prend pas longtemps: les performances augmentent et il vous reste plus de temps pour les problèmes ultérieurs.
Si vous avez des questions ou des suggestions, veuillez laisser un commentaire ou Twitter. Twitter: u2dayo
[Résumé ABC183](# abc183-Résumé) [Un problème "ReLU"](#a problem relu) [B problème "Billiards"](#b problème de billard) [C problem "Travel"](#c problem travel) [D problème "Chauffe-eau"](#d problème de chauffe-eau)
Nombre total de soumissions: 7199
| Performance | AC | But | temps | Classement(Dans les limites) |
|---|---|---|---|---|
| 200 | AB---- | 300 | 32 minutes | 5526(5365)Rang |
| 400 | ABC--- | 600 | 99 minutes | 4586(4426)Rang |
| 600 | ABC--- | 600 | 38 minutes | 3791(3632)Rang |
| 800 | ABCD-- | 1000 | 88 minutes | 2963(2807)Rang |
| 1000 | ABCD-- | 1000 | 46 minutes | 2194(2038)Rang |
| 1200 | ABCD-- | 1000 | 21 minutes | 1554(1399)Rang |
| 1400 | ABCDE- | 1500 | 70 minutes | 1060(911)Rang |
| 1600 | ABCDEF | 2100 | 122 minutes | 700(557)Rang |
| 1800 | ABCDEF | 2100 | 77 minutes | 440(315)Rang |
| 2000 | ABCDEF | 2100 | 59 minutes | 273(164)Rang |
| 2200 | ABCDEF | 2100 | 46 minutes | 161(78)Rang |
| 2400 | ABCDEF | 2100 | 37 minutes | 100(35)Rang |
| Couleur | Nombre de personnes | A | B | C | D | E | F |
|---|---|---|---|---|---|---|---|
| Cendre | 2960 | 99.5 % | 69.2 % | 35.0 % | 12.5 % | 1.9 % | 0.8 % |
| thé | 1377 | 99.7 % | 91.7 % | 87.5 % | 57.4 % | 5.8 % | 2.5 % |
| vert | 1086 | 99.6 % | 96.9 % | 97.0 % | 90.7 % | 26.4 % | 7.6 % |
| eau | 664 | 99.8 % | 97.4 % | 99.5 % | 98.6 % | 69.7 % | 34.5 % |
| Bleu | 333 | 100.0 % | 99.7 % | 100.0 % | 100.0 % | 94.6 % | 76.0 % |
| Jaune | 124 | 95.2 % | 94.3 % | 94.3 % | 95.2 % | 96.0 % | 91.9 % |
| Orange | 28 | 100.0 % | 100.0 % | 100.0 % | 100.0 % | 100.0 % | 96.4 % |
| rouge | 9 | 88.9 % | 88.9 % | 88.9 % | 88.9 % | 88.9 % | 100.0 % |

C'était un codeur bleu ** pendant seulement ** 23 heures.
** Page de problème **: A --ReLU ** <font color = # 808080> Gris </ font> Taux de réponse correcte du codeur **: 99,5% ** <font color = # 804000> Marron </ font> Taux de réponse correcte du codeur **: 99,7% ** <font color = # 008000> Vert </ font> Taux de réponse correcte du codeur **: 99,6%
La fonction ReLu est une fonction souvent utilisée comme fonction de transfert pour l'apprentissage en profondeur.
x = int(input())
if x >= 0:
print(x)
else:
print(0)
** Page de problème **: B --Billiards ** <font color = # 808080> Gray </ font> Taux de réponse correcte du codeur **: 69,2% ** <font color = # 804000> Marron </ font> Taux de réponse correcte du codeur **: 91,7% ** <font color = # 008000> Vert </ font> Taux de réponse correcte du codeur **: 96,9%
$ G_x --S_x = T_x $, $ S_y + G_y = T_y $. À partir du Diagramme de commentaire officiel, vous pouvez penser au triangle ci-dessous.

La relation suivante tient à la similitude et au rapport des triangles.
Δx = \frac{S_y}{T_y}・ T_x
La réponse est $ S_x + Δx $ car $ Δx $ est la longueur de $ S_x $ au point de réflexion sur le mur. Notez que $ T_x $ et $ Δx $ sont négatifs lorsque la cible est sur le côté gauche (direction moins de l'axe $ x $). Par conséquent, il n'est pas nécessaire de séparer les affaires.
sx, sy, gx, gy = map(int, input().split())
tx = gx - sx
ty = sy + gy
dx = tx * sy / ty
print(sx + dx)
** Page de problème **: C --Travel ** <font color = # 808080> Gray </ font> Taux de réponse correcte du codeur **: 35,0% ** <font color = # 804000> Brown </ font> Taux de réponse correcte du codeur **: 87,5% ** <font color = # 008000> Vert </ font> Taux de réponse correcte du codeur **: 97,0%
** * Il est plus facile de comprendre s'il correspond à l'indice du tableau, donc nous partirons de la ville $ 0 $. ** **
La ville 0 $ au début et la ville 0 $ à la fin sont fixes quel que soit l'ordre dans lequel vous visitez la ville.
Il y a un total de $ (N-1)! $ Façons de visiter la ville de 1 $ à $ N -1 $. Le maximum est $ N = 8 $, il n'y a donc que 7 $! = 5040 $.
** Par conséquent, il suffit d'essayer toutes les commandes de visite et de compter le nombre de choses qui ne valent que $ K $. ** **
Si vous souhaitez générer toutes les séquences possibles en Python, vous pouvez utiliser les permutations du module itertools.
Dans ce numéro, je souhaite créer toutes les séquences qui peuvent être triées par (1, 2, 3, ..., N -1). Pour ce faire, passez range (1, N) comme argument pour permutations.
Plus précisément, vous pouvez écrire comme suit.
for per in permutations(range(1, N)):
#En traitement
from itertools import permutations
N, K = map(int, input().split())
T = []
for _ in range(N):
s = list(map(int, input().split()))
T.append(s)
ans = 0
for per in permutations(range(1, N)):
score = 0 #C'est le temps pris dans l'ordre de cette visite
prev = 0 #Premier départ de la ville 0
for i in range(N - 1):
cur = per[i]
score += T[prev][cur] #Tête de ville précédente à ville cur
prev = cur
score += T[prev][0] #Allez enfin en ville 0
if score == K:
#Si vous pouvez vous déplacer avec juste K, la réponse+1
ans += 1
print(ans)
** Page de problème **: D - Chauffe-eau ** <font color = # 808080> Gray </ font> Taux de réponse correcte du codeur **: 12,5% ** <font color = # 804000> Brun </ font> Taux de réponse correcte du codeur **: 57,4% ** <font color = # 008000> Vert </ font> Taux de réponse correcte du codeur **: 90,7%
Les heures sont séparées par des nombres entiers et ont un maximum de 200 000 $. Par conséquent, envisagez de créer un tableau qui enregistre la quantité d'eau chaude consommée chaque heure. Bien sûr, ajouter $ P_i $ à chaque section de personnes $ N $ n'est pas suffisant.
Par conséquent, nous utilisons la somme cumulée. ** "Ajouter $ P_i $ de $ S_i $ à $ T_i --1 $" ** peut être paraphrasé de cette façon.
Si vous ne faites que la première opération avec la somme cumulative habituelle, $ P_i $ sera ajouté après $ T_i $. Par conséquent, si vous soustrayez $ P_i $ après $ T_i $ pour l'annuler, vous pouvez ajouter à l'intervalle par somme cumulative.
Faites ces opérations de 2 $ sur un tableau de 1 $ de personnes chacune. Enfin, trouvez la somme cumulée et voyez si la consommation d'eau chaude est inférieure à $ W $ à tout moment. Pour ce faire, vous pouvez utiliser la fonction max pour déterminer si la somme cumulative maximale est inférieure ou égale à $ W $.
Notez que ** "l'algorithme qui ajoute des intervalles à l'aide de sommes cumulées" ** utilisé dans ce problème est parfois appelé la ** méthode imos ** du nom du développeur. Si vous le faites pour un tableau à une dimension, c'est un algorithme simple qui ne fait que l'opération de somme cumulative $ 2 $ fois.
À partir du commentaire de @ c-yan, il a été amélioré d'utiliser la fonction max pour le jugement final. Merci!
from itertools import accumulate
C = 200005 #La longueur C de la séquence de somme cumulée. Définissez le nombre de manière appropriée supérieur à 200 000.
N, W = map(int, input().split())
seq_a = [0] * C
for _ in range(N):
s, t, p = map(int, input().split())
seq_a[s] += p
seq_a[t] -= p
S = list(accumulate(seq_a))
if max(S) <= W:
print('Yes')
else:
print('No')
Recommended Posts