Ich möchte APG4b mit Python lösen (Kapitel 2)

Einführung

Aufgrund verschiedener Umstände werde ich versuchen, das von Atcoder veröffentlichte APG4b-Problem mit Python zu lösen. In Kapitel 1 habe ich versucht, das zu lösen, was Freiwillige veröffentlicht haben. Ab Kapitel 2 werde ich versuchen, das EX-Problem zu lösen, nachdem ich es selbst gelesen habe. Ich bin ein Anfänger, der Python nur etwa ein halbes Jahr lang an der Universität berührt hat. Ich würde mich freuen, wenn Sie mir beibringen könnten, ob es etwas gibt, das verkürzt (oder effizienter) werden kann. Ziel ist es, einen Code zu erstellen, der "Probleme effizient löst". Wenn aus zeitlichen Gründen AC im EX-Test angezeigt wird, lese ich die Modellantwort nur kurz und schreibe sie nicht neu.

2.01. So schreiben Sie eine Schleife und einen Bereich für die Anweisung

** Wie schreibe ich eine Schleife ** Beispiel

a = int(input())
data = list(map(int,input().split()))

answer = 0

for i in range(len(data)):
  if data[i] == a:
    answer += 1
  
print(answer)

** Bereich für Aussage ** Beispiel

a = [1,3,2,5]

for i in a:
  print(i)

In der Hauptfamilie gab es eine Aussage, dass "for-Anweisungen auch mit einem Containertyp verwendet werden können", aber ich habe mich gefragt, was ein Containertyp ist ...? Ich frage mich, ob der Typ, der jedes Element wie Liste und Diktat zusammen speichert, der Containertyp ist ...? Ist es so etwas wie das Aufrufen von int oder str eines Datentyps? In diesem Sinne werde ich es hier lassen.

** Detaillierte Geschichte ** Über die ordnungsgemäße Verwendung von Schleifen

--Wenn Sie alle Elemente des Arrays verarbeiten möchten → Bereich für Anweisung -Wenn eine bestimmte Anzahl von Malen wiederholt wiederholt wird, die nicht den Bedingungen von ↑ → für Anweisung entsprechen

Das erste, was ich dachte, war "Wann benutzt du den While-Satz ...?" Als ich es an der Universität verwendet habe, habe ich eine Wheel-Anweisung mit einer booleschen Variablen als Flag verwendet. Wird diese Methode tatsächlich verwendet? Ich wunderte mich und flatterte.

** Fälle, in denen die While-Anweisung geeignet ist **

n = int(input())

count = 0

while n > 0:
  if n % 2 > 0:
    break
  n /= 2
  count+=1

print(count)

Nützlich "nur solange bestimmte Elemente die Bedingungen erfüllen". Wenn ich darüber nachdachte, benutzte ich es an der Universität so (behandelt wie eine Flagge).

EX16 - Den gleichen benachbarten Wert finden

data = list(map(int,input().split()))

keep=0
flag=False

for i in data:
  if keep==i:
    flag=True
    break
  keep=i

if flag==True:
  print("YES")
else:
  print("NO")

2.02. Mehrere Schleifen

** Mehrfachschleife ** Schleife innerhalb der Schleife. Ich habe gehört, dass dies kein sehr komplimentierter Weg ist, aber es tut mir leid, dass ich mich nicht an die Quelle erinnern kann. Ich hatte die Möglichkeit, den Code zu sehen, der zuvor von anderen Personen geschrieben wurde, aber wenn er mehrmals wiederholt wurde, dauerte es manchmal lange, bis ich "Was ist diese Absicht ...?" Hauptsächlich wegen meiner mangelnden Fähigkeiten! Hallo! !!

for i in range(3):
  for j in range(3):
    print("i:{},j:{}".format(i,j))

** Beispiel "Bestimmen Sie, ob zwei Arrays A und B von 3 Elementen dasselbe Element enthalten" **

A = list(map(int,input().split()))
B = list(map(int,input().split()))

answer = False

