TCO Round1

すぐ寝ようかと思ったけど,惜しかったからイライラっとしてねれないので更新.

250 EqualizeStrings

二つの文字列を同じにする.各文字を1文字進める/戻るコスト(a -> b, a -> z)は1.最小コストでおなじになる文字列を求めよ.複数ある場合は辞書順最初のを.

  • とりあえず文字の小さい方に適当に合わせてみよう.
    • tとgの場合真ん中のaにした方がいいのか…
    • tとgの真ん中あたりってどう求めよう.偶奇で分ける?う〜ん…
    • a-z全部やってみるか.a - > zに変換するときに25とかにしないように気をつけよう.
    • サンプル通った.出そう.

500 TwoRegisters

レジスタにX=1,Y=1が入っている.可能なオペレーションは X=X+Y,Y=X+Yのみ.命令数最小ででRにする命令列を求めよ.複数ある(ry

  • 後半加速しませんかね.X=1,Y=1からキャッシュmap[1000000][1000000]でやってみるか.
    • 余裕のTLE
  • 適当にノートに書いて考える.
  • 発想を逆転させるのよ,ナルホドくん!
  • 逆にやってみよう.X=R,Y=1..RをX=1,Y=1に戻すって考え方で.
    • 仮にひとつずつ減っていって,R * R / 2ぐらいかなぁ…間に合わなそうだけどやってみよう.
    • 500000ぐらいまでなら答えが出そう.
    • チューニングすれば通るか?どこ速くなるかな…
    • 文字列処理が明らかに遅いけど,早くする方法が上手く思い浮かばない…
    • あれ,gcd(R,i) != 1のときって(1,1)にならなくない?
    • xの倍数どおしの差はxの倍数だろう.これで刈れる?
    • 1000000が通った!これで勝つる!

チャレンジフェイズ

  • 500落ちてると仮定すると,ギリギリ通ってない程度.
    • 自分がやったような間違いをしているソースが,勇気を出せ…

出せませんでした.誰かに落とされてました.自分と同じ間違いは他の人のを落とすチャンスなので,とても大事.点数的には落としに行くのが最適戦略だよなぁ.

結果

500はTLEで通らないケースが有った.あとで人のソース見て,文字列を生成しない方法にしたら通った.string(x,'X')みたいの大杉…

今回は十分考えられて,十分手を動かすことができたのでよく戦えた.今回の感想.

  • とりあえず手を動かす
    • コード書くにしても,ノートに書くにしても.
  • 逆転裁判
    • 結論から考えたりしてみる.

次にいけたなぁ.(´・ω・`)