愚直に実装することを考えると、NCM通りを全探索し、「魅力度」の最大値を求めることになりそうです。しかし、その方針では TLE(実行時間制限超過)となり、正解することはできません。
そこで、M の値で場合分けを行います。
-
M=1 のとき、愚直に求める O(NC1)=O(N) で正解できます。
-
M≥3 のとき、以下のように解くことができます。
事務所に所属するアイドル全員の、「Vi」ステータスの集合を AllVi 、「Da」ステータスの集合を AllDa 、「Vo」ステータスの集合を AllVo としたとき、答えは max(AllVi)+max(AllDa)+max(AllVo) です。
何故なら、3 人以上選べるとき、各ステータスの最大値を持つアイドルを採用することができるからです。これは、 O(N) で求められます。
-
M=2 のとき、以下のように解くことができます。
二人のアイドルとして、i,j 番目のアイドルを選んだとき、ユニットの「魅力度」は以下で表される式のいずれかになります。
- Ai+Bi+Ci
- Ai+Bi+Cj
- Ai+Bj+Ci
- Ai+Bj+Cj
- Aj+Bi+Ci
- Aj+Bi+Cj
- Aj+Bj+Ci
- Aj+Bj+Cj
上のそれぞれの場合において、取りうる「魅力度」の最大値は O(N) で求めることができ、それらの最大値が答えになります。
よって、 O(N) で十分高速にこの問題に正解できます。
以下に Python の実装例を示します。