for i in range(3):
  for j in range(3):
    if A[i]==B[j]:
      answer = True

if answer == True:
  print("YES")
else:
  print("NO")

Sicherlich konnten Sie doppelte Array-Elemente ohne mehrere Schleifen sehen. Aus lesbarer Sicht schrieb ich es mit Hirntod und dachte, es wäre leichter zu verstehen.

** Mehrfachschleifenunterbrechung / Fortsetzung **

Das ist alles dazu. In der Mehrfachschleife des Beispiels bedeutet dies "Wenn Sie bei" für j ~ "brechen / fortfahren, gehen Sie zu" für i ~ ". Es ist ein wenig schwer zu verstehen, aber es ist schwer zu verstehen. In Bezug auf diesen Teil gibt es ein leicht verständliches Beispiel in der Hauptfamilie.

** Indexfehler ** Wenn Sie diesbezüglich denken "Es ist wichtig, den Variablennamen zu bestimmen ...", denke ich, dass dies im Einklang mit der Absicht des Erstellers steht. "Ich" und "j" sind nicht leicht zu verstehen, nicht wahr? Ich benutze es jedoch immer, wenn ich mich nach Sätzen umdrehe. Übrigens, in meinem ersten Jahr habe ich das Gefühl, an der Universität gelernt zu haben, "Einzelbuchstabenvariablen zu stoppen". Darüber hinaus scheinen verschiedene Fragen eingereicht worden zu sein. Entschuldigen sie Herr Lehrer ...

EX17 - Einkaufen in einem Obstgeschäft

N,S = map(int,input().split())

A = list(map(int,input().split()))
P = list(map(int,input().split()))

count = 0
total = 0

for ap_price in A:
  for pin_price in P:
    total = ap_price + pin_price
    if total == S:
      count+=1
    else:
      total = 0

print(count)

2.03. Mehrdimensionales Array

** Ein zweidimensionales Array ** Es tut mir leid, ich kenne C ++ überhaupt nicht. Als ich das ursprüngliche Haus las, konnte ich nur denken: "Warum sollte ich so viel Code schreiben, indem ich nur ein Array erstelle?" Als ich vor langer Zeit die Sprache C (nicht ++) berührte, kam das Wort "Speicher zuweisen" heraus, und ich denke, dass ich verschiedene Schritte unternehme, um die Kapazität des Arrays zu sichern. Nein, ich verstehe nicht wirklich. Gehen Sie zurück zu Python.

Beispiel

data = []
for i in range(3):
  data.append(list(map(int,input().split())))

count = 0
for i in range(3):
  for j in range(4):
    if data[i][j] == 0:
      count+=1

print(count)

** Erklärung ** Im obigen Beispiel ist dies der Teil.

data = []
for i in range(3):
  data.append(list(map(int,input().split())))

Hängen Sie einfach die in Liste konvertierte Standardeingabezeile an die zuvor deklarierten Variablendaten des Listentyps an. Ist es in Ordnung, dies zu erklären?

Zugriff In Bezug auf die Daten des oben erstellten zweidimensionalen Arrays

data[Welche Nummer von oben][Nummer von links]

** Lerngröße ** Da das in der Kopffamilie gezeigte "Lernen der Größe" (vertikale Länge, horizontale Länge) war, Ich werde schreiben, wie man numpy importiert und überprüft. Wenn es leicht zu verstehen ist, können Sie es nur verstehen ...

import numpy as np

#Erstellen Sie ein zweidimensionales Array
data = []
for i in range(3):
  data.append(list(map(int,input().split())))

#Machen Sie es zu einem NumPy-Array.gestalten
data = np.array(data)
print(data.shape)

