0.はじめに
今回の問題は、全体的に難易度が低かった気がします。(相性が良かった?)
記憶にある限り初めてのA~E制覇で、レートも700台にupしました。
- A - Filter
インプットしたリストを頭からチェックして
答え用のリストに偶数だけ格納して
最後に表示。と、素直に解きました。
最近以下の書き方で、リストを横一列にスペース区切り表示できることを知り
役に立っています。
ans=[1,2,4]
print (*ans) # 1 2 4
https://atcoder.jp/contests/abc294/submissions/39846002
2.B - ASCII Art
数字をアルファベットに変換する方法を探すのが面倒だったので
前からよく使っているA~Zの文字列を使い、ここから必要な文字を
アドレス指定で取り出す方式で実装しました。
https://atcoder.jp/contests/abc294/submissions/39851228
3.C - Merge Sequences
制約から、Aのリストと、Bのリスト内で重複する数字はないことが
わかったので、以下の方法を思いつき実装してACでした。
考え方
1.リストAとリストBを合わせたリストCを作りソートする。
2.Cを頭からインデックスiで読み込み、辞書にKEYC[i]=iを登録していく
3.リストA内の順番用リストALとリストB内の順番用リストBLを用意する。
4.リストAを頭からインデックスiで読んでいき、辞書キーA[i]の値+1を
AL[i]に格納していく
5.リストBについても同様の操作を行う。
6.リストALとBLを表示する。
https://atcoder.jp/contests/abc294/submissions/39857220
4.D - Bank
まず、呼ばれた人リストを作ってその人が窓口に行ったらリスト削除
という形で実装したけどTLE。
リストではなく、辞書で実装したけどTLE
と、八方ふさがりでしたが、問題を読み返して
呼ばれた人リストはいらないし、制約が丁寧なので
今何番まで呼ばれたかもいらないな・・・。などということに気づいたので
以下の考え方で実装をしてAC。
制約ががっちりしているから解きやすく感じました。
考え方
以下の変数を準備し、それぞれ以下のように扱う
1)P1(数値) ・・・ イベント1で次に呼ばれる人を保持。
イベント1が来たら1加算
まぁこの後使わないけど。
2) P2(辞書) ・・・ 受付に来た人を保持
イベント2が来たらその番号を登録
3) P3(数値) ・・・ 前回イベント3で呼ばれた番号を保持(初期値1)
イベント3が来たら、P3の番号が
P2に存在するかをチェック。
存在しない=呼ばれてない
=その数字がイベント3で呼ばれる
存在する=P3に1加算しその番号をチェック
以下存在しない番号までループ
https://atcoder.jp/contests/abc294/submissions/39869595
5.2xN Grid
素直に解いたらTLEまっしぐらな感じ。
でも、尺取法(と言っていいのか微妙だが)ぽく、
A列をもとにB列をチェックしていけば
解けるのでは!?と思い実装→解けました。
【考え方】
1)1行目の情報を、リストNL1に格納。形式:”NL1[i]=(V[1][i],L[1][i])”
2)2行目の情報を、リストNL2に格納。形式:”NL2[i]=(V[2][i],L[2][i])”
3)一致したマス目の数ansとNL2のチェック対象アドレスjを定義(いずれも初期値0)
4)NL1に格納されたアイテムを、1つずつチェックしていく。(インデックス変数=i)
4-1)NL1[i][0]を比較値変数V1に、NL1[i][1]を比較長変数L1にセット
4-2)フラグ変数に0をセット
4-3)フラグ変数が1になる(L1が0になる)まで以下を繰り返し
4-3-1)NL2[j][0]を比較値変数V2に、NL2[j][1]を比較長変数L2にセット
4-3-2)L1=L2の時(現在比較中のリストについて圧縮長が同一の時)
4-3-2-1)V1=V2の時(現在比較中のリストについて値が同一の時)
4-3-2-1-1)ansにL1を加算(比較中リストの圧縮長を加算)
4-3-2-2)jに1を加算(次回の比較はNL2の次のアイテムを対象)
4-3-2-3)FLGに1をセット(現在比較中のNL1のアイテムは終了)
4-3-3)L1>L2の時(現在比較中のリストについてL1の圧縮長が長い時)
4-3-3-1)V1=V2の時(現在比較中のリストについて値が同一の時)
4-3-3-1-1)ansにL2を加算(比較中リスト2の圧縮長を加算)
4-3-3-2)L1-L2(L2との比較に使用した分のL1は短くする)
4-3-3-3)jに1を加算(次回の比較はNL2の次のアイテムを対象)
4-3-4)L1<L2の時(現在比較中のリストについてL1の圧縮長が短い時)
4-3-4-1)V1=V2の時(現在比較中のリストについて値が同一の時)
4-3-4-1-1)ansにL1を加算(比較中リスト2の圧縮長を加算)
4-3-4-2)NL2[j][1]-L1(L1との比較に使用した分のL2を短くするため
NL2リストの値を減らす。)
4-3-4-3)FLGに1をセット(現在比較中のNL1のアイテムは終了)
5)ansを出力
書き起こすとややこしくなりましたが、考え方は単純です・・・。
https://atcoder.jp/contests/abc294/submissions/39874226
以上