40分以内と、比較的調子良く4完には成功。しかしE問題で「解を二分探索する」というところまでは自力で素早く見出せたのだが、その先をどうすればいいのかが正確に分からず無念の撃沈。早く公式解説にあったような鮮やかな視点に立てるようになり、本番中に5完を達成したいものである。
<A問題>
↓問題のページ↓
s.substr(len - 3, 3)と"san"が一致しているかを判定する。Javaのように、文字列が指定した正規表現とマッチしているかを標準ライブラリで判定できる言語ならばそちらを使うのがより正確に書きやすく楽に実装できる。
<B問題>
↓問題のページ↓
\(S, T\)の長さが異なるならば、短い方の末尾に、入力で降って来ない文字(何でもいいが筆者は'!'を選んだ)を連結させて2つの文字列が同じ長さになるように規格化させてしまうのが楽。先頭から1文字ずつ比較していき、\(S_i \neq T_i\)を満たす\(i\)が見つかればそのような\(i\)を出力し、末尾まで見てもそのような\(i\)が現れない場合は\(0\)を出力してAC獲得。
<C問題>
↓問題のページ↓
それぞれの部署に対し、Aに割り当てるかBに割り当てるかの2択を迫られているという状況なので、部署が\(N\)だけある時には全ての割り当て方は\(2 ^ N\)通りだけ存在する。制約を確認すると、\(N\)は最大で\(20\)しかなく\(2^ {20} \lt 10 ^ 7\)が成り立っているため、bit全探索を利用して全ての割り当て方に対するAおよびBの人数を調べ尽くしてしまえばそれだけでAC獲得。
<D問題>
↓問題のページ↓
線分が最大で6本しかことからして「全ての場合を調べ尽くすことができてしまうのでは?」という疑念が直感的に湧き上がってくる。実際にこの直感は正しく、6本の線分をどの順番で書くかという視点で\(6!\)通りあり、6本の線分それぞれについて、座標\((A_i, B_i)\)から\((C_i, D_i)\)の向きに書くか座標\((C_i, D_i)\)から\((A_i, B_i)\)の向きに書くかの2択を迫られるという視点で\(2 ^ 6\)通りあるため、これらの積が全ての線分の引き方となり、その値は\(6! \times 2 ^ 6 = 46080\)となるので、線分の引き方を愚直に全て調べ尽くしても十分間に合うことが分かり、結局は順列全探索とbit全探索の合わせ技で解ける。なお、この解法はABC369のE問題( E - Sightseeing Tour)でAC獲得した時のものとほとんど変わらないものであった。
※実装に落とし込む際の注意点としては、\(P\)を\( \{ 0, 1, 2, 3, 4, 5\}\)の順列とする時、\(i = 0, 1, 2, 3, 4, 5\)のそれぞれについて、次に引くのは\(P_i\)番目の線分であるということである。本番では誤って\(i\)番目の線分を引くように実装していたがそれに10分程度気が付かずに無駄に時間を失ったため、今後は同様の理由で時間を失うというアホすぎる事態とならないようにしなくては・・・。
<E問題>
↓問題のページ↓
E - Sensor Optimization Dilemma 2
本番中のACには失敗したが、是非とも獲得しておきたい問題だった。製造能力の定義からして、「解を二分探索すればできそう」と直感的に考えた。つまり、\(G\)という製造能力は達成可能だが、\((G + 1)\)以上の製造能力は達成不可能であると言えるような\(G\)が存在するはずであり、そのような\(G\)を最終的に出力すれば良い。後は 公式解説をほとんどそのままなぞるだけで、\(G\)を特定の値に決めた時、それぞれの工程において\(G\)個以上を製造するためにかかる費用の最小値を求め、その合計が\(X\)以下ならば\(G\)は達成可能、そうでなければ達成不可能と判定できる。それぞれの工程は独立した性能および費用を持つ機械を利用するので以下では添字を省略する。\(C_S\)台の機械\(S\)と\(C_T\)台の機械\(T\)を導入すると、\((C_S A + C_T B)\)個を製造でき、導入費は\((C_S P + C_T Q)\)円である。\(C_S\)を特定の値に定めた時、導入費は\(C_T\)に関して単調増加なので、選ぶべき\(C_T\)は\(C_S A + C_T B \ge G\)を満たす値のうち最小であるものであるから、\begin{align} \lceil \frac{ \text{max(0, } G - C_S A \text{)} }{B} \rceil \end{align}であると求められる。\(C_T\)を定めた場合も全く同様の論理が成り立つ。このようにすれば各工程に対する最小の導入費が求められるため判定が可能となる。
※実装に落とし込む際の注意点としては、\(P, Q\)が最大で\(10 ^ 7 \)と大きめの値を取るのでオーバーフローによって判定結果が狂うことを回避する必要がある。公式解説によると、解は最大でも\(10 ^ 9\)で抑えられることが証明できるらしいので二分探索の上限は\(10 ^ 9 + 5\)くらいにしておけば良いのだが、普段から設定している\(2 ^ {60}\)を上限値として使い回したため、導入費の計算でオーバーフローしているということに30分くらい気が付かず困惑し続けた。対策としては、そもそも各工程について、\(S, T\)片方の機械を導入する個数を決めた時点で全体の予算\(X\)を超えてしまってはいけないため、\begin{align} C_S \leq \frac{X}{P} \land C_T \leq \frac{X}{Q} \end{align}が成立している場合のみ導入費の計算を行うようにするというようにした(面倒くさがらずにさっさとprintデバッグをしていればもっと早く気が付くことができたはず)。
(考察部分終わり)
ここまで書き終えた後で気が付いたのだが、製造能力の定義のせいでこの解法(すなわち公式解説の解法)が破綻しているのではという疑念が湧いてきた。製造能力を\begin{align} \displaystyle \min^{N}_{i=1} W_i \end{align}と定義しているため、「\(G\)という製造能力を達成可能である」と言えるのは、製造している個数が\(G\)個未満であるような工程が存在せず、且つちょうど\(G\)個を製造しているような工程が少なくとも1つは存在している場合のみということになるはずだが、公式解説の解法にそのまま従うと、どの工程も\begin{align} C_S A + C_T B < G \end{align}でないことは確実であるが、\begin{align} C_S A + C_T B = G \end{align}が成り立っているような工程が少なくとも1つは存在していることまでは保証できていないのではないか? もし「\(G\)という製造能力を達成可能である」の定義が「\(W_i \lt G \)を成り立たせる\(i\)が1つも存在しないこと」であるのならば何も問題はないのだが。正直この辺の厳密な論理展開を自分が正しく理解できているかはあまり自信がないので、公式解説の解法で何故問題ないと言えるのかを全く欠陥なしに説明できるほどの途轍もない強者が気紛れにこの記事を訪れて説明してくれるようなことがあれば大助かりである(まあ、まずあり得ないことだろうが・・・)。