成長観察日記

競プロとかPythonとかに関しての成長記録

ABC281振り返り

3完は、した。が、今まででいちばんメンタルやられた回だった…
B問題4ペナて、ひよこです。ピヨ
300の壁あついよお なんか300になってました!!!!超えた!!!!!!!!



A問題

atcoder.jp

問題概要

nから0まで改行カウントダウンしてくれよな

考察

  • forでiをプリント 以上

コード

#入力
n = int(input())

#逆からfor
for i in reversed(range(n+1)):
  print(i)

感想

Ryusukeさん(鬼)に教えていただいたreversed(range())かなり効き始めている。ありがたや
45秒でA問題解けたのは最速だったんだけれど…しかし……

ちなみに、開始前にターミナルにoj d 前コンテストのA問題idを変えただけのやつ を打っておけば開始と同時にDLできるの知った。
というか、問題文を見ずにサンプル見て判断したことと、もう一つ気になるのが
私のPC、問題文の表示までとダウンロードがなんか遅い。chrome拡張機能starshipが影響している気もする。要研究。



B問題

atcoder.jp

問題概要

文字列Sが以下の条件を満たしているか判定してね。

  • そのいち:頭1文字が英語の大文字
  • そのに:真ん中が100000〜999999までの整数
  • そのさん:おしり一文字が英語の大文字

考察

  • if文を書きまくるやつだ
  • そのいち、そのさん、はisupper()で英語の大文字なのかを判断しよう
  • 真ん中は切り出して .isdigit()で全部整数なのかを判断し、OKだったら範囲をint()変換して見よう

コード

#入力
s = input()

f = s[0] #1文字目
e = s[-1] #最後の文字
n = len(s) #sの長さ
m = s[1:-1] #2文字目〜最後から2文字目(整数であってほしい部分)


#整数であってほしい部分の判定 Falseならその後の整数判定でバグるためNoを吐き出しプログラム終了
if m.isdigit() is False:
  print('No')
  exit()

#残りの条件判定
if n == 8: #8文字?
  if f.isupper(): #最初の文字は英語大文字?
    if e.isupper(): #最後の文字は英語大文字?
     if 100000 <= int(m) <= 999999: #整数部分はご指定の範囲内?ご注文はうさぎ??
        print('Yes') #よくぞここまで辿り着いたYes
        exit()

#全部違ったらNo
print('No')

感想

まさか4ペナするとはおもわなんだ。
手元でいろんなパターン書きまくってエラー原因見つける回だった。プログラミングが下手…でも、学べるものめっちゃ多かった。

  • 条件が複数の判定問題については、無理にandで条件を繋げず、ひとつずつ入れ子する。今回は f.isupper() and e.isupper() と書いてて、右項を判断しない問題でやられた
  • ifに対してelse:print("no")を連発するのではなく、print("Yes")したらexit()で処理
  • 指定範囲に文字列が含まれていた場合、int変換の時にエラーが出るので、丁寧に場合分けしてあげる
  • ちゃんとサンプルケースでREする原因を特定してから提出する。もうまぐれでRE解決するほどのレベルではない。いい意味で!
  • そして、REが解決したからとてWAが取れるわけではないため、WA原因を特定し修正してから提出するようにする(本当にこれ)

なんか書き出したら怒り(?)落ち着いた。自分に対して怒ってた…散歩しよう。良い散歩を。



C問題

atcoder.jp

問題概要

n曲のプレイリストがある。各曲の長さはaの数列で与える。では再生!無限ループをするぞ!!さて、t分経った時、何曲目の何秒を聞いてるでしょう。

考察

  • 好きなものが題材の問題、とてもほっとする。
  • 止まった時間(t)を合計で余剰計算すれば、何ループ目かは関係なく現時点にいるところは確定できる。
  • 確定できたら、頭から時間を引き算していこう。

コード

#入力
n,t = map(int,input().split())
a = list(map(int,input().split()))

s = sum(a) #合計秒数
now = t%s #止まった時間、合計秒数中のどこにいるか
track = 0 #何曲目かを足してく変数

#止まった時間(nowいま)がiよりでかかったらnowからiを引く。トラックナンバーを加算
for i in a:
  if now >= i:
    now -= i
    track += 1
  else:
    track += 1
    break

print(track,now)

感想

落ち着いて解けたからよかった。
悔しいけど、やっぱり音楽に救われてしまう…てへ


D問題

atcoder.jp

問題概要

nこの数字からmこを選び足した結果をxとす。dの倍数になる最大のxを探してね。

考察

  • ソートして上から順に貪欲しようとする。
  • しかしこれは組み合わせの数的に無理だ、あ、まさか、これは噂の…DP…か…

感想

DPのDだよね。それだけはわかったよ。漸化式?数Bだね。おいしそうだね。全菓子機
アルゴ式をがんばります!!!

来週のburiodenは

実はちょっとでかい仕事があるけれど、寝なければ終わるのでがんばります。
土日はなんもないぜ!!いえええええええい精進いええええええええええええええええい
DPとBFSに命を捧げようとおもいます!!!

って、テンションで乗り切ろうとしないようにね。丁寧に場合分け…(トラウマ)