** Konzept des 2D-Arrays ** Die Oberfamilie ist sehr leicht zu verstehen. Es heißt jedoch auch, dass es in Python nicht notwendig ist ... Ich habe keine Lust dazu, aber es ist ein Wissen, das in der ersten Hälfte des zweiten Jahres einer bestimmten Universität verwendet werden muss, also ist es besser, es zu lesen. Eines Tages hörte ich von meinen Senioren: "Wenn Sie verschiedene Sprachen berühren, können Sie die Sprache verstehen, die Sie zum ersten Mal in der Atmosphäre berühren." Ist das für Python nicht notwendig? Es ist wichtig, dass Sie richtig lesen, was Sie als Wissen betrachten und eines Tages von einem nützlichen Tag träumen. Es ist wichtig! !! !! !! !! !! !!

** Mehrdimensionales Array **

Beispiel Es tut mir leid, dass ich nicht umschreiben konnte ... </ font> Die Eingabe dieses Problems erfolgt in mehreren 3 × 3-Format-Problemen, aber die leere Zeile zwischen den Problemen ist unweigerlich in dem mehrdimensionalen Array enthalten, und die letzte Zeile kann nicht gelesen werden. Es ist voll ... Aus Gewohnheit stolpere ich an solchen Orten und verbringe unendlich viel Zeit. Wenn ich also ruhig bin, fange ich von vorne an. Ich meine, für wen entschuldigen Sie sich?

seitdem Ich habe das oben genannte Problem nicht gelöst, daher werde ich es später tun.

EX18 - Spielturnier

n,m = map(int,input().split())

lists = []
for i in range(m):
  lists.append(list(map(int,input().split())))
  
result = []
results = []
for i in range(n):
  for j in range(n):
    result.append("-")
  results.append(result)
  result = []
  
for i in lists:
  win = i[0]
  lose = i[1]
  results[win-1][lose-1] = "o"
  results[lose-1][win-1] = "x"

for i in results:
  j=" ".join(i)
  print(j)
    

Das ist absolut schlechtes Schreiben. Wie auch immer, ich habe es improvisiert geschrieben, um die Klimaanlage abzureißen. Wir werden es zu einem späteren Zeitpunkt zusammen mit den obigen Übungen beheben.

Siehe 2.04.

Referenz

Verweisen Sie auf eine andere Variable aus einer Variablen. Kann das mit Python gemacht werden? Nach einer kurzen Suche fand ich die Konzepte "unveränderlich" und "veränderlich". "Unveränderlich" bezieht sich auf Zeichenfolgen, Zahlen usw., und Objekte, die zu diesem Konzept gehören, können die Zahlen einer Variablen nicht wie die ursprüngliche Familie in eine andere ändern. Im Gegenteil, Objekte wie Wörterbücher und Listen, die zu "veränderlich" gehören, können wie die Kopffamilie von einer Variablen in eine andere umgeschrieben werden. Ja wirklich.

a = 3
b = a
#Die Nummer 3 von a wird ausgegeben
print(b)

b = 4
#Bei der Kopffamilie wird der numerische Wert von a ersetzt und 4 ausgegeben.
#Da das numerische Objekt jedoch unveränderlich ist, wird 3 ersatzlos ausgegeben.
print(a)


a_list=[1,2,3]
b = a_list

b[0] = 4
#Wenn es die Hauptstraße wird, a_Das 0. Element der Liste wurde neu geschrieben[4,2,3]werden
#Das Listenobjekt ist veränderbar. Ersetzen Sie es daher[4,2,3]Wird ausgegeben
print(a_list)

Gab es einen solchen Mechanismus? Ich wusste es nicht…… Ich habe mich gefragt, ob alle Objekte in C ++ veränderbar sind, aber als ich vor langer Zeit C (nicht ++) berührt habe, verwaltet die Sprache C Variablen im Speicher. Ich habe das Gefühl, die Geschichte gehört zu haben. Nein, ich habe damals zur gleichen Zeit Haskell studiert ... Es tut mir leid, dass ich mich keinen Moment erinnern kann und mein Gedächtnis trübe ist, also gehe ich zurück zu Python.

