ABC148:水色競プロerのムーブ備忘録(今回は参考になるムーブ)
前回(ABC147)で水色に復帰したので、タイトルは水色競プロerの・・に戻ってます。
〇コンテスト名:ABC148
〇配点 A:100 B:200 C:300 D:400 E:500 F:600
〇制限時間 100分
配点も時間もいつも通りのABCです。
〇コンテスト開始時のsyunsukeのレート 1217
〇今回の方針
基本的に前から解く。
ハマってしまったら、飛ばして次の問題に進むが、順位表を時々チェック。
そして、解いた人が多い問題を解く。
コンテスト開始!
A:1~3までループを回し、A,Bが含まれていなければ出力、強制終了
A,B=map(int,input().split())
for i in range(1,4):
if A!=i and B!=i:
print(i)
exit()
一応テストケースを確認して、テストケースが通るのを確認できたので提出
2:21 AC
B:空白の文字列を用意しておいて、あとは指示通りSとTから順番にくっつければ良いですね。
N=int(input())
S,T=input().split()
ANS=""
for i in range(N):
ANS+=S[i]
ANS+=T[i]
print(ANS)
5:01 AC
C:最小公倍数の定義そのままですね。
「gcdのライブラリは極力使わない」
です。
Pythonのgcdは古バージョンと新しいバージョンでは、入っている場所が違い、それを知らないと手元の環境でACなのに、いざ提出するとRE!なんてことになりかねません。また、どこかのタイミングでAtCoderのPythonもバージョンが上がるでしょう。その時また困ったことにならないよう、gcdは自分で用意しておくか、その都度作るのがおすすめです。
それと、A,Bの最小公倍数は、A*B//gcd(A,B)を知っていれば、やるだけ。
A,B=map(int,input().split())
def lcm(X,Y):
if Y>X:
X,Y=Y,X
while X%Y!=0:
X,Y=Y,X%Y
return Y
print(A*B//lcm(A,B))
8:41 AC
D:左から順に1を探す、見つかればその場所からつぎは2を、3をと繰り返し、見つけた数をカウント。
もし1が見つからなければ-1。みつかれば、N-カウント数+1を出力
13:23 AC
E:強いテストケースがあって助かりました。
①まずは、テストケースの通り、奇数の時は0
偶数の時、10が出れば0が1個増える
余裕ですね。
テストケースで確認して・・合いません。
100までシミュレートして・・
50の時にずれますね。
②50の数も数えれば良いんですね。
余裕です。
Nを50で割って小数点以下切り捨て
それと①を足せば良いんですね。
テストケースで確認して・・合いません。
500までシミュレートして・・
250の時にずれますね。
なぜ250?
50x5!
なるほど、10x5の〇乗のときも数えないといけませんんね。
③②を踏まえて10x5^1,10 x 5^2,10 x 5^3 の数も足せば、
テストケースに通りますね。
41:49 AC
しかし、コンテストが終わって考えてみれば、
N//10とN//50,N//250,N//1250,N//6250・・・を足したら答えになるんでしょう?
後でゆっくり考えましょう。
F:①高橋くんの最初の位置を根とした木を作成し、根から各頂点までの距離を求める。ただし、青木くんの位置より先は除外
②青木くんの最初の位置を根とした木を作成し、根から各頂点までの距離を求める。ただし、①で除外した点は使用しない。
③①で求めた距離<②で求めた距離 を満たす中で、②で求めた距離が最も長くなる点を選択
④③で求めた点の距離-1が答え
75:24 AC
ACが出た後に気づきましたが、①で青木くんの位置より先を除外する必要はなさそうですね。
結局75:24でノーペナ全完!
522位でパフォ1650 レートは+52で1269になりました。
今回は何といってもEのシミュレーションが良かったです。
とっさに、0が増えるときだけ出力するコードを書いて走らせる。
どこで増えたか見て、考える。
良いムーブで良い結果が出たコンテストでした。
良いムーブを忘れないように記録して、今回の記事は終わりです。