[PYTHON] AtCoder Ich kenne kein Tagebuch_4 ABC081B, 087B, 083B (von ABS)

Einführung

[Was tun als nächstes nach der Registrierung bei AtCoder? Wenn Sie so viel lösen, können Sie genug kämpfen! Frühere Fragen 10 Fragen ~](https://qiita.com/drken/items/fd4e5e3630d0f5859067#5-%E9%81%8E%E5%8E%BB%E5%95%8F%E7%B2%BE%E9 % 81% B8-10-% E5% 95% 8F) Da es während der Jahresend- und Neujahrsferien eine Weile keinen Wettbewerb gab, habe ich das in diesem Artikel beschriebene Problem der AtCoder-Anfängerauswahl ausprobiert. Ich habe das Problem B geleckt, aber es war sehr schwierig. Nun, ich hatte das Gefühl, ich könnte kämpfen, wenn ich so viel lösen würde. Außerdem habe ich einen Artikel geschrieben, in dem ich dachte, dass etwas nicht stimmt, aber ich habe ihn behoben, weil ich Tippfehler mit großer Dynamik gemacht habe. Ich werde nichts sagen, weil es so peinlich ist, aber wenn jemand es bemerkt hat, bin ich ein Anfänger, also schau es dir bitte mit warmen Augen an. Es tut mir Leid.

ABC081B - Shift only N positive ganze Zahlen A 1 </ sub>, ..., A N </ sub> werden an die Tafel geschrieben. Sunuke kann Folgendes tun, wenn alle an die Tafel geschriebenen Ganzzahlen gerade sind.

Bitte fragen Sie, wie oft Sie die Operation maximal ausführen können.

Gedanken

(1) Ich frage mich, ob es keine andere Wahl gibt, als alles zu teilen ... Ich frage mich, ob es TLE wird ... ② Wie auch immer, lassen Sie uns in aufsteigender Reihenfolge anordnen, um den Rechenaufwand zu reduzieren ③ Teilen wir die Liste durch die Potenz 2, ohne sie zu ändern. Je nach Problem kann es in Kommas und Interpunktion unterteilt werden.

ich schrieb es

n = input()
a = list(map(int, input().split()))
a.sort()
i = 0
#Loop vorerst
while i <= a[0]:
  for j in a:
    #Wenn es nicht bricht, verlassen Sie die innere Schleife
    if j % (2**(i+1)) != 0:
      print(i)
      break
  #Wenn alles in der Liste kaputt ist, als nächstes
  else:
    i += 1
    #Ignoriere die Pause von ↓!
    continue
  #Verlassen Sie die äußere Schleife nach der inneren Schleife
  break

Es ist nur dieser Code, aber ich habe ein paar Stunden gebraucht, um hierher zu kommen. Es war sehr schwierig, die Operation des Brechens beider Schleifen zu realisieren, wenn eine unzerbrechliche Zahl kam. Die Ausführungszeit war unerwartet kurz. Ich wusste nicht, dass ich den Einzug von sonst verschieben könnte ... Ich habe nicht nein gesagt, also ist es gut. Bei i <= a [0] habe ich beschlossen, es irgendwann wie beim letzten Mal zu brechen und auf [0] zu setzen, aber ich denke, es gibt einen besseren Weg ...

Antwort des starken Mannes (Tsuyobito)

――Ich verstehe die Bedeutung überhaupt nicht

Es tut mir leid, dass ich nicht studiert habe, aber ich kannte die Antwort für die Gruppe mit dem kürzesten Code überhaupt nicht. Es gibt noch viele Funktionen, die ich nicht kenne. Der Hauptpunkt dieses Tagebuchs ist, dass ich Code schreiben möchte, den ich auf der aktuellen Ebene nicht erreichen konnte. Deshalb habe ich hier übersprungen und nach einer Antwort mit einer ähnlichen Struktur wie ich gesucht. Ich könnte es eines Tages nachschlagen.

Es gab so einen Weg. Das war's……. Ich habe die Funktion all nicht so oft verwendet, daher konnte ich überhaupt nicht daran denken. Außerdem kannte ich die Listeneinschlussnotation, aber ich bin nicht gut darin. Ich werde es richtig überprüfen. Es war ein sehr, sehr lernendes Problem. Nur für ABS ausgewählt .... Ich habe auch den Artikel zur linearen Suche gelesen, der im Originalartikel enthalten ist.

ABC087B - Coins Sie haben A 500-Yen-Bälle, B 100-Yen-Bälle und C 50-Yen-Bälle. Wie viele Möglichkeiten gibt es, einige dieser Münzen auszuwählen und den Gesamtbetrag auf nur X Yen zu bringen? Sie können nicht zwischen Münzen des gleichen Typs unterscheiden. Die beiden Möglichkeiten zur Auswahl von Münzen werden unterschieden, wenn die Anzahl der ausgewählten Münzen für einen bestimmten Münztyp unterschiedlich ist.

Gedanken

① Ist es zu kompliziert, den Zielbetrag zu zerlegen? ② Dann scheint es besser, alle mit den Münzen zu treffen, die Sie haben

ich schrieb es

a = int(input())
b = int(input())
c = int(input())
x = int(input())
ans = 0
#Kombination Round-Robin
for i in range(a+1):
  for j in range(b+1): 
    for k in range(c+1):
      total = (i * 500)+(j * 100)+(k * 50)
      if total == x:
        ans += 1
        break
print(ans)


Es dauerte ungefähr eine Stunde, um dies auch zu schreiben. Rückblickend ist es so einfach zu erklären ... Es ist eine Mehrfachschleife, aber sie hat eine einfache Struktur. Das liegt daran, dass ich nur dumm war, aber ich werde mein Bestes tun, um von nun an nicht mehr dumm zu sein, also ist es okay. Antwort des starken Mannes (Tsuyobito)

Es war ungefähr das gleiche. Yay! Nun, es ist eine einfache Sache.

ABC083B - Some Sums Suchen Sie die Summe der ganzen Zahlen zwischen 1 und N, die eine Summe jeder Ziffer in Dezimalschreibweise A oder mehr und B oder weniger haben. Zwang

Gedanken

① Wenn es fast vierstellig ist, ist es nicht so groß, so dass Sie anscheinend eine Rundreise machen können ② Ich frage mich, ob ich bei jeder Ziffer wie zuvor eine Schleife ausführen kann ③ Schleifen Sie nicht mit unnötigen Ziffern, um den Rechenaufwand nicht zu erhöhen Ich habe es einfach gemacht! Ich dachte, ich wäre in guter Verfassung. Ich bin später etwas einsam.

ich schrieb es

n, a, b = map(int, input().split())
ans = 0
#Schleifen Sie nicht in Zehntausenden, abhängig vom Wert von n
ir = 1 if n < 1000 else 10
jr = 1 if n < 100 else 10
kr = 1 if n < 10 else 10
#Kombination Round-Robin
for i in range(ir):
  for j in range(jr):
    for k in range(kr):
      for l in range(10):
        #Summe der Ziffern
        s = i + j + k + l
        if s >= a and s <= b:
          #Gesamtpreis
          t = 1000 * i + 100 * j + 10 * k + l 
          if t <= n:
            ans += t
print(ans)

WA. Da es nur zwei Fälle gab, dachte ich, dass eine Ausnahme übersehen wurde, und bestätigte sie ordnungsgemäß, vergaß jedoch die Zeit von n = 10 4 </ sup>. Natürlich habe ich viele andere Fehler gemacht und mich gefragt, ob ich einen so kleinen Fehler machen soll, aber ich werde dies als Gebot halten. Vergessen Sie nicht die Ausnahmen, die Sie gemacht haben.

Ich habe _2 geschrieben

n, a, b = map(int, input().split())
ans = 0
ir = 1 if n < 1000 else 10
jr = 1 if n < 100 else 10
kr = 1 if n < 10 else 10
for i in range(ir):
  for j in range(jr):
    for k in range(kr):
      for l in range(10):
        s = i + j + k + l
        if s >= a and s <= b:
          t = 1000 * i + 100 * j + 10 * k + l 
          if t <= n:
            ans += t
#Ich werde die Ausnahme aufgreifen
if n == 10000 and a ==1:
            ans += n            
print(ans)

Wenn Sie eine Ausnahme machen, möchten Sie möglicherweise den Code aus der Ausnahme schreiben, damit Sie ihn nicht vergessen. Antwort des starken Mannes (Tsuyobito)

Zeichenkette i Jeder wird durch int zu einem numerischen Wert gemacht und die Summe wird genommen. Ich sehe ich sehe……? !! Ich konnte überhaupt nicht daran denken. Ich habe die Kartenfunktion nur bei der Eingabe verwendet ... Es ist erstaunlich, dass sich jeder das ausgedacht hat. Es gibt jedoch einige Standards, und ich frage mich, ob jeder auf diese Weise gelernt hat. Ich werde auch mein Bestes geben. Wenn ich die Erklärung lese, scheint es ein ziemlich häufiges Problem zu sein. Ich kann mir einen Weg vorstellen, zu viel hinzuzufügen, den ich immer wieder durch 10 geteilt habe. Sie müssen die Ideen dieser anderen Menschen zu Ihren eigenen machen und sich selbst schwierigere einfallen lassen ... Ich möchte mich so schnell wie möglich an diese Standardsteine gewöhnen. Es scheint auch, dass a <= s <= b gut war. Ich dachte, ich könnte es schaffen, aber ich habe es nicht geglaubt. Glauben.

Ich war überrascht, dass es überwältigend viel Zeit in Anspruch nahm als das B-Problem, das ich mehrmals gelöst hatte. [^ 1] Außerdem haben alle drei viel gelernt. Es fühlt sich an, als wäre es das Problem der Wahl. Wir werden auch die verbleibenden ABS-Probleme in Frage stellen. Ich möchte es hinzufügen, nachdem ich es richtig überprüft habe ....

[^ 1]: Ist es nicht einfach so, weil es in einer nutzlosen Morgendämmerung gelöst wurde? Die Theorie entstand

Recommended Posts

AtCoder Ich kenne kein Tagebuch_4 ABC081B, 087B, 083B (von ABS)
AtCoder Ich kenne Tagebuch_2 ABC148E nicht
AtCoder Ich kenne Tagebuch_1 ABC148D nicht
AtCoder Ich kenne kein Tagebuch_3 ABC149C, D.
Ich kenne den Wertfehler nicht
[Python] Starten Sie das Tagebuch ab heute Atcorder ABC058-B