これは、あるプログラミング コンテストからの質問です (どのプログラミング コンテストに属しているか正確にはわかりません。1 年前に見ました)。質問は次のとおりです。
N 個の建物があり、それぞれに独自の高さがあります (一意であるとは限りません)。
{h1,h2,h3,...,hn}
同じ高さのすべての建物に h を言わせる必要があります。
許可される操作は次のとおりです。
- 建物に高さを加えることができます。
- 建物の高さをいくらか取り除くことができます。
ユニットの高さを削除/追加するには、各建物に関連するコストがかかります。c(i) を建物の単位高さを削除/追加するコストとします。それぞれの費用は次のとおりです。
{c1,c2,c3,...,cn}
十分な高さ (ユニット) が利用可能であると仮定すると、すべての建物を同じ高さにするために必要な最小コストを見つける必要があります。
入力: 最初の行は、建物の数 N を指定します。(1<=N<=100000)。入力の 2 行目は建物の高さです。
{h1,h2,h3,...,hn}
入力の 3 行目は、コスト配列を示します
{c1,c2,c3.....,cn}
出力
出力は単に必要な最小コストになります。
サンプル入力:
3
2 1 3
10 1000 1
サンプル出力
12
説明: すべての建物の高さを 1 にすると、コストは 10*(2-1) + 1000*(1-1) + 1*(3-1)、つまり 12 になります。
O(n ^ 2)であるブルートフォースフォースメソッドを知っています。
私が考えた力ずくの方法は次のとおりです。
共通の高さ h が何であれ、それは
{h1,h2,h3,....,hn}
つまり、 h は h(i) のいずれかに等しくなければなりません。各 h(i) をチェックすると、O(n^2) で答えを計算できます。
より速くすることは可能ですか?