[PYTHON] AtCoder Je ne connais pas le journal_3 ABC149C, D

introduction

ABC149 a également participé. Je suis devenu un enfant. J'étais stupide, alors j'ai mal lu l'énoncé du problème dans le problème A et j'ai fait une erreur. Aussi, au lieu d'obtenir le résultat dans le problème B, j'ai essayé de faire une opération littérale, me suis souvenu de la quantité de calcul et ajusté à la hâte la direction, et ce que j'ai fait deux fois avant la dernière fois est un peu vivant ... ... Je ressens. Qiita, je veux faire de ce journal un modèle, mais que dois-je faire? Est-ce ce que je devrais écrire du code en programmation? Je pense que c'est plus rapide de le coller sur un bloc-notes et de le copier que d'ouvrir l'éditeur et de faire quelque chose. Je pense qu'il y a beaucoup de gens et de programmeurs qui font des choses plus ennuyeuses en essayant de s'amuser de cette manière. C'est un préjugé.

C - Next Prime Trouvez le plus petit des nombres premiers supérieur ou égal à X.

Pensées

(1) Quelle est la longueur de l'intervalle entre les nombres premiers (il semble être un peu plus de 10 en moyenne) (2) Je pense que nous n'avons pas d'autre choix que de le décomposer. ③ TLE effrayant Cette déclaration de problème est simple et agréable. Je me suis demandé si je pouvais utiliser la prédiction de Legendre, mais je n'en avais pas besoin.

Première fois

C'est la première fois, donc ce n'est qu'une fois

import math
n=int(input())
#Commencez la boucle avec un nombre impair
if n % 2 == 0 and n != 2:
        n += 1
#Essayez 20 fois avec une marge
while n <= n + 20:
    i=3
    #Continuez à diviser par un i impair plus petit que la racine carrée
    while i <= math.sqrt(n):
        #Si ça casse, le prochain n
        if n % i == 0:
            break
        #Si ça ne casse pas, le prochain je
        else:
            i += 2
    #Si tout ne casse pas, c'est la réponse, donc c'est fini
    if i >= math.sqrt(n):
        print(n)
        break
    else:
        n+=2

J'ai réussi. Hmmm. Je pense qu'il y a une meilleure façon ...

if i >= math.sqrt(n):

Cependant, je pense que c'est une façon très merdique de le faire. Je me demande quoi faire quand je l'ai fait sans casser la boucle, mais je pense qu'il y a une meilleure façon de faire la même chose ... De plus, en ce qui concerne les nombres premiers, j'ai fait une boucle de 20 fois en supposant qu'environ 20 seraient suffisants pour le niveau 10 5 </ sup>, mais je me demande si c'est correct ...

Réponse de l'homme fort (Tsuyobito)

C'était un travail à la ronde étonnamment normal. En premier lieu, je savais que cela se terminerait dans peu de temps, donc je n'ai pas défini la taille de i par l'instruction while, et j'aurais dû utiliser l'instruction for. De même, je n'ai pas eu à l'utiliser deux fois. Depuis que je suis devenu TLE deux fois avant la dernière fois, j'ai imaginé un moyen de le diviser uniquement par un nombre impair afin de ne pas mettre de charge, mais j'ai pensé que ce n'était pas nécessaire de manière inattendue. Si vous pouvez prévoir approximativement le montant du calcul de ce montant, vous saurez combien il est. Cependant, je ne sais pas à cause de cela, mais le temps d'exécution était rapide. De plus, peu de gens utilisaient la racine carrée pour diviser. Cependant, la programmation de la concurrence est forte dans la vitesse à laquelle vous écrivez du code, donc elle n'a pas besoin d'être aussi coûteuse en calcul. Mais je me demande s'il diminuera considérablement.

Je me demande quel genre de code est bon pour voir les soumissions de chacun. Bien sûr, cela doit être facile à comprendre, rapide et court, mais il est difficile de les équilibrer. L'écriture de code qui se termine sur une ligne n'est pas lisible et, au plus tôt, un tel code redondant n'est pas bon.

Écrivons D avant d'oublier.

D - Prediction and Restriction

Takahashi a décidé de jouer à un jeu appelé "Janken Battle" au Game Center. Les règles de ce jeu sont les suivantes.

Cependant, il n'est pas possible de faire le même mouvement que celui réalisé avec le Janken K. (Vous pouvez lancer votre main préférée avec le Janken jusqu'à l'heure K.) Le logement décide du coup à effectuer dans chaque Janken avant le début du jeu. M. Takahashi, une personne talentueuse, a lu tout cela avant le début du match. Les informations lues par M. Takahashi sont données sous forme de chaîne de caractères T. Lorsque la lettre i (1 ≤ i ≤ N) de T est r, le boîtier donnera un goo au i-ème Janken, quand il sera s, il donnera un choki, et quand il sera p, il donnera un par. Représente. Lorsque Takahashi choisit le meilleur coup à jouer en N fois, combien de points peut-il obtenir à la fin de la partie?

Pensées

① Si vous souffrez après k fois, vous perdrez, alors ne comptez pas ② Remplacez les caractères non comptés et comptez le nombre de ciseaux papier-pierre valides à la fin. Il y a beaucoup de gens talentueux dans At Corder. Je veux rassembler tout le monde et les faire combattre.

Première fois

n,k = map(int,input().split())
r,s,p = map(int,input().split())
st = input()
for i in range(len(st)-k):
    if st[i] == st[i + k]:
        st = st[:i + k]+ 'no' + st[i + k + 1:]
win = r*st.count('s') + s*st.count('p') + p*st.count('r')
print(win)

J'ai réussi. Je n'ai pas pu remplacer la chaîne de caractères, alors je l'ai découpée en tranches et je les ai connectées. Tsuka len (st). Il y a n.

Réponse de l'homme fort (Tsuyobito)

Tout le reste était à peu près pareil. Le temps d'exécution est probablement très long car il s'agit d'une chaîne de caractères. Quand je l'ai essayé sur la liste, 598ms sont devenus 47ms. Tout à fait stupide. Il y a quelques points négatifs, mais j'ai pu le faire de manière inattendue. Je ne peux pas le faire à temps. Je veux continuer à faire de mon mieux.

Recommended Posts

AtCoder Je ne connais pas le journal_3 ABC149C, D
AtCoder Je ne sais pas journal_2 ABC148E
AtCoder Je ne sais pas journal_4 ABC081B, 087B, 083B (de l'ABS)
Je ne connais pas l'erreur de valeur
Je ne comprends pas rejoindre