名もなき未知

エンジニアリングとか、日常とかそういうのをまとめる場所。

ABC079所感

調子が悪かったので寝ていたら終わってました。1時間以下で解けてしまったので所感だけ。

コンテストURL

https://beta.atcoder.jp/contests/abc079

問題

A問題

A - Good Integer

4桁の数字が与えられるので、上3つまたは下3つが同じ数値ならYes、そうでないならNoを出力する。

言語:Python3

print("Yes" if (lambda x: int(x[1:])%111==0 or int(x[:-1])%111==0)(input()) else "No")

B問題

B - Lucas Number

ある法則で与えられるリュカ数を計算して出す問題。フィボナッチ数列求めるみたいに出来る。nまで求めればと良かったが、どうせ同じようなものを毎回求めるため、毎回n=86になるものまで求めて出しておいた。

言語:Python3

l = [2, 1]
for i in range(2, 87):
  l.append(l[i-2]+l[i-1])
print(l[int(input())])

C問題

C - Train Ticket

与えられた4つの数値を加減算で7になるものを求める問題。

…はい。制約見て大丈夫なので即全探索でevalします。zipでまとめてから、Dの部分だけ足してあげると見やすいかな、と思って最終的には下記の形になりました。

言語によっては最初のABCDをパースするところが若干難しいんじゃないかな?

言語:Python3

l = list(input()) 
for i in range(8):
    p = ["+"if i&j else"-" for j in[1, 2, 4]]
    line = "".join([v+o for v,o in zip(l,p)]) + l[3]
    if eval(line) == 7:
        print(line + "=7")
        break

D問題

D - Wall

最小コストで壁画の数値を変換してくださいという問題。

前提として-1, 1は変換対象にしません。その上で予め ダイクストラ ワーシャルフロイド法を使って、N → 1 の変換の最小コストを求めておき、その計算結果を使って変換をかけてあげればOKです。

表の大きさが固定値の ダイクストラ ワーシャルフロイドなんて初めて使いました…。

※ワーシャルフロイドでといているのに、ダイクストラと書いてたのはなぜ…(Twitterで指摘頂いたので修正)

言語:C++ コードは長いためリンクとし、省略します。 https://beta.atcoder.jp/contests/abc079/submissions/1789416

まとめ

出とけばよかった。割りと得意な問題が出ていたので、全完セットだと思う。Twitterで答え要約を見てから解いたが、50分程でトキ終わっているので、おそらく本番で出ても今回は行けたセットだと思う。

惜しいことをした…。体調管理はしっかりやっておこう。

これはひどい