かしのブログ

競技プログラミングとか

第一回 アルゴリズム実技検定 M - おまかせ

問題

 N体の所持モンスターから4匹以上、 M体のお助けモンスターから0匹以上選んでモンスターを合成する。 合成されたモンスターの強さは、(使用したモンスターの魔力の和)/(使用したモンスターの質量の和)で定義される。 合成できるモンスターの最大の強さを求める。

atcoder.jp

考察

選んだモンスター iの質量を A_i、魔力を B_iとすると、モンスターの強さは \frac{\sum B_i}{\sum A_i}になる。 解 Xは、不等式 \frac{\sum B_i}{\sum A_i} \geq xを満たす最大の xと一致するので、二分探索で求められそうである。

不等式を次のように変形する。

 \frac{\sum B_i}{\sum A_i} \geq x

 \Rightarrow \sum B_i\geq x \sum A_i

 \Rightarrow \sum (B_i - x A_i) \geq 0

以上より、強さ x以上のモンスターを合成可能か判定するためには、 B_i - x A_iが大きいモンスターから順に選べばよいことがわかる。

お助けモンスターを複数選ばないように、適当にフラグを立てれば求められる。

実装

atcoder.jp