** Les problèmes A, B, C, D ** du ** AtCoder Beginner Contest 181 ** 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é ABC181](# abc181-Résumé) [Un problème "Rotation lourde"](# un problème de rotation lourde) [B problème "Trapezoid Sum"](#b problème trapezoid-sum) [Problème C "Colinéarité"](#c problème de colinéarité) [D problème "Hachi"](#d problème hachi)
Nombre total de soumissions: 6643
| Performance | AC | But | temps | Classement(Dans les limites) |
|---|---|---|---|---|
| 200 | AB---- | 300 | 20 min | 5056(4953)Rang |
| 400 | ABC--- | 600 | 77 minutes | 4179(4077)Rang |
| 600 | ABC--- | 600 | 28 minutes | 3435(3333)Rang |
| 800 | ABCD-- | 1000 | 95 minutes | 2647(2549)Rang |
| 1000 | ABCD-- | 1000 | 60 minutes | 1918(1822)Rang |
| 1200 | ABC-E- | 1100 | 87 minutes | 1324(1230)Rang |
| 1400 | ABCDE- | 1500 | 83 minutes | 873(789)Rang |
| 1600 | ABCDE- | 1500 | 61 minutes | 558(476)Rang |
| 1800 | ABCDE- | 1500 | 44 minutes | 345(269)Rang |
| 2000 | ABCDEF | 2100 | 103 minutes | 197(139)Rang |
| 2200 | ABCDEF | 2100 | 72 minutes | 104(66)Rang |
| 2400 | ABCDEF | 2100 | 56 minutes | 52(30)Rang |
| Couleur | Nombre de personnes | A | B | C | D | E | F |
|---|---|---|---|---|---|---|---|
| Cendre | 2714 | 99.0 % | 84.1 % | 43.0 % | 18.0 % | 1.4 % | 0.1 % |
| thé | 1228 | 99.8 % | 99.7 % | 85.8 % | 61.5 % | 4.2 % | 0.1 % |
| vert | 972 | 99.7 % | 99.7 % | 96.2 % | 87.7 % | 37.4 % | 0.4 % |
| eau | 574 | 99.8 % | 99.8 % | 98.6 % | 95.1 % | 86.6 % | 7.0 % |
| Bleu | 291 | 99.7 % | 99.7 % | 100.0 % | 98.6 % | 98.3 % | 38.5 % |
| Jaune | 78 | 97.4 % | 97.4 % | 98.7 % | 98.7 % | 88.5 % | 55.1 % |
| Orange | 22 | 95.5 % | 95.5 % | 100.0 % | 100.0 % | 95.5 % | 81.8 % |
| rouge | 3 | 100.0 % | 100.0 % | 100.0 % | 100.0 % | 100.0 % | 100.0 % |

Les problèmes C et D ont été recherchés sur Google. C'était un peu difficile parce que je n'étais pas doué pour mettre en œuvre le problème E, mais dans l'ensemble, c'était un bon résultat.
** Page de problème **: A - Rotation lourde ** <font color = # 808080> Gray </ font> Taux de réponse correcte du codeur **: 99,0% ** <font color = # 804000> Brun </ font> Taux de réponse correcte du codeur **: 99,8% ** <font color = # 008000> Vert </ font> Taux de réponse correcte du codeur **: 99,7%
Si $ N $ est impair, c'est «" Noir "», et s'il est pair, c'est «« Blanc »». Si le reste de $ N $ divisé par 2 $ est égal à 0 $, c'est un nombre pair, et s'il vaut 1 $, c'est un nombre impair.
N = int(input())
if N % 2 == 1:
print("Black")
else:
print("White")
** Page de problème **: B --Trapezoid Sum ** <font color = # 808080> Gray </ font> Taux de réponse correcte du codeur **: 84,1% ** <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,7%
Comme indiqué dans le code ci-dessous, la méthode d'ajout d'entiers de $ A $ à $ B $ est TLE.
N = int(input())
ans = 0
for _ in range(N):
a, b = map(int, input().split())
for x in range(a, b + 1):
ans += x
print(ans)
Afin de le faire à temps, il est nécessaire de calculer la somme de chaque plage avec une seule formule.
Il y a environ 2 $ dans les formules, mais les deux sont similaires.
Cette fois, je vais expliquer le premier simple.
$ S = (somme de 1 à x) $ est calculé par la formule suivante. Cette expression est toujours divisible en un entier.
S = \frac{x{(x+1)}}{2}
Dans le code, cela ressemble à ceci: Notez que nous utilisons // (division entière) pour tronquer après la virgule décimale.
s = x * (x + 1) // 2
** Cette formule est très souvent utilisée chez les pros de la compétition. Si vous ne vous en souvenez pas, il est toujours utile de vous en souvenir à cette occasion. ** **
def calc(x):
#Une fonction qui renvoie la somme de 1 à x
return x * (x + 1) // 2
N = int(input())
ans = 0
for _ in range(N):
a, b = map(int, input().split())
ans += (calc(b) - calc(a - 1))
print(ans)
** Page de problème **: C --Collinearity ** <font color = # 808080> Gray </ font> Taux de réponse correcte du codeur **: 43,0% ** <font color = # 804000> Brun </ font> Taux de réponse correcte du codeur **: 85,8% ** <font color = # 008000> Vert </ font> Taux de réponse correcte du codeur **: 96,2%
Le nombre maximum de points est de 10 $ ^ 2 = 100 $, il suffit donc de juger si les trois combinaisons de points sont sur la même ligne droite ou d'utiliser une boucle lourde de 3 $.
La condition que les points $ 3 $ soient sur la même ligne droite est que l'équation suivante est vraie. (Pour plus de détails, laissez-le à Official Commentary et à la recherche Google)
(x_2-x_1)(y_3-y_1) = (x_3-x_1)(y_2-y_1)
def judge():
for i in range(N):
for j in range(i + 1, N):
for k in range(j + 1, N):
x1, y1 = P[i]
x2, y2 = P[j]
x3, y3 = P[k]
fx, fy = x2 - x1, y2 - y1
sx, sy = x3 - x1, y3 - y1
if fx * sy == sx * fy:
return True
return False
N = int(input())
P = []
for _ in range(N):
x, y = map(int, input().split())
P.append((x, y))
if judge():
print("Yes")
else:
print("No")
** Page de problème **: D --Hachi ** <font color = # 808080> Gray </ font> Taux de réponse correcte du codeur **: 18,0% ** <font color = # 804000> Brown </ font> Taux de réponse correcte du codeur **: 61,5% ** <font color = # 008000> Vert </ font> Taux de réponse correcte du codeur **: 87,7%
Dans le cas de chiffres de 1 $, il ne peut pas être trié, vous pouvez donc simplement juger s'il est divisible par 8 $.
Dans le cas de chiffres de 2 $ $, vous pouvez déterminer s'il s'agit d'un modèle «utiliser tel quel» ou «retourner» $ 2 $, divisible par 8 $.
** "Un certain entier est un multiple de 8" ⇔ "Les 3 derniers chiffres d'un certain entier sont un multiple de 8" **. Je vais laisser les détails ailleurs, car 1000 $ est un multiple de 8 $.
Autrement dit, si vous pouvez réorganiser ** $ S $ librement et que même les 3 derniers chiffres $ sont un multiple de 8 $ $, vous pouvez en faire un multiple de 8 $ $. ** **
Il n'y a que des multiples de plus de 100 $ de 8 $ dans le chiffre de 3 $. Par conséquent, il peut être résolu par ** "déterminer s'il peut être fait pour tous les multiples de 8 $ de chiffres de 3 $" **.
Par exemple, si vous voulez que les 3 derniers chiffres soient de 112 $ $, vous pouvez le faire si $ 1 $ vaut 2 $ ou plus et 2 $ est 1 $ ou plus dans $ S $.
Pour faire ce jugement, vous devez compter à l'avance combien de $ 1 $ à 9 $ $ sont inclus dans $ S $.
Lors du comptage, il est plus facile d'utiliser le Compteur dans le module collections.
>>> from collections import Counter
>>> S = "181"
>>> cnt_first = Counter(S)
>>> cnt_first
Counter({'1': 2, '8': 1}) # '1'2 pièces,'8'Il existe une
for x in range(104,1000,8):
#En traitement
Spécifiez l'argument de «plage» comme suit.
Point de départ: 3 $ Le plus petit multiple de 8 $ en chiffres 104 $ Point final: 1000 $ (moins de) Étapes: $ + 8 $ chacun
Vous pouvez maintenant énumérer 104, 112, 120, ..., 984, 992 $.
from collections import Counter
def judge():
if len(S) == 1:
if int(S) % 8 == 0:
return True
elif len(S) == 2:
if int(S) % 8 == 0 or int(S[::-1]) % 8 == 0:
return True
else:
for x in range(104, 1000, 8):
cnt_current = Counter(str(x))
ok = True
for key, val in cnt_current.items():
if val > cnt_original[key]:
ok = False
if ok:
return True
return False
S = input()
cnt_original = Counter(S) #Vous pouvez voir combien de lettres 1 à 9 sont dans S
if judge():
print("Yes")
else:
print("No")
Commentaire officiel est plus intelligent d'utiliser «Counter». Je pense que vous pouvez le faire de cette façon.
Nous soustrayons entre les Counters et disons que nous pouvons le faire s'il devient vide.
Recommended Posts