ZONeエナジー プログラミングコンテスト “HELLO SPACE” C - MAD TEAM
問題
考察
基本方針は
5種類すべての能力がチーム全体として以上にできる3人の組み合わせが存在するかを二分探索で探っていく。
3人のチーム全体の各能力は以下の通り、3人の能力の最大値となる。
そして、チームの総合力は以下の通り、チーム全体の各能力の最小値となる。
各能力において、3人の内いずれかの能力が以上であれば、チームの総合力として以上になることが確定する。
例えば、パワーの場合は
のみ以上であれば、他のはより小さいということなので、
となり、が以上の値になるということである。
あとは他の能力についても同様に言える。
これらのことからについて二分探索出来そうなことが分かる。
あとは任意の3人の組み合わせで
5つある各能力のチーム全体の値が以上にできるかを確認するのだが、
各能力について、以上にできるか出来ないかの01の状態を持つことで確認することができる。
N人の各メンバーについて、各能力について以上にできる、できないの状態を5桁のビットで持ち、できる場合は1、できない場合は0とする。
(例えば01010だと、スピードと知識については以上にすることできる)
なので3人のビット状態を合わせて11111にすることが出来れば、チームの総合力を以上にできる。
単純にN人のメンバーから3人分のビット状態を合わせて確認するとで間に合わないが、
ビットの状態数は程度しかなく、同じビット状態のメンバーを選んでも、合わせたビット状態が変化せず無駄になってしまうので
N人それぞれにビット状態を持たせるのではなく、ビット状態のみに着目して
特定のビット状態にできるメンバーがいるかどうかを情報として持つ。
(具体的にはビット状態をSetで管理するようなイメージ)
これで高々程度の計算量で3人分のビット状態を合わせて確認することができる。
そして、この3人分のビット状態から最終的に各能力を以上にできる3人の組み合わせが存在するか(11111であるか)を確認して
二分探索を行っていく。