[PYTHON] Retour sur ABC155

Ceci est mon premier message posté. Je vous remercie. Je vais résumer l'examen d'ABC155 qui a été fait hier dans la pratique.

Un problème

Énoncé du problème

Pour le nombre de triplets, lorsque deux sont égaux et que l'autre est différent, le triplet est dit «pauvre». Étant donné les trois entiers A, B et C, écrivez Oui si vous vous sentez désolé pour ce triplet, ou Non si vous ne le faites pas.

Exemple de réponse

a = set(map(int, input().split()))
if len(a) == 2:
  print("Yes")
else:
  print("No")

Vous pouvez juger si vous êtes désolé ou non en regardant le nombre d'éléments à l'aide de set set ().

Problème B

Énoncé du problème

Vous êtes agent d'immigration au Royaume d'AtCoder. Les documents d'immigration contiennent plusieurs nombres entiers et votre travail consiste à déterminer s'ils remplissent les conditions. Les conditions générales exigent que l'inscription soit approuvée lorsque et seulement lorsque les conditions suivantes sont remplies: Tous les entiers écrits sur le document qui sont pairs sont divisibles par 3 ou 5. Lorsque vous suivez les règles ci-dessus, imprimez APPROUVÉ si vous approuvez les immigrants avec N entiers A1, A2,…, AN dans le document, sinon imprimez REFUSÉ.

Exemple de réponse

N = int(input())
A = list(map(int, input().split()))
flag = 0
for i in range(N):
  if A[i] % 2 == 0:
    if A[i] % 3 == 0 or A[i] % 5 == 0:
      pass
    else:
      flag = 1
      break
if flag == 0:
  print("APPROVED")
else:
  print("DENIED")

S'il y a un nombre pair qui n'est pas divisible par 3 ou 5, réécrivez l'indicateur et cassez-le. Enfin, il sort en fonction de la valeur de flag.

Problème C

Il existe N feuilles de vote, et la chaîne $ S_i $ est écrite sur la feuille $ i \ (1 ≤ i ≤ N) $. Sortez toutes les chaînes de caractères qui ont été écrites le plus souvent dans l'ordre croissant dans l'ordre lexical.

Tout d'abord, j'ai créé un dict et mis un caractère en clé et le nombre d'occurrences en valeur. .. .. TLE. J'avais le sentiment qu'il n'y avait qu'un drapeau qui ne fonctionnait pas aujourd'hui.

Exemple de réponse (TLE)

N = int(input())
dic = {}
for i in range(N):
  s = str(input())
  if not s in dic:
    dic[s] = 1
  else:
    dic[s] += 1
max_k_list = [kv[0] for kv in dic.items() if kv[1] == max(dic.values())]
max_k_list = sorted(max_k_list)
for i in max_k_list:
  print(i)

~~ La raison de TLE ici est probablement que la première instruction for et la suivante sinon s dans dic: sont calculées pour être proches de $ O (N ^ 2) $. ~~ (Sinon, veuillez commenter) max_k_list = [kv[0] for kv in dic.items() if kv[1] == max(dic.values())] C'était $ O (N ^ 2) $ en obtenant la valeur maximale dans l'instruction for à chaque fois. Puisque la valeur maximale ne change pas, vous pouvez éliminer les calculs inutiles en les sortant de la boucle et vous pouvez en faire $ O (N) $. (J'oubliais que j'avais changé ça au moment de ca ...) ~~ Enfin, c'était une bonne idée d'utiliser le module collections. ~~

Exemple de réponse (AC)

import collections

N = int(input())
a = []
for i in range(N):
  a.append(str(input()))
a = collections.Counter(a)
b = max(a.values())
max_k_list = [kv[0] for kv in a.items() if kv[1] == b]
max_k_list = sorted(max_k_list)
for i in max_k_list:
  print(i)

Cette fois, c'était le 3 complet d'ABC, donc je n'ai pu le résoudre que jusqu'à présent. En guise de réflexion, je ne pouvais pas commencer à 9 heures parce que je jouais au jeu. La vitesse de réponse était extrêmement lente en raison de l'oubli de trier ou de l'exécution de TLE inutile dans le problème C. Surtout aujourd'hui, D était très difficile, donc j'ai dû résoudre jusqu'à C rapidement. Après cela, il faut simplement prendre l'habitude de le résoudre régulièrement. .. (Je n'arrive pas à le faire)

Problème D

J'ai essayé de l'implémenter en regardant l'explication de Youtube. Je n'ai pas remarqué qu'il pouvait être résolu en 2 minutes de recherche. Je me demande s'il est nécessaire de s'habituer à ce domaine.

n, K = map(int, input().split())
a = sorted(list(map(int, input().split())))
inf = 10**18 + 1
l = -1 * inf
r = inf
while(l + 1 < r):
  c = (l + r)//2
  count = 0
  for i in range(n):
    #a[i]Classement des cas par le signe de
    #a[i] <S'il y a un k qui vaut 0, il y a un k<Si j, alors a[i]*a[j]Est inférieur à une certaine valeur x.
    if a[i] < 0:
      start = -1 #OUT
      end = n #OK
      while start + 1 < end:
        mid = (start + end) //2
        if a[i] * a[mid] < c:
          end = mid
        else:
          start = mid
      count += (n-end)
      if start < i:
        count -= 1
    else:#a[i]Le signe de étant inversé, l'opération opposée à la précédente peut être effectuée.
      start = -1 #OK
      end = n #OUT
      while start + 1 < end:
        mid = (start + end)//2
        if a[i] * a[mid] < c:
          start = mid
        else:
          end = mid
      count += end
      if a[i] * a[i] < c:
        count -= 1
  count = (count // 2)
  if count < K:
    l = c
  else:
    r = c
print(l)

Cependant, c'était TLE. Il semble que C ++ puisse le faire à temps, mais pas Python. .. .. Les gens qui sont AC semblent bien utiliser np.search de numpy pour le résoudre.

Recommended Posts

Retour sur ABC155
Retour sur 2016 dans le langage Crystal
Retour sur la création d'un service Web avec Django 1
Retour sur la création d'un service Web avec Django 2
ABC168
ABC164
Atcoder ABC125 C --GCD sur tableau noir
ABC174
[Python] Rétrospective de ce que j'ai enseigné aux débutants en programmation à partir des fonctions
ABC175
ABC170
ABC182
ABC153
Retour sur les 10 mois avant qu'un débutant en programmation ne devienne un expert Kaggle
J'ai repensé à la classe Python
Rétrospective de la façon dont l'employé de bureau a changé d'emploi en tant qu'ingénieur (partie 2)
Retour sur le concours d'apprentissage automatique sur lequel j'ai travaillé pour la première fois
Retour sur l'histoire des expressions qui renvoient somme de carré à Pythonic