Ich habe versucht, die Algorithmen aufzulisten, die bei Wettkampfprofis verwendet werden können.
https://atcoder.jp/contests/abc084/tasks/abc084_d
from itertools import accumulate
import math
m = 10**5
L = [x for x in range(2,m+1)]
#Extrahieren Sie Primzahlen mit einem Eratostenes-Sieb
for y in range(2, int(math.sqrt(m)+1)):
L = [z for z in L if(z == y or z % y != 0)]
#N+1/Extrahieren Sie, was 2 auch eine Primzahl ist
P = []
for w in L:
if (w+1)/2 in L:
P.append(w)
#Erstellt für die kumulative Summe
G = [0] * (m+1)
for i in P:
G[i+1] = 1
#Kumulative Summe
Q = list(accumulate(G))
n = int(input())
for _ in range(n):
s, t = map(int, input().split())
print(Q[t+1]-Q[s])
'''
Die folgenden Primzahlen sind langsam.
Verwenden Sie das Eratostenes-Sieb wie oben
def isPrime(n):
if n == 1:
return False
if n % 2 == 0:
return False
for i in range(3, int(math.sqrt(n)+1), 2):
if n % i == 0:
return False
return True
'''
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DPL_2_A
v, e = map(int, input().split())
inf = 10**7
edges = [[inf]*v for _ in range(v)]
for i in range(e):
s, t, d = map(int, input().split())
edges[s][t] = d
#Dp sind die minimalen Kosten in S, wenn die Reihenfolge unter der Bedingung optimiert wird, dass v die letzte für die Teilmenge S der gesamten Menge ist.
dp = [[inf]*v for _ in range(2**v)]
dp[0][0] = 0
#Set (Binärzahl, die angibt, ob besucht oder nicht)
for x in range(2**v):
#Zuletzt besuchter Knoten
for y in range(v):
#Andere Knoten als die zuletzt besuchten
for z in range(v):
#1.Ob Sie bereits 2 besucht haben.Ist es nicht der zuletzt besuchte Knoten 3?.Sind y und z überhaupt verbunden?
if ((x >> y) & 1) and y != z and edges[z][y] < 10**6:
dp[x][y] = min(dp[x][y], dp[x^(1<<y)][z]+edges[z][y])
if dp[-1][0] > 10**6:
print(-1)
else:
print(dp[-1][0])
Ich habe auf [hier] verwiesen (https://qiita.com/takayg1/items/92fb138683ac72b47d86). Auch die Erklärung zu Bellman Ford war im Artikel hier leicht zu verstehen.
#v:Peak e:Seite
v, e = map(int, input().split())
#Liste zum Speichern von Kanten (weder benachbarte Matrix noch benachbarte Liste)
edges = []
for _ in range(e):
s, t, w = map(int, input().split())
edges.append([s, t, w])
# edges.append([t, s, w])
#Weniger als,Bellmanford
def bellman_ford(start,goal,edges,v):
#Entfernungsinitialisierung
distance = [float("inf")] * v
distance[start] = 0
for i in range(v):
#Ob die Entfernung aktualisiert wurde
updated = False
for s, t, w in edges:
if distance[t] > distance[s] + w:
distance[t] = distance[s] + w
updated = True
#Der Nachweis, dass die kürzeste Route gefunden wird, wenn die Entfernung nicht mehr aktualisiert wird
if not updated:
break
#Selbst wenn es v-mal aktualisiert wird, endet die Aktualisierung der kürzesten Route nicht → Es liegt eine negative Schließung vor
if i == v - 1:
return -1
return distance[goal]
for i in range(v):
print(bellman_ford(0, i, edges, v))
Der Artikel Hier ist leicht zu verstehen Ich werde es bald implementieren ...
Recommended Posts