Dieser Artikel ist ein Artikel (16. Tag) von Yugen Club Adventskalender 2019. ** Enthält Spoiler zur Lösung des AtCoder-Anfängerwettbewerbs. ** Bitte seien Sie beim Lesen vorsichtig.
Es ist fujioka_math, der im Sommer 27 Mal teilgenommen hat. Ich wollte meinem Leben etwas Spaß machen, also startete ich AtCoder, was die Leute um mich herum taten. Es wurde in ungefähr 5 Monaten hellblau. (Das Bild ist vom 16.12. Das Konto ist fujioka_1115)
Es wurde hellblau, aber ehrlich gesagt bin ich mit dem Algorithmus überhaupt nicht vertraut. Es fühlt sich so an, als hätte ich die Grenze erreicht, ohne das ABC E-Problem zu lösen, indem ich schnell ein Problem gelöst habe, das einfach mit der Kraft der Mathematik gelöst werden kann.
Die C- und D-Probleme von ABC weisen einige Probleme auf, die auch dann gelöst werden können, wenn Sie mit dem Algorithmus nicht vertraut sind. Zum Beispiel so etwas.
import math
a,b,x=[int(s) for s in input().split()]
if x>a*a*b/2:
h=2*(a*a*b-x)/(a*a)
print(math.degrees(math.atan(h/a)))
else:
k=2*x/(a*b)
print(math.degrees(math.atan(b/k)))
Dies ist ein D-Problem, verwendet jedoch keinen Algorithmus. Dieses Mal werden wir Probleme vorstellen, die leicht gelöst werden können, wenn Sie über solche mathematischen Fähigkeiten verfügen. Selbst Clubmitglieder, die noch keine Programmierkenntnisse haben, sollten dies immer mehr versuchen.
ABC101 C - Minimization
N,K=[int(s) for s in input().split()]
print((N+K-3)//(K-1))
Die erforderliche Anzahl von Abschnitten ist $ \ left \ lceil \ dfrac {N-1} {K-1} \ right \ rceil $. Hier wird $ \ left \ lceil \ dfrac nm \ right \ rceil = \ left \ lfloor \ dfrac {n + m-1} n \ right \ rfloor $ verwendet und die Deckenfunktion wird nicht aufgerufen. (Ich habe diese Formel auch aus der Erklärung von ABC gelernt.)
ABC105 C - Base -2 Number
N=int(input())
ls=[]
while True:
ls.append(N%2)
N=-(N//2)
if N==0:
break
print(*reversed(ls),sep="")
Der schwierigste Teil dieses Problems bestand darin, eine Liste von Zahlen wie [1,1,0,1] in umgekehrter Reihenfolge wie 1011 auszugeben und miteinander zu verbinden. Ich habe Ihnen bereits gesagt, dass Sie Listen einfach mit print verbinden und ausgeben können (* ls, sep = ""). Dann habe ich im Detail verloren, als $ N = 0 $.
ABC108 C - Triangular Relationship
N,K=[int(s) for s in input().split()]
if K%2==1:
print((N//K)**3)
else:
print((N//K)**3+((N//(K//2)-N//K)**3))
ABC109 C - Skip
import fractions
N,X=[int(s) for s in input().split()]
ls=[int(s)-X for s in input().split()]
a=0
for e in ls:
a=fractions.gcd(a,e)
print(abs(a))
ABC116 C - Grand Garden
Es ist ersichtlich, dass die Summe der Höhenunterschiede (Absolutwerte) zwischen den benachbarten Blüten und dem Boden an beiden Enden doppelt so oft ist wie zum Gießen erforderlich.
Einfacher, fügen Sie einfach den grünen Teil hinzu und Sie erhalten die Antwort. Dies sollte ausgegeben werden.
N=int(input())
ls=[int(s) for s in input().split()]
ls.append(0)
a=0
for i in range(N):
a+=max([0,ls[i]-ls[i+1]])
print(a)
ABC117 C - Streamline
Ist es Mathe B, da es sich um eine Differenzzahlfolge handelt?
N,M=[int(s) for s in input().split()]
if N>=M:
print(0)
else:
ls=[int(s) for s in input().split()]
ls.sort()
d=[ls[i+1]-ls[i] for i in range(M-1)]
d.sort()
print(sum(d[:M-N]))
Die Antwort ist automatisch 0 für $ N \ ge M $. Das d [: M-N] in der letzten Zeile ist die in der Mitte ausgeschnittene Sequenz d (vor M-N).
ABC118 C - Monsters Battle Royale
import fractions
N=int(input())
ls=[int(s) for s in input().split()]
a=0
for e in ls:
a=fractions.gcd(a,e)
print(a)
ABC123 C - Five Transportations
Wenn Sie nach der Zeit fragen, die erforderlich ist, um N Personen mit dem langsamsten Transportmittel zu befördern, ist diese Zeit + 4 Minuten die Antwort.
import math
N = int(input())
A = int(input())
B = int(input())
C = int(input())
D = int(input())
E = int(input())
X = min([A,B,C,D,E])
t=math.ceil(N/X)
print(t+4)
Oder verwenden Sie $ \ left \ lceil \ dfrac NX \ right \ rceil = \ left \ lfloor \ dfrac {N + X-1} X \ right \ rfloor $
N = int(input())
ls = [int(input()) for i in range(5)]
X = min(ls)
print((N+X-1)//X+4)
ABC126 C - Dice and Coin
import math
N,K=[int(s) for s in input().split()]
a=0
for i in range(N):
a+=2**(-max([0,math.ceil(math.log2(K/(i+1)))]))
print(a/N)
Alternativ kann eine Kombination von for- und while-Anweisungen (Doppelschleife) wie folgt geschrieben werden. In meinem Fall gibt es weniger einfache Fehler bei der Verwendung dieser "intelligenten" Methode.
N,K=[int(s) for s in input().split()]
a=0
for i in range(N):
x=i+1
n=0
while x<K:
n+=1
x*=2
a+=2**(-n)
print(a/N)
ABC129 C - Typical Stairs
b_{n}= \begin{cases}
b_{n-1}+b_{n-2} \quad (n\text{Die Schritte sind nicht gebrochen})\\
0\qquad (n\text{Die Schritte sind gebrochen})
\end{cases}
Hält für $ n \ ge2 $. Die Methode zur Implementierung dieser Wiederholung ist für Anfänger eigentlich schwierig, daher habe ich mich gefragt, ob ich mich in diesem Artikel damit befassen soll, aber ich habe mich damit befasst, weil es sich um zu hohe Mathematik handelt.
MOD=10**9+7
N,M=[int(s) for s in input().split()]
ls=[1 for _ in range(N+1)]
for i in range(M):
ls[int(input())]=0
for n in range(2,N+1):
if ls[n]!=0:
ls[n]=(ls[n-1]+ls[n-2])%MOD
print(ls[N])
ABC130 C - Rectangle Cutting
W,H,x,y = [int(s) for s in input().split()]
if 2*x==W and 2*y==H :
print(W*H/2,1)
else:
print(W*H/2,0)
ABC131 C - Anti-Division
Die Anzahl der Vielfachen von $ x $, die größer oder gleich $ A $ und kleiner oder gleich $ B $ ist, ist "die Anzahl der Vielfachen von $ x $, die kleiner als $ B $ ist" - "das Vielfache von $ x $, das kleiner als $ A-1 $ ist". Es wird durch "Zahl" berechnet.
Übrigens hat das Fraktionsmodul keine Funktion lcm, um das minimale gemeinsame Vielfache zu finden. Daher habe ich versucht, das minimale gemeinsame Vielfache mit $ C \ times D \ div gcd (C, D) $ zu finden. Dies ist der Inhalt des Feldes "Ganzzahl" von Math A.
import fractions
A,B,C,D = [int(s) for s in input().split()]
L=C*D//fractions.gcd(C,D)
print(B-(A-1)
-(B//C)+((A-1)//C)
-(B//D)+((A-1)//D)
+(B//L)-((A-1)//L))
Die vorherigen sind die Schwierigkeiten, die unter Bei Codiererproblemen angezeigt werden, dh die Probleme mit der mittleren Rate der richtigen Antwortenden von 400 (braun) oder mehr und tatsächlich mehr. Es gibt viele Dinge, die leicht gelöst werden können (entspricht Grau).
Jenseits des D-Problems wird das Problem "dieses Teils der Mathematik der High School!" Abnehmen.
Selbst wenn es durch die Kraft der Mathematik vereinfacht wird, erfordert die Implementierung häufig noch Kenntnisse über Algorithmen (die in der Grenze der Ausführungszeit gefangen sind), so dass zu Beginn "einfache" Probleme wie 144D und 139D eingeführt wurden. Die Realität ist, dass es nur wenige gibt.
Lassen Sie uns also den Algorithmus untersuchen.
Es macht Spaß, die Erklärungen unlösbarer Probleme mit sehr anschaulichen Lösungen und interessanten Algorithmen zu sehen (obwohl ich gleich nach dem Lesen deprimiert bin). Wenn Sie dies genießen können, können Sie den Wettbewerb Pro genießen.
Recommended Posts