Wenn Sie genau den gleichen Zug wie TopCoDeer ausführen, beträgt die Punktzahl 0 Punkte, sodass die maximale Punktzahl 0 Punkte oder mehr beträgt. Vorerst habe ich beschlossen, genau den gleichen Zug wie TopCoDeer auszuführen, und die Anzahl der Pars und Goos angegeben. Wenn Sie die Anzahl der Male zählen und so oft von der letzten Goo auf Par wechseln, wie Sie die Bedingungen erfüllen, erhalten Sie die höchste Punktzahl.
s = input()
print(max((s.count('g') * 2 - len(s)) // 2, 0))
Wenn 1 und 2 ausgetauscht werden können und 2 und 3 ausgetauscht werden können, können auch 1 und 3 ausgetauscht werden. Das heißt, wenn sie sich in derselben Union befinden, können sie getauscht werden. Union Find tree. Aber ich habe noch nie gehört, dass es Zeiten gibt, in denen das Sortieren von Blasen nicht möglich ist, also ist es wahrscheinlich in Ordnung. Intuitiv sollten Sie sie in der Reihenfolge vom Ende an sortieren. Also für alle p i </ sub> gleich Überprüfen Sie, ob die Vereinigung ein i enthält und die Summe der Zahlen die Antwort ist.
from sys import setrecursionlimit
def find(parent, i):
t = parent[i]
if t < 0:
return i
t = find(parent, t)
parent[i] = t
return t
def unite(parent, i, j):
i = find(parent, i)
j = find(parent, j)
if i == j:
return
parent[j] += parent[i]
parent[i] = j
setrecursionlimit(10 ** 5)
N, M = map(int, input().split())
p = list(map(int, input().split()))
parent = [-1] * N
for _ in range(M):
x, y = map(int, input().split())
unite(parent, x - 1, y - 1)
result = 0
for i in range(N):
if find(parent, i) == find(parent, p[i] - 1):
result += 1
print(result)
Wenn Sie überprüfen, ob die Mehrheit aller Teilzeichenfolgen dasselbe Zeichen ist, ist dies * O * (* N * 2 </ sup>), sodass TLE unvermeidlich ist. Wenn die Mehrheit dasselbe Zeichen ist, ist es übrigens dasselbe. Das gleiche Zeichen wird mit zwei aufeinanderfolgenden Zeichen oder einem Leerzeichen dazwischen angezeigt. Dies kann sofort erkannt werden, indem tatsächlich ein Zeichen mit derselben Mehrheit erstellt wird. * O * (* N *) kann verwendet werden, um zu überprüfen, ob dies vorhanden ist. Sie können es überprüfen, um es zu lösen.
s = input()
for i in range(len(s) - 1):
if s[i] == s[i + 1]:
print(*[i + 1, i + 2])
exit()
for i in range(len(s) - 2):
if s[i] == s[i + 2]:
print(*[i + 1, i + 3])
exit()
print(*[-1, -1])
Wenn Sie es in naiv schreiben, * O * (* N * 3 </ sup>), ist es * O * (* N * 2 </ sup>), auch wenn es durch die kumulative Summe gelockert wird. Anstatt "die Summe ist ein Vielfaches von M" zu zählen, zählen Sie zuerst "die Summe der durch M geteilten Reste ist 0". Dann ist A </ sub> 1 </ sub>, A. 1 </ sub> + A 2 </ sub>, ..., A 1 </ sub> + A 2 </ sub> ... A N. Zählen Sie die Anzahl von </ sub> geteilt durch M. Wenn t m </ sub> die Anzahl der Vorkommen des Restes m ist, ist die Anzahl zu zählen, wenn l = 1, r = 1..N Ist t <0> </ sub>. Als nächstes sollte l = 2, r = 1..N gezählt werden, aber die Anzahl von A 1 </ sub> geteilt durch M wird von jedem reduziert. Also denke ich für einen Moment, dass t 1 </ sub>% M </ sub>, aber da l = 1 und r = 1 nur A </ sub> 1 </ sub> waren, ist dies Muss weggelassen werden, was t 1 </ sub>% M </ sub> -1 ist, und dieses muss weggelassen werden, selbst wenn nach l = 3 berechnet wird. Nicht. Dann schleife zu l = N, um die Antwort zu erhalten.
N, M = map(int, input().split())
A = list(map(int, input().split()))
t = {}
c = 0
for a in A:
c += a
c %= M
if c in t:
t[c] += 1
else:
t[c] = 1
result = 0
if 0 in t:
result += t[0]
c = 0
for a in A:
c += a
c %= M
t[c] -= 1
result += t[c]
print(result)
Da wir nach dem kleinsten in lexikalischer Reihenfolge suchen, möchten wir '(' so weit wie möglich nach links und ')' so weit wie möglich nach rechts einfügen. Also ist '(' ganz links und ')' Angenommen, Sie fügen nur am rechten Ende ein. Ich frage mich, wie viele danach eingefügt werden. Da die Länge der Zeichenfolge jedoch höchstens 100 beträgt, wird sie nicht zu TLE, selbst wenn sie tatsächlich transformiert wird. Während Sie die gepaarten Klammern löschen, Fügen Sie einfach am linken oder rechten Rand Klammern hinzu, bis die Zeichenfolge leer ist.
N = int(input())
S = input()
result = S
while True:
while True:
t = S.replace('()', '')
if t == S:
break
S = t
if S == '':
break
elif S[0] == ')':
S = '(' + S
result = '(' + result
elif S[0] == '(':
S = S + ')'
result = result + ')'
print(result)
Die maximale Punktzahl besteht darin, den kürzesten Weg von (1, 1) nach (H, W) in der Suche nach Breitenpriorität zu finden und alle weißen Zellen, die den kürzesten Weg nicht weitergegeben haben, in Schwarz zu ändern. Die Antwort ist die Anzahl der weißen Zellen. - Die Anzahl der Quadrate auf der kürzesten Route.
H, W = map(int, input().split())
s = [input() for _ in range(H)]
dp = [[2501] * W for _ in range(H)]
dp[0][0] = 1
q = [(0, 0)]
while q:
nq = []
while q:
y, x = q.pop()
t = dp[y][x] + 1
if y < H - 1:
if s[y + 1][x] == '.' and dp[y + 1][x] > t:
dp[y + 1][x] = t
nq.append((y + 1, x))
if y > 0:
if s[y - 1][x] == '.' and dp[y - 1][x] > t:
dp[y - 1][x] = t
nq.append((y - 1, x))
if x < W - 1:
if s[y][x + 1] == '.' and dp[y][x + 1] > t:
dp[y][x + 1] = t
nq.append((y, x + 1))
if x > 0:
if s[y][x - 1] == '.' and dp[y][x - 1] > t:
dp[y][x - 1] = t
nq.append((y, x - 1))
q = nq
if dp[H - 1][W - 1] == 2501:
print(-1)
else:
print(sum(s[y].count('.') for y in range(H)) - dp[H - 1][W - 1])
Recommended Posts