Official

F - Best Concatenation Editorial by leaf1415


\(i = 1, 2, \ldots, N\) について、\(S_i\) に含まれる X の個数を \(X_i\)\(S_i\) に含まれる数字をそれぞれ \(1\) 桁の整数とみなしたときのそれらの和を \(Y_i\) とします。

\((1, 2, \ldots, N)\) の順列 \(P = (P_1, P_2, \ldots, P_N)\) と整数 \(1 \leq i \leq N-1\) を任意に選びます。 そして、\(P\)\(i\) 番目と \(i+1\) 番目の要素を交換して得られる順列 \(P' = (P_1, P_2, \ldots, P_{i-1}, P_{i+1}, P_i, P_{i+2}, \ldots, P_N)\) を考えます。 \(P\) に対応する \(T\) のスコア \(f(P)\) と、\(P'\) に対応する \(T\) のスコア \(f(P')\) の大小を比較してみましょう。

\(P\) から \(P'\) への変更によって 「 \(S_{P_i}\) に含まれる X\(S_{P_{i+1}}\) に含まれる数字のペア」が \(T\) から失われ、 代わりに「 \(S_{P_{i+1}}\) に含まれる X\(S_{P_i}\) に含まれる数字のペア」が \(T\) に追加されます。 よって、\(f(P') - f(P) = X_{P_{i+1}}Y_{P_i} - X_{P_i}Y_{P_{i+1}}\) です。 したがって、

\[f(P') \gt f(P)\]

\[\Leftrightarrow X_{P_{i+1}}Y_{P_i} \gt X_{P_i}Y_{P_{i+1}} \tag{1}\]

\[\Leftrightarrow \frac{Y_{P_i}}{X_{P_i}} \gt \frac{Y_{P_{i+1}}}{X_{P_{i+1}}} \tag{2}\]

が成り立ちます。 つまり、式 (2) が成り立つときかつそのときに限り、\(P\)\(i\) 番目と \(i+1\) 番目の要素を入れ替えることで \(T\) のスコアがより大きくなります。

したがって、\(T\) のスコアを最大化するには、\((1, 2, \ldots, N)\)\(Y_i / X_i\) の昇順に並べかえた列を \(P\) にすれば良いです。 (ただし、\(X_i= 0\) のときは、便宜上、\(Y_i/X_i\) の値はどの実数よりも大きい \(\infty\) という値だと考えます。)

以上より、本問題を解くには、\(S_1, S_2, \ldots, S_N\)\(Y_i/X_i\) の昇順に連結して \(T\) を作り、その \(T\) に対してスコアを出力すれば良いです。 実装上は、\(Y_i/X_i\) でソートする際の大小比較には式 (2) ではなく式 (1) を用いる方が、整数の範囲で計算ができ、また分母が \(0\) の場合を例外的に扱う必要がないので、より簡潔になるでしょう。

posted:
last update: