[PYTHON] AtCoder Beginner Contest 057 Revue des questions précédentes

Questions passées résolues pour la première fois

Temps requis

スクリーンショット 2020-01-09 11.04.54.png

Impressions

Je ne pensais pas que je ferais une telle pena juste par malentendu Ça a été terrible ces deux derniers jours, donc je dois être un peu plus calme

Problème A

Sortez simplement le reste

answerA.py


a,b=map(int,input().split())
print((a+b)%24)

Problème B

Vérifiez les points de contrôle dans l'ordre et mettez à jour

answerB.py


n,m=map(int,input().split())
ab=[list(map(int,input().split())) for i in range(n)]
cd=[list(map(int,input().split())) for i in range(m)]

def manh(x,y):
    return abs(x[0]-y[0])+abs(x[1]-y[1])

ans=[]
for i in range(n):
    ans_sub=[0,manh(ab[i],cd[0])]
    for j in range(m):
        k=manh(ab[i],cd[j])
        if k<ans_sub[1]:
            ans_sub=[j,k]
    ans.append(ans_sub[0])
for i in range(n):
    print(ans[i]+1)

Problème C

Au début, j'ai mal compris et j'ai écrit le sol au plafond. Vous pouvez effectuer une recherche à partir du front dans la plage $ \ sqrt {n} $.

answerC.py


import math
n=int(input())
l=math.floor(math.sqrt(n))
k=math.floor(math.log10(n))+1

for i in range(2,l+1):
    if n%i==0:
        a,b=i,n//i
        x=max(math.floor(math.log10(a))+1,math.floor(math.log10(b))+1)
        k=min(x,k)
print(k)

Code qui était un peu plus rapide en utilisant exit

answerC_faster.py


from sys import exit
import math
n=int(input())
l=math.floor(math.sqrt(n))

for i in range(l+1,0,-1):
    if n%i==0:
        a,b=i,n//i
        h=max(a,b)
        k=math.floor(math.log10(h))+1
        print(k)
        exit()

Problème D

Tout d'abord, il est évident que vous devez d'abord sélectionner ceux qui ont la valeur la plus élevée, et ceux avec la même valeur auront la même valeur totale ** quel que soit celui que vous sélectionnez, alors triez-les par ordre décroissant puis utilisez la fonction groupby. Je l'ai appliqué. Ici, lorsqu'il y a A ou plusieurs éléments avec la valeur la plus élevée, il suffit de sélectionner les éléments de manière à satisfaire la condition de A ou plus et B ou moins parmi les éléments. (Je ne pouvais pas du tout me débarrasser du bogue car je pensais que la valeur à sélectionner parmi les éléments était différente du nombre d'éléments. ** J'ai pris le bogue sans abandonner ** vaut la peine d'être évalué. , Je sais comment le résoudre, mais j'ai fait une erreur en écrivant le code ... Quand j'étais sur le point d'entrer dans le marais, j'ai cru devoir le revoir avec le sentiment de ** recommencer ** ...) Ensuite, lorsque A est plus grand que le nombre des éléments les plus précieux, la moyenne diminue au fur et à mesure que vous sélectionnez les éléments, vous voulez donc réduire autant que possible le nombre d'éléments sélectionnés. Par conséquent, il est préférable de sélectionner exactement A, qui peut être facilement obtenu en comptant les éléments dans l'ordre à partir de l'avant. (** Cela aurait été plus facile si j'avais gardé le tableau d'origine avec group by ... **) Le code écrit sur la base des considérations ci-dessus est le suivant. En plus des erreurs ci-dessus, ce problème était trop terrible, ** j'ai essayé d'utiliser scipy et je n'ai pas pu l'utiliser **, ** je ne voulais pas casser **. De plus, je pense qu'il est important de ** verbaliser la solution ** parce que certaines parties peuvent être comprises lorsqu'elles sont verbalisées jusqu'à présent.

answerD.py


import math
#from scipy.special import comb
def combinations_count(n, r):
    return math.factorial(n) // (math.factorial(n - r) * math.factorial(r))

def groupby(a):
    a2=[[a[0],1]]
    for i in range(1,len(a)):
        if a2[-1][0]==a[i]:
            a2[-1][1]+=1
        else:
            a2.append([a[i],1])
    return a2

N,A,B=map(int,input().split())
v=[int(i) for i in input().split()]
v.sort(reverse=True)
v=groupby(v)

if A<=v[0][1]:
    #C'est faux
    m=min(v[0][1],B)
    co=0
    for i in range(A,m+1):
        #v[0][1]Était M
        co+=combinations_count(v[0][1],i)
    print(v[0][0])
    print(co)
else:
    al=0
    l=len(v)
    C=0
    for i in range(l):
        C+=v[i][1]
        if C<=A:
            al+=(v[i][0]*v[i][1])
        else:
            C-=v[i][1]
            al+=(v[i][0]*(A-C))
            co=combinations_count(v[i][1],A-C)
            #J'ai oublié de casser
            break
    print(al/A)
    print(co)

Recommended Posts

AtCoder Beginner Contest 072 Revue des questions précédentes
AtCoder Beginner Contest 085 Revue des questions précédentes
AtCoder Beginner Contest 062 Revue des questions précédentes
AtCoder Beginner Contest 113 Revue des questions précédentes
AtCoder Beginner Contest 074 Revue des questions précédentes
AtCoder Beginner Contest 127 Revue des questions précédentes
AtCoder Beginner Contest 151 Revue des questions précédentes
AtCoder Beginner Contest 075 Revue des questions précédentes
AtCoder Beginner Contest 054 Revue des questions précédentes
AtCoder Beginner Contest 110 Revue des questions précédentes
AtCoder Beginner Contest 117 Revue des questions précédentes
AtCoder Beginner Contest 070 Revue des questions précédentes
AtCoder Beginner Contest 105 Revue des questions précédentes
AtCoder Beginner Contest 112 Revue des questions précédentes
AtCoder Beginner Contest 076 Revue des questions précédentes
AtCoder Beginner Contest 089 Revue des questions précédentes
AtCoder Beginner Contest 069 Revue des questions précédentes
AtCoder Beginner Contest 079 Revue des questions précédentes
AtCoder Beginner Contest 056 Revue des questions précédentes
AtCoder Beginner Contest 087 Revue des questions précédentes
AtCoder Beginner Contest 067 Revue des questions précédentes
AtCoder Beginner Contest 093 Revue des questions précédentes
AtCoder Beginner Contest 123 Revue des questions précédentes
AtCoder Beginner Contest 078 Revue des questions précédentes
AtCoder Beginner Contest 081 Revue des questions précédentes
AtCoder Beginner Contest 047 Revue des questions précédentes
AtCoder Beginner Contest 060 Revue des questions précédentes
AtCoder Beginner Contest 104 Revue des questions précédentes
AtCoder Beginner Contest 057 Revue des questions précédentes
AtCoder Beginner Contest 121 Revue des questions précédentes
AtCoder Beginner Contest 126 Revue des questions précédentes
AtCoder Beginner Contest 090 Revue des questions précédentes
AtCoder Beginner Contest 103 Revue des questions précédentes
AtCoder Beginner Contest 061 Revue des questions précédentes
AtCoder Beginner Contest 059 Revue des questions précédentes
AtCoder Beginner Contest 044 Revue des questions précédentes
AtCoder Beginner Contest 083 Revue des questions précédentes
AtCoder Beginner Contest 048 Revue des questions précédentes
AtCoder Beginner Contest 124 Revue des questions précédentes
AtCoder Beginner Contest 116 Revue des questions précédentes
AtCoder Beginner Contest 097 Revue des questions précédentes
AtCoder Beginner Contest 088 Revue des questions précédentes
AtCoder Beginner Contest 092 Revue des questions précédentes
AtCoder Beginner Contest 099 Revue des questions précédentes
AtCoder Beginner Contest 065 Revue des questions précédentes
AtCoder Beginner Contest 053 Revue des questions précédentes
AtCoder Beginner Contest 094 Revue des questions précédentes
AtCoder Beginner Contest 063 Revue des questions précédentes
AtCoder Beginner Contest 107 Revue des questions précédentes
AtCoder Beginner Contest 071 Revue des questions précédentes
AtCoder Beginner Contest 064 Revue des questions précédentes
AtCoder Beginner Contest 082 Revue des questions précédentes
AtCoder Beginner Contest 084 Revue des questions précédentes
AtCoder Beginner Contest 068 Revue des questions précédentes
AtCoder Beginner Contest 058 Revue des questions précédentes
AtCoder Beginner Contest 043 Revue des questions précédentes
AtCoder Beginner Contest 098 Revue des questions précédentes
AtCoder Beginner Contest 114 Revue des questions précédentes
AtCoder Beginner Contest 045 Revue des questions précédentes
AtCoder Beginner Contest 120 Revue des questions précédentes
AtCoder Beginner Contest 108 Revue des questions précédentes