れとろのメモ置場

とあるSEのメモ置場

AtCoder Beginner Contest207

AtCoder Beginner Contest207に参加しました。

結果

A,B,C問題の3問正解でパフォーマンスが1145でした。
前回同様D問題が解けそうで解けず、E問題がもうすこし頑張れば解けそうな気がした。解説読むとE問題は方針自体は間違ってなかったから、もう少し考察がちゃんとできてれば正解できてたのかなあ。
あと、今回は普段よりも頭の回転が鈍ってた気がする。B,C問題が問題文読んでもすぐにはよく理解できなかった…

A - Repression

3通りある解候補(A+B,A+C,B+C)を計算して最大のものを出力すれば良い。
他には、3つを配列に入れてソートして上位2つを足したものを出力しても良い。

B - Hydrate

初期状態が水色A個、赤色0個に対して水色Bx個、赤色Cx個ずつ足していって A+BxがCDx以下になる最小のxを求める問題。
x自体は何回足したか数えながらループで処理すれば求められる。問題は何回足してもA+Bx>CDxにしかならない場合の判断方法。 結局B \geq CDの時は条件を満たせないのでループ前に確認して対応する。

C - Many Segments

制約を見るとN \leq 2000だから二重ループくらいまでなら間に合いそう。なのでi,jの組合せは全通り探索できそう。
あとは手短に区間iと区間jに重なっている部分があるかどうかを判断できれば正解できそう。
注目している区間が閉区間の場合は問題ないけど半開区間、開区間がある場合は判断がやりづらい。端点を含まない場合の表現方法を知らなかったので、とりあえず今回は0.1だけずらして対応してみた。 区間が被っているかどうかは開区間の処理後に2つの区間の両端の大小関係をもとに判断した。

D - Congruence Points

回転して平行移動すると一致させられるかどうかを答える問題。 点の回転なので回転行列と掛ければ良さそう。でも結局解けなかった。
制約を見るとNは小さいし角度も360度程度しかないので、Sのある点を回転させて平行移動するとTのある点に一致させられるかどうか、一致する時は全部の点を同様に回転・平行移動させて全部一致させられるかどうかを360度全部確認はできそう。実際は小数点以下で誤差があるのかうまく行かなかった…

E - Mod i

問題文を読んでDPで解けそうだと思ったから DP[i][k][x]=A _ {i}までの部分数列をk個に分割する(k個目の部分数列はA _ {x}から始まる)時の何通りあるかで解こうとしたけど O(N ^ 3)なので案の定TLEした。解説を読むとバッチリこの方法だとTLEするって書かれてた…