** Danach ** Es ist einfacher zu verstehen, wenn Sie das Original lesen (und es scheint sich von Python zu unterscheiden). Aber ist der Mechanismus hier der gleiche wie bei Python und C ++? Python ist eine Interpretersprache und C ++ ist eine Kompilierungssprache, nicht wahr? Ich weiß nur, ob ich zur Laufzeit kompilieren soll oder nicht, aber der Unterschied zwischen den beiden besteht darin, dass das grundlegende Verhalten das gleiche ist, nur die Ausführungsmethode ist unterschiedlich ...? Ich werde später selbst weiter nachforschen. Ich weiß es nicht.

EX19-Neunundneunzig Punkte

A = []
for i in range(9):
  line = list(map(int,input().split()))
  A.append(line)
  
correct_count = 0
wrong_count = 0

def saiten(A,correct_count,wrong_count):
  for i in range(9):
    for j in range(9):
      if A[i][j] == (i+1)*(j+1):
        correct_count+=1
      else:
        wrong_count+=1
        A[i][j]=(i+1)*(j+1)
  return A,correct_count,wrong_count

A,correct_count,wrong_count = saiten(A,correct_count,wrong_count)

for i in range(9):
  line =[str(a) for a in A[i]]
  line=' '.join(line)
  print(line)
  
print(correct_count)

print(wrong_count)
    

Da "korrekt_count" und "false_count", die die Anzahl der richtigen und falschen Antworten angeben, unveränderliche Objekte sind, können sie nicht in der Funktion "saiten ()" ersetzt werden, die die Bewertung durchführt. Also gebe ich das Ergebnis mit return zurück. Da "A" in dem zweidimensionalen Array, in dem das Berechnungsergebnis gespeichert ist, ein veränderbares Objekt ist, kann es in der Funktion ersetzt werden. Also habe ich es nicht zurückgegeben.

Ich habe Wörter verwendet, die unveränderlich, veränderlich und andere Fachbegriffe zu sein scheinen, aber wenn all dies falsch ist, wäre es ziemlich lächerlich. Es scheint, dass Sie verpönt werden, wenn Sie die Bedeutung von "Waroshi" in alten Texten als "sehr interessant" missverstehen und sie häufig vor einem Japanischlehrer verwenden. Mach es einmal in deinem Leben.

2.05 Rekursive Funktion

  • Das Aufrufen derselben Funktion innerhalb einer Funktion wird als "rekursiver Aufruf" bezeichnet.
  • Eine Funktion, die eine Wiederholung ausführt, wird als "rekursive Funktion" bezeichnet.

Ich habe das in meinem ersten Jahr gelernt, aber ich erinnere mich nicht daran, seitdem eine Wiederholung verwendet zu haben. Es scheint, dass dies eine schwierige Kategorie in der Oberfamilie ist, und es wurde geschrieben: "Wenn Sie nach dem Lesen der Erklärung nicht verstehen, können Sie sie überspringen." e? Verwenden Sie diese nicht oft?

Ich erinnere mich nur ein wenig daran, also schreibe ich den Code für die Übung und erinnere mich daran.

def sum(n):
  if n == 0:
    return 0
  
  s = sum(n - 1)
  return s + n

print(sum(2)) # 0 + 1 + 2 = 3
print(sum(3)) # 0 + 1 + 2 + 3 = 6
print(sum(10)) # 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 55

Ich weiß nicht, wie ich es in Worte fassen soll.

"sum (n)" soll "return 0" zurückgeben, dh 0, wenn "wenn n == 0". Die rekursive Operation wird mit der folgenden "s = Summe (n -1)" ausgeführt. Die durch Subtrahieren von 1 von n erhaltene Zahl wird in den rekursiven Aufruf verschoben, und wenn n 0 wird, wird der rekursive Aufruf beendet und die Berechnung durchgeführt ...?

Ich verstehe das Gefühl dieser Funktion, aber es ist schwierig, sie zu schreiben. Lassen Sie uns eine Kugel machen.

** Für sum (2) **

[1. Schleife] ** n = 2 **, daher ist die if-Anweisung ein Pfad. "s = sum (n -1)" wird zu "s = sum (1)". Rekursion hier.    ⬇︎ [2. Schleife] ** n = 1 **, wenn also Minuten vergehen. "s = sum (n -1)" wird zu "s = sum (0)". Rekursion hier.    ⬇︎ [Dritte Schleife] Gehen Sie zu if-Anweisung mit ** n = 0 **. 0 kehrt bei Rückkehr zurück.    ⬇︎ [2. Schleife] s = sum (n -1) ist der in der 3. Schleife zurückgegebene Wert ** s = 0 **. Da ** n = 1 ** ist, wird "return s + n" ausgeführt und 1 wird zurückgegeben.    ⬇︎ [1. Schleife] s = sum (n -1) ist der in der 2. Schleife zurückgegebene Wert ** s = 1 **. Da ** n = 2 **, geben Sie return s + n und 3 zurück. das Ende.

Das ist es. Das ist mein Gefühl. Nein, das ist zum ersten Mal schwer zu sehen. Es scheint Spaß zu machen, solche Probleme zu lösen, aber ist es in Ordnung, es zu lesen, wenn es in tatsächlichen Schlachten verwendet wird? Auf meiner Ebene ist es schwierig, wenn ich es nicht aufführe, aber wenn Sie eine erfahrene Person sind, können Sie es auf einen Blick erkennen? Ich muss mich widmen ...

** Danach ** Lesen wir die Hauptfamilie. Okay (nicht). Ich war ein bisschen schwierig. Inhaltlich habe ich jedoch in der ersten Hälfte des zweiten Jahres ein wenig in der Algorithmusklasse gearbeitet. Um ehrlich zu sein, ist es vielleicht besser, den Inhalt der Hauptfamilie als Lehrbuch zu lesen, als als tatsächlichen Kampf. Es ist vielleicht besser, in einer Atmosphäre wie "Es gibt so etwas" zu lesen. Aber wenn ich es tun würde, würde ich nur Aussagen und Flaggen aufstellen ... Ich kann überhaupt nicht daran denken.

EX20 - Anzahl der Berichte

n = int(input())
read_line = list(map(int,input().split()))

p = []
for i in range(n):
  if i == 0:
    p.append(-1)
    continue
  p.append(read_line[i-1])
  
key = list(dict.fromkeys(p))
children={}

for i in key:
  value_list = []
  for j in range(n):
    if i == p[j]:
      value_list.append(j)
  children[i]=[]
  for k in value_list:
    children[i].append(k)

def count_report_num(chlidren,x):
  
  if children.get(x)==None:
    return 1
  
  sum = 0
  for i in children[x]:
    sum += count_report_num(chlidren,i)
  sum+=1
  return sum
    
    
for i in range(n):
  print(count_report_num(children,i))

Ich konnte das Verhalten der Wiederholung nicht verstehen, also bezog ich mich auf die Modellantwort ... Es scheint auch, dass Sie dem Array mit c ++ untergeordnete Elemente hinzufügen können, aber ich wusste nicht, wie es in Python gemacht werden soll, also habe ich beschlossen, es mit dem Typ dict auszuführen. Es war schwer.

2.06. Berechnung

  • Über "** Bestellmethode **", die den Rechenaufwand des Programms schätzt

Lesen Sie die Erklärung der Oberfamilie sorgfältig durch. Es war sehr leicht zu verstehen. Dies ist auch der Inhalt, der in der ersten Hälfte des zweiten Jahres einer bestimmten Universität erstellt werden muss, daher dachte ich, dass dies nützlich wäre.

  • für Satz N, wenn er einfach ist, N ^ 2, wenn er doppelt ist --Log kann verwendet werden im Fall von "Wie oft kann eine bestimmte Zahl N durch 2 geteilt werden?"
  • Geschwindigkeit (langsamste Ordnung) [O (1) <O (logN) <O (N) <O (NlogN) <O (N ^ 2) <O (2 ^ N)]

EX21 - Schätzung des Berechnungsbetrags

Ich habe eine Antwort darauf und muss sie nicht umschreiben (nur auskommentieren), also frage ich mich, ob ich sie nicht schreiben muss.

Recommended Posts

Ich möchte APG4b mit Python lösen (Kapitel 2)
Ich möchte APG4b mit Python lösen (nur 4.01 und 4.04 in Kapitel 4)
Ich möchte mit Python debuggen
Ich wollte ABC160 mit Python lösen
Ich möchte Protokolle mit Python analysieren
Ich möchte mit aws mit Python spielen
Ich wollte ABC172 mit Python lösen
Ich möchte MATLAB feval mit Python verwenden
Ich möchte ein Spiel mit Python machen
Ich möchte Temporäres Verzeichnis mit Python2 verwenden
Ich möchte mit Python in eine Datei schreiben
Ich möchte SUDOKU lösen
Ich möchte die Optimierung mit Python und CPlex behandeln
Ich habe versucht, Soma Cube mit Python zu lösen
Ich möchte mit Python-Datenklasse nach hinten erben
Ich möchte mit einem Roboter in Python arbeiten.
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Ich möchte einen Quantencomputer mit Python betreiben
Ich habe versucht, AOJs Integer-Theorie mit Python zu lösen
Ich möchte ○○ mit Pandas machen
Ich möchte Daten mit Python analysieren können (Teil 3)
Ich möchte eine andere Version von Python mit pyvenv angeben
Ich wollte den Panasonic Programming Contest 2020 mit Python lösen
Ich möchte Daten mit Python analysieren können (Teil 4)
Ich möchte Daten mit Python analysieren können (Teil 2)
Ich möchte automatisch an Online-Kursen mit Python + Selen teilnehmen!
[Python] Ich möchte die Option -h mit argparse verwenden
Ich möchte Objekte mit OpenCV erkennen
Ich möchte einen Blog mit Jupyter Notebook schreiben
Ich möchte ein Glas aus Python verwenden
Ich möchte eine Python-Umgebung erstellen
Ich möchte eine Pip-Installation mit PythonAnywhere durchführen
Ich wollte ABC159 mit Python lösen
Ich habe versucht, TSP mit QAOA zu lösen
Ich habe versucht, die Anfängerausgabe des Ameisenbuchs mit Python zu lösen
Ich möchte einen Platzhalter verwenden, den ich mit Python entfernen möchte
Ich möchte das Wetter mit LINE bot feat.Heroku + Python wissen
Ich möchte den Anfang des nächsten Monats mit Python ausgeben
Ich las "Das Lernen mit Python von der Einführung bis zur Praxis stärken", Kapitel 1
Ich wollte das ABC164 A ~ D-Problem mit Python lösen
[Einführung] Ich möchte mit Python einen Mastodon-Bot erstellen! 【Anfänger】
Ich las "Das Lernen mit Python von der Einführung bis zur Praxis stärken", Kapitel 2
Ich möchte Dunnetts Test in Python machen
Löse AtCoder 167 mit Python
Ich möchte es mit Python Lambda Django machen, aber ich werde aufhören
Ich möchte Twitter mit Python twittern, bin aber süchtig danach
Ich möchte mich mit Schlüsselwortargumenten von Python merken
Ich möchte mit Python ein Fenster erstellen
Ich möchte mit Python eine E-Mail von Google Mail senden.
Wie man offline in Echtzeit schreibt Ich habe versucht, E11 mit Python zu lösen
Versuchen Sie, das Mensch-Maschine-Diagramm mit Python zu lösen
[Python] Ich möchte 7DaysToDie von Discord aus verwalten! 1/3
Ich möchte datetime.datetime.now () auch mit pytest verspotten!
Ich möchte mehrere Bilder mit matplotlib anzeigen.
Ich möchte 100 Datenwissenschaften mit Colaboratory schlagen
Ich wollte Python 3.4.3 mit Homebrew + pyenv installieren
Ich möchte OREMO mit setParam sein!
Ich habe versucht, CloudWatch-Daten mit Python abzurufen