解説

N=2XN=2X と置き、E問題の解説を前提とします。

方針

この問題では少し考察をすると、解く順番は関係なく、誰がどの 22 問を解くかのみが重要とわかります。

ここで、誰がどの 22 問を解くかを効率的に求めることを考えます。

グラフとして考えると、人と問題がそれぞれ分かれた二部グラフです。そして、この問題は誰がどの問題を解くかをマッチングさせることで解くことができます。

より詳細には、XX 人の回答者と、 NN 問の問題を完全マッチングしたときのコストを最小化する問題として言い換えることができます。

二部マッチングについてわからない方は下の記事を読むと良いと思います。

けんちょんさんのわかりやすい記事

具体的な解法

上記の方針より、XX 人の回答者と NN 問の問題をマッチングしたときのコストを最小化すればいいことがわかりました。

これは、最小費用流を用いることで求めることができます。

以下の解説ではACLに含まれる MinCostFlow を用いることを前提とします。

まず、いわゆる超頂点を用いてフローの始点と終点を定義します。(始点を PP, 終点を QQ とします)

あらかじめ、 PP から人j_j に流量 22 コスト 00 の辺を11 本ずつ、問題i_i から QQ に流量 11 コスト 00 の辺を 11 本ずつ貼っておきます。

入力時は、人j_j が問題i_i を解くのに Ai,jA_{i,j} 秒かかるとして、人j_j から問題i_i に流量 11 コスト Ai,jA_{i,j} の辺を貼ります。

"ドン!"

上の図のような感じです。 ただし、Ai,j=1A_{i,j}=-1 の時とは辺を貼らないか、inf\inf としておきます。 このように辺が貼られているとき、PP から NN だけ流し、QQ までにかかるコストが全ての問題を解くまでの時間と等しいです。 QQ まで NN の流量がありかつ総コストが TT 以下であれば、達成可能です。

計算量

さて、計算量を見積もります。Min Cost Flowの計算量は

FF を流量、mm を追加した辺の本数として

O(F(n+m)log(n+m))O(F (n + m) \log (n + m))

ACLのMinCostFlowのページ より

とあります。

ここで、F=N=2X, n=3X+2, m=XN+3X=2X2+3XF=N=2X,\space n=3X+2,\space m=XN+3X=2X^2+3X であるので、

O(n+m)=O(X2)O(n+m)=O(X^2) より O(X×X2×logX)=O(X3logX)O(X\times X^2\times\log{X})=O(X^3\log X)

X50X\leq50 より、このアルゴリズムは十分高速に動作します。

よってこの問題を O(X3logX)O(X^3\log X) で解くことができました。

おまけ

聞いたところによるとハンガリアン法で解けるらしいですね。
調べてみるとまんまでした…
計算量は O(N3)O(N^3) だそうです。
すごいね。