[PYTHON] AtCoder Beginner Contest 149 Rapport de participation

AtCoder Beginner Contest 149 Rapport de participation

ABC149A - Strings

Percer en 1 minute. Il suffit d'écrire

S, T = input().split()

print(T + S)

ABC149B - Greedy Takahashi

Percer en 6 minutes. Il suffit d'écrire. Au début, je ne comprenais pas le sens de la phrase, alors j'ai pensé que je réduirais K feuilles dans les deux cas, mais j'ai essayé l'exemple d'entrée / sortie et j'ai réalisé le sens correct.

A, B, K = map(int, input().split())

a = max(A - K, 0)
K -= A - a
b = max(B - K, 0)
print(*[a, b])

ABC149C - Next Prime

Percer en 7 minutes. Apportez simplement le tamis Eratostenes écrit en ABC084D - Nombre semblable à 2017 et écrivez-le.

from math import sqrt

N = 10 ** 6

p = [True] * (N + 1)
p[0] = False
p[1] = False
n = int(sqrt(N) + 1)
for j in range(4, N + 1, 2):
  p[j] = False
for i in range(3, n + 1, 2):
  if p[i]:
    for j in range(i + i, N + 1, i):
      p[j] = False


X = int(input())
for i in range(X, N + 1):
    if p[i]:
        print(i)
        break

ABC149D - Prediction and Restriction

Pause en 44 minutes WA1 Partons du principe que nous allons gagner le coup pour le moment, et si nous l'implémentons de sorte que si nous obtenons le même coup que le coup K, WA sortira et nous devrons DP. Mais n'est-ce pas le nombre de personnes qui ont percé (raisonnement pourri)? ”J'étais inquiet pendant longtemps et j'ai réalisé qu'il valait peut-être mieux perdre. AC. A cause de cela, le classement était dans les années 1400. J'ai senti que j'étais sauvé parce que je n'étais pas évalué.

N, K = map(int, input().split())
R, S, P = map(int, input().split())
T = input()

d = {'r': P, 's': R, 'p': S}
result = 0
wins = [False] * K
for i in range(len(T)):
    if not wins[i % K] or T[i] != T[i - K]:
        result += d[T[i]]
        wins[i % K] = True
    else:
        wins[i % K] = False
print(result)

ABC149E - Handshake

Je n'ai pas pu percer, je ne pouvais pas penser à un moyen de dévaloriser la commande et j'ai terminé avec le TLE plein.

Addendum: Il est impossible de générer toutes les combinaisons car le montant du calcul sera * O * (10 10 </ sup>), donc même si vous essayez de garder les combinaisons générées à M, M est également bloqué à 10 10 </ sup>. Donc, inversez l'idée et trouvez le seuil de bonheur qui se produit une fois que le nombre de combinaisons dépasse M. C'est la somme cumulée. Il peut être calculé avec * O * ( N </ i> log N </ i>).

Une fois que cela est trouvé, tournez la boucle en fonction de la main gauche, sachez à quelle distance vous pouvez abaisser la main droite de la somme cumulée que vous avez faite plus tôt, et si vous faites une autre somme cumulative de la puissance de la main droite * O * (* N *) Cependant, comme le nombre de combinaisons n'est pas exactement M, il est nécessaire de soustraire le seuil de bonheur qui survient à un moment autant qu'il dépasse M. ..

N, M = map(int, input().split())
A = list(map(int, input().split()))

A.sort(reverse=True)
LB = A[-1] * 2  #La limite inférieure du bonheur qui peut être augmentée par une poignée de main est lorsque vous tenez la personne avec la puissance la plus faible dans vos mains gauche et droite.
UB = A[0] * 2   #La limite supérieure du bonheur qui peut être augmentée par une poignée de main est lorsque vous tenez la personne avec le plus grand pouvoir dans vos mains gauche et droite.

# cgs[i]Est-ce que le nombre d'invités avec une puissance i ou plus
cgs = [0] * (UB + 1)
for a in A:
    cgs[a] += 1
for i in range(UB, 0, -1):
    cgs[i - 1] += cgs[i]


#Dichotomiser le seuil de bonheur qui se produit une fois que le nombre de combinaisons est M ou plus
def is_ok(n):
    m = 0
    for a in A:
        m += cgs[max(n - a, 0)]
    return m >= M


ok = LB
ng = UB + 1
while ng - ok > 1:
    m = (ok + ng) // 2
    if is_ok(m):
        ok = m
    else:
        ng = m

# cps[i]Est un[0]~A[i]Somme cumulée de
cps = A[:]
for i in range(1, N):
    cps[i] += cps[i - 1]

result = 0
for a in A:
    t = cgs[max(ok - a, 0)]
    if t != 0:
        result += a * t + cps[t - 1]
        M -= t
result += ok * M
print(result)

Recommended Posts