Es ist nicht schlecht in Bezug auf die Leistung, aber es tut mir sehr leid, weil ich sowohl E als auch F nicht lösen konnte (obwohl es eine Stunde gedauert hat). Vorerst möchte ich noch einmal überprüfen, was E und F fehlten.
Ob 7 enthalten ist oder nicht, kann als Zeichenfolge behandelt werden. Warum konvertieren Sie in eine Liste? Ich bin zu verrückt
A.py
n=list(input())
print("Yes" if "7" in n else "No")
Sie sollten über die Gesamtheit der Dinge nachdenken, die nicht brechen, selbst wenn 3 oder 5. Es hat ein paar Minuten gedauert, weil ich `` `i% 3 == 0 und i% 5 == 0``` gesetzt habe. ** Wenn es nicht funktioniert, funktioniert es nicht von Anfang an **. Ich möchte es ab dem nächsten Wettbewerb beheben.
B.py
ans=0
n=int(input())
for i in range(1,n+1):
if i%3!=0 and i%5!=0:
ans+=i
print(ans)
Ich habe WA ausgestellt ... Sie können verstehen, dass es nicht vergehen wird, wenn Sie nicht ruhig denken und ein wenig überlegen. ** Sie können das Ergebnis von gcd (i, j) zum Zeitpunkt der äußeren Doppelschleife sehen **. Wenn Sie also gcd (i, j) in der innersten Schleife berechnen, wird es mehr berechnet und pünktlich zum Zeitlimit nicht. (Ich war während des Wettbewerbs zu ungeduldig und habe es in C ++ bestanden, aber es wird auch normal in Python bestanden.)
C_TLE.py
from math import gcd
k=int(input())
ans=0
for i in range(1,k+1):
for j in range(1,k+1):
for l in range(1,k+1):
ans+=gcd(gcd(i,j),l)
print(ans)
C.py
from math import gcd
k=int(input())
ans=0
for i in range(1,k+1):
for j in range(1,k+1):
ans_=gcd(i,j)
for l in range(1,k+1):
ans+=gcd(ans_,l)
print(ans)
Ich habe das D-Problem auch mit viel Ungeduld gelöst. Schließlich kann es sein, dass ** wenn Sie sich zu viel Mühe geben, es im Gegenteil fehlschlägt **. Das erste, was aus diesem Problem leicht zu verstehen ist, ist, dass die drei zu wählenden Buchstaben ** R, G bzw. B ** sind. Da die Beziehung zwischen den Indizes der einzelnen Zeichen zu einem Problem wird, habe ich beschlossen, die Indizes der ** Zeichen R, G und B separat in einem Array ** zu speichern. Wenn Sie darunter am kürzesten denken, sollten Sie sich in der Reihenfolge r → g → b entscheiden und überlegen, ob der Index dem Thema entspricht. ** Wenn jedoch nichts unternommen wird, führt N <= 4000 zu O ($ N ^ 3 x + (yx)
,
(x + y) / 2 (die Gleichmäßigkeit von x und y ist gleich)
`` Es wurde gefunden, indem die Beziehung zwischen den beiden veranschaulicht wurde.) Sobald Sie dies wissen, können Sie die Antwort finden, indem Sie den Index von B mit set verwalten und nur den Index subtrahieren, der kein Kandidat ist.
answerD.py
n=int(input())
s=input()
r,g,b=[],[],[]
for i in range(n):
if s[i]=="R":
r.append(i)
elif s[i]=="G":
g.append(i)
else:
b.append(i)
b=set(b)
lb=len(b)
ans=0
for i in r:
for j in g:
x,y=min(i,j),max(i,j)
ans_=lb
if x-(y-x) in b:
ans_-=1
if y+(y-x) in b:
ans_-=1
if (x%2==y%2) and (y-x)//2+x in b:
ans_-=1
ans+=ans_
print(ans)
Nach dem letzten Mal waren die E- und F-Probleme sehr lehrreich, daher lohnt es sich, sie zu studieren. Wenn dieses Pegelband (hellblau, blau) stabil gelöst werden kann, scheinen die Ergebnisse stabil zu sein, daher möchte ich die Probleme in diesem Pegelband so weit wie möglich lösen.
In diesem Problem betrachten wir gcd der Kombination von $ K ^ N $, so dass wir sehen können, dass ** alles zählen nicht rechtzeitig ** ist. Betrachten wir daher, wie viele ** gcd-Werte ** es gibt.
Da der Wert von gcd gemäß der Definition von gcd 1 ~ k ist, suchen Sie nach der Sequenz $ A_1, A_2,…, A_n
answerE.py
def make_divisors(n):
divisors=[]
for i in range(1, int(n**0.5)+1):
if n%i==0:
divisors.append(i)
if i!=n//i:
divisors.append(n//i)
divisors.sort()
return divisors
n,k=map(int,input().split())
mod=10**9+7
memo=[pow(k//i,n,mod) for i in range(1,k+1)] #gcd ist 1~Notieren Sie sich, wann es k wird
for i in range(k-1,-1,-1):
x=make_divisors(i+1)
for j in x:
if j!=i+1:
memo[j-1]-=memo[i]
ans=0
for i in range(k):
ans+=(memo[i]*(i+1))
ans%=mod
print(ans)
Ich war so an die Form des Rucksack-DP gewöhnt, dass ich den Zustandsübergangs-DP nicht bemerkte (es ist nicht der offizielle Name, weil ich ihn einfach so nenne). ** Ich habe versucht, es wie ein Rätsel in den dunklen Wolken zu lösen ** und ich habe es nicht verstanden. Probleme wie diese können mit ein wenig Abstraktion überraschend sichtbar sein. Erstens, da die Obergrenze der Zahl, die ausgewählt werden kann, n // 2 ist, gibt es nicht eine Obergrenze für die Zahl, die bis zum ** i-ten (i = 1,2, ..., n) ausgewählt werden kann? Es ist wichtig, die Frage zu haben **. Basierend auf dieser Frage kann daher ** die Anzahl benachbarter Nummern nicht ausgewählt werden **, so dass ersichtlich ist, dass die Nummer, die vom 1. bis zum i-ten ausgewählt werden kann, (i + 1) // 2 oder weniger ist. Darüber hinaus ist die Zahl, die von i + 1 bis n gewählt werden kann, (n-i + 1) // 2 oder weniger, und nur n // 2 wird von 1 bis n ausgewählt, so dass die Zahl, die von 1 bis i gewählt werden kann, ist Erfordert auch die Bedingung, dass n // 2- (n-i + 1) // 2 = (i-1) // 2 oder mehr. Daher wird die Bedingung erhalten, dass ** die Anzahl der bis zum i-ten zu wählenden Zahlen (i-1) // 2 oder mehr (i + 1) // 2 oder weniger ** sein muss. Jetzt, da wir wissen, dass die Anzahl der Nummern, die bis zum i-ten ausgewählt werden können, begrenzt ist, ** die Beziehung zwischen der Anzahl der Nummern, die bis zum i-ten ausgewählt werden können, und der Anzahl, die bis zum i-ten ausgewählt werden kann ** und ** Es erscheint natürlich, auf die Idee zu kommen, die Beziehung zwischen der Anzahl der bis zum i-ten ausgewählten Zahlen und der Anzahl der bis zum i + 1 ** ausgewählten Zahlen zu berücksichtigen.
Abbildung 1
Figur 2
Figur 3
Die obigen Abbildungen 1 bis 3 basieren auf dieser Idee. Zunächst wird in Fig. 1 die Anzahl der Zahlen, die im i-ten ausgewählt werden können, in der Reihenfolge von der ersten geschrieben (Fig. 2 ist in der Reihenfolge von der zweiten). Ich habe versucht, eine DP-Sequenz zu erstellen, die die beiden Zustände so wie sie ist beibehält, aber da sie nicht aus dem Beispielfall passte, habe ich genau hingeschaut und festgestellt, dass nur diese beiden Zustände ** außer wenn zwei Zahlen aufeinander folgen * * Ich konnte nicht. Das heißt, in Fig. 1 bewegt sich der rote Pfeil von 0 nach 1 nach 1, jedoch nicht von 0 nach 1 nach 2. Umgekehrt können Sie für den blauen Pfeil sowohl in 1 → 1 → 1 als auch in 1 → 1 → 2 fortfahren. Gleiches gilt für Abb. 2. Für den roten Pfeil können sowohl 1 → 1 → 1 als auch 1 → 1 → 2 vorgerückt werden, für den gelben Pfeil jedoch nur 0 → 1 → 1, aber 0 → 1 → 2 Ich kann nicht weitermachen. Daher erhöhen Sie in 1 für die zweite 0,1 ** den Zustand um eins ** auf 0,1,1 und die erste 1 ist die zweite, wenn die zweite Zahl nicht ausgewählt ist. 1 sollte der Fall sein, wenn Sie die zweite Nummer wählen. In Fig. 2 ist die dritte 1,2 1,1,2, die erste 1 ist, wenn die dritte Nummer nicht ausgewählt ist, und die zweite 1 ist, wenn die dritte Nummer ausgewählt ist. Du kannst es schaffen. Abbildung 3 fasst das Obige zusammen. Wenn Sie sich Abbildung 3 genauer ansehen, sehen Sie, dass ** der Pfeil auf verschiedene Punkte zeigt, je nachdem, ob der Index gerade oder ungerade ist **. Wenn Sie jedoch zu diesem Zeitpunkt die i-te Nummer nicht auswählen, wird sie als 1 geschrieben, wenn Sie sie mit $ \ pm $ 0 auswählen, und Sie müssen überprüfen, ob → gemäß dieser Notation geschlossen ist. Durch gehorsames Implementieren der obigen Schritte wird es wie folgt. Bitte beachten Sie, dass die Ausgabe unterschiedlich ist, wenn n gerade und ungerade ist.
Um noch einmal zu wiederholen, was Sie bisher denken müssen,
Es wird angenommen, dass es fünf gibt. Persönlich dachte ich, dass (1) schwer zu bemerken ist, aber ** wenn man bedenkt, dass die Begrenzung der Anzahl der Teile bis zum n-ten n // 2 oder weniger beträgt, denke ich, dass es keine Barriere ist, die nicht überschritten werden kann. Ich möchte mich widmen und es sinnlich erfassen.
answerF.py
n=int(input())
a=list(map(int,input().split()))
minf=-10000000000000
x=[[0,0,0] for i in range(n)]
x[0]=[0,0,a[0]]
for i in range(n-1):
if i%2==0:
x[i+1]=[max(x[i][0],x[i][1]),x[i][2],x[i][0]+a[i+1]]
else:
x[i+1]=[max(x[i][1],x[i][2]),x[i][0]+a[i+1],x[i][1]+a[i+1]]
print(max(x[-1][1],x[-1][2]) if n%2==0 else max(x[-1][0],x[-1][1]))
Recommended Posts