0.はじめに
月一回の夜勤明けで今一頭の働かない今日この頃。
A~CをCにてこずりつつもクリアし、Dに。
解き方はわかりましたが、時間が足りずに終了。
そのまま続けてACはとれました。
Cに時間がかかったのと頭が働かなかったのが原因かと思いました。
レートは微減し-6の834となりました。
1. A - mnclr
Sを読み込み全ての文字の後に”o”付加した文字列ansを作成、最後に
ansの最後の一文字を削って出力して終了
https://atcoder.jp/contests/abc475/submissions/79181546
2. B - Change
Bにたまにある考え方は簡単だけど実装がめんどい問題。
【実装】
1.NとAを読み込む
2.A1(1円玉釣り合計)、A10(10円玉釣り合計)、A100(100円玉釣り合計)を0で初期化
3.以下N回繰り返し
-1.A[i]%1000が0でない時(0の場合1000札でお釣りなし)
-1.お釣り額tに(((A[i]//1000)+1)1000)(A[i]に対して1000円札で払う額)-A[i]をセット
-2.C100(A[i]に対する100円玉のお釣り枚数)にt//100をセット
-3.tからC100100を減算
-4.C10(A[i]に対する10円玉のお釣り枚数)にt//10をセット
-5.C1にtからC10*10を減算した値をセット
-6.A100にC100をA10にC10をA1にC1をそれぞれ加算
4.A1、A10、A100を出力
https://atcoder.jp/contests/abc475/submissions/79191020
3. C - Walk the Line
考えかたはすぐに思いつきましたが、実装するのにてこずりました。
【考え方】
・パターンとしては、以下2パターンを調査し、最大値を出力
・Sからマイナス方向にすすみ、街につく毎に
そこからプラス方向に転じた場合に訪れる事の出来る街の数を数える
・Sからプラス方向にすすみ、街につく毎に
そこからマイナス方向に転じた場合に訪れる事の出来る街の数を数える
【実装】
1.N,S,L,Aを入力
2.リストD(街1の位置を0としたときの街ごとの街1からの距離を保持)に0のみで定義
3.変数d(街1からの距離を保持)を0で定義
4.リストAの値をを変数aに順に読み出す
-1.dにaを加算
-2.Dにdを追加
5.ans(回答用変数)に1をセット(Sからスタートするため、1つの街には必ず到達できる為)
6.Sから1減算(リストDが0-indexのため)
7.iをS-1から、0まで-1ずつ減算していく(Sからマイナス方向に移動し街ごと(街iで反転)に反転するパターンを調査)
-1.nans(街iで反転したケースの移動可能街数)に1をセット
-2.MD(Sから街iまで移動した後の残り移動可能距離)にL-abs(D[S]-D[i])をセット
-3.MDが0より小さい時(これ以上マイナス方向の街に到達できない時)7のループをbreakで抜ける
-4.MDが0以上の時
-1.nansにS-i(Sからiまで移動したときに移動した街数)を加算
-2.MD2(街iからプラス方向に移動した場合の到達可能地点)にD[i]+MDをセット
-3.RT(街iからプラス方向に移動した場合の到達可能街)にbisect_right(D,MD2)-1をセット
-4.nansに0とRT-Sの大きい方を加算(iで方向転換した場合Sに到達できない場合もある)
-5.ansにansとnansの大きい方をセット
8.iをS+1から、N-1まで1ずつ加算していく(Sからプラス方向に移動し街ごと(街iで反転)に反転するパターンを調査)
-1.nans(街iで反転したケースの移動可能街数)に1をセット
-2.MD(Sから街iまで移動した後の残り移動可能距離)にL-abs(D[S]-D[i])をセット
-3.MDが0より小さい時(これ以上プラス方向の待ちに到達できない時)8のループをbreakで抜ける
-4.MDが0以上の時
-1.nansにi-S(Sからiまで移動したときに移動した街数)を加算
-2.MD2(街iからマイナス方向に移動した場合の到達可能地点)にD[i]-MDをセット
-3.LT(街iからマイナス方向に移動した場合の到達可能街)にbisect_left(D,MD2)をセット
-4.nansに0とS-LTの大きい方を加算(iで方向転換した場合Sに到達できない場合もある)
-5.ansにansとnansの大きい方をセット
9.ansを出力して終了
https://atcoder.jp/contests/abc475/submissions/79216032
4. D - Alphametic Prime
最初問題の意味が全く分からず???となっていましたが
文字が一緒の組み合わせと数字が一緒の組み合わせが一致する素数を探す問題と理解しました。
それが腑に落ちた時にはすでに5分も時間が残ってませんでしたが、とりあえず時間は気にせず
問題を解きました。
【実装】
<関数sieve_of_eratosthenes>(引数 n(int) 戻り値prime(list))を定義(詳細割愛)
primeは1~nまでの項目を持ち、iが素数の時1が入る
<関数ptn>(引数 s(str) 戻り値res(list))を定義
resに入る値:0:sの中の他の文字と同じ文字がない
1~3:sの中の他の文字と同じ文字があるその文字の位置は同じ1~3の値
(sの長さは7まで)
1.変数nにsの長さをセット
2.c(同じ値があった場合の組)に1をセット
3.リストres(項目数n)を-1で初期化
4.iを0~n-1まで1ずつ増加しつつ繰り返し
-1.res[i]が-1の時
-1.jをi+1からnまで1ずつ増加しつつ繰り返し
-1.s[i]とs[j]が同じときres[i]とres[j]にcをセット
-2.res[i]がcの時cに1加算(cの組を使ったので1つ次の組を作る
-3.res[i]がcでない時→同じ文字が他にないので0をセット
5.resをリターン
1.Sを入力
2.NにSの長さをセット
3.変数primeにsieve_of_eratosthenes(10のN乗)をセット
4.spにptn(S)をセット
5.pを0からlen(prime)1ずつ増加させつつ繰り返し
-1.pが素数(prime[p]=1)かつ桁数がSと同じ時
-1.sp=ptn(str(p))の時pを出力して終了
6.-1を出力して終了
https://atcoder.jp/contests/abc475/submissions/79229495
以上