diverta 2019 Programming Contest 2-D:Squirrel Merchant
方針立ってから時間かけ過ぎた...。
解法
まず1つの金属について考える。例えばなら、Aでどんぐりを金にして、Bで金をどんぐりにするという行為以外ありえない。このように不等号の向きを見れば、ある程度取るべき行動が確定する。金属の種類の違いを無視すれば、3つの不等号の向きの組み合わせは4通りなので、これで場合分けをし、全探索をすることを考えよう。の3種類の金属をまとめてを書くことにする。
- 3種類すべてのとき、取引所Aで金を個、銀を個買うと決めると、銅を買う個数も勝手に決まる。よって、について全探索してとなる。
- 3種類すべてのとき、1の場合と同様にすればよい。
- となる金属が2種類のとき、取引所Aでその2種類の金属をいくつか買い、取引所Bでどんぐりにした後、である金属を買えるだけ買い、取引所Aでその金属をすべてどんぐりにするという行動を考えればよい。したがって、最初に取引所Aでとなる2種類の金属をそれぞれいくつ買うかを決めることでの全探索が可能となる。
- となる金属が1種類のとき、取引所Aでその金属を買えるだけ買い、取引所Bでその金属をどんぐりにしてから、である2種類の金属をうまく買って、取引所Aですべてどんぐりにするという行動を考えればよい。全探索すべきは、取引所Bでの金属の買い方だが、これは片方を何個買うかを決めればよいので、取引所Bについた時点でのドングリの個数がネックになる。これはであり、全探索して間に合う。
これで問題を解くことができた。
実装
Submission #5936228 - diverta 2019 Programming Contest 2
算数パートが注意が必要で6WA...。この実装は「ある金属を買うのに使うどんぐりの数」をとしているので参考にする場合は注意を...。
ナップサックdpでできるらしい。類題を解いたことがあったのに見えなくて悲しかった。