0.はじめに
2週ぶりのコンテスト参戦の今日この頃。
A~Cがすんなり解けたので、Dへ。
こちらも久々にDもノーミスで解けて、EかFを・・・
とチャレンジしましたが、さすがに甘くはなく
4問ACでフィニッシュ。
レートはまさかの+56で792に。
最近自分のレベルはそれほど上がってないのに
順位が高くなる感じなので、AI関連の規制で
正答者が減ったのかな・・・でもABCは前から
AIだめだしな・・・と思いつつの年内緑復帰に
色気が出てきました。
1. A - Happy Birthday! 4
親子や兄弟間なんかでたまに話題になったりするシチュエーション。
【考え方】
・いつかは、青木君の年齢のZ倍が高橋君の年齢以上になる年が来る
・その時に、ピッタリZ倍か、超えてしまっているかを判定する
・単純に二人の年齢を1ずつ増加させて比較しても制約上TLEにはならない
と、いうことでループを回してXとYに1を足しつつ
・Y×ZがXと一致したらYesを出力して終了
・Y×ZがXより大きくなったらNoを出力して終了
といった感じで実装しACとなりました。
https://atcoder.jp/contests/abc433/submissions/71118407
2.B - Nearest Taller
今度は背比べの問題。
制約がN=100と緩いので素直に実装
【実装】
1.NとリストAを読み込み
2.以下iを0~N-1まで繰り返し
-1.iが0の時は、前に人がいない為、-1を出力
-2.iが0以外の時
-1.変数flg(左からi+1番目の人の前にその人より背が高い人がいた場合1そうでなければ0)に0をセット
-2.以下、jをi-1から、0まで1ずつ減らす形でループ
-1.A[j]>A[i]かつ、flgが0の時
-1.j+1を出力
-2.flgに1をセット
-3.flgが0だった場合-1を出力
上記実装でACとなりました。。
https://atcoder.jp/contests/abc433/submissions/71125193
3.C - 1122 Substring 2
先頭から順にみていきながらの判定で行けそうかなと判断
【考え方】
・先頭から文字列を見ていき、同じ文字の場合はその文字の連続数をカウント
・文字が変わった場合、前の文字と今の文字の差が+1の場合
前の文字と今の文字の連続数の小さい方を答え用変数に加算
・文字が変わった場合で、前の文字と今の文字の差が+1ではない場合は
今の文字の連続数のをカウントしていく
・上記を繰り返し、最後に答え用変数を出力
上記を実装してすんなりACとなりました。
https://atcoder.jp/contests/abc433/submissions/71139692
4.D - 183183
Dにしてはやさしめかなーと思いつつ解答。
【考え方】
・f(x,y)がMの倍数となるのはx※とyそれぞれをMで割った余りを足した値がMで割り切れる場合
※ただし、xは単純にxではなく、x×(10*yの桁数乗)で計算
・Aiは最大10桁
・Aiそれぞれについて、後ろに1桁~10桁着いた場合の数を求め、その余り(関数fのxとなった場合の余り)を計算し
辞書に桁数と余りのタプルをキーとし、その個数を値として格納
・Aiそれぞれについて、その桁数と余りを求め(関数fのyとなった場合の余り)
桁数とM-余り(余り0の時は0)のタプルで辞書を検索し、値を答え用変数に格納
・最後に答え用変数を出力
例題3を実行中に10桁まで必要な事とxとyどちらも余り0の場合が考慮されていないことが分かり助かりました。
https://atcoder.jp/contests/abc433/submissions/71154610
以上