[タイトル]効果
そこサークルに座っ$ $ n番目の子、$ I $ $ a_iをの1 $キッズキャンディ、キャンディそれぞれの子は、左と右の子供たちに送信することができ、物理的なユニットを過ごすには、各パスごとのお菓子、求めている最小の消費どのくらいの体力は、それぞれの子が等しい持っているお菓子の最終的な数を作ることができます。
[解析]アイデア
まず、それぞれの子は、最後に計算された平均キャンディ$ sに$を持つ$ X_Iは$ $ Iを提供$子どもたちにお菓子の数を表し、$ I-1 $ $の$ X_1は、最初の$に子の子を表し、子供のN $キャンディ番号、$ X_Iは、<0 $が$ I-1 $子供のI $ $子どもたちにお菓子を表す場合。だから我々は、次のような結論を引き出すことができます。
$$ A_1-X_1 + X_2 = S \ RIGHTARROW X_2 = S-A_1 + X_1 = X_1-C_1(C_1 = A_1-S)$$
$$ A_1-X_2 + X_3 = S \ RIGHTARROW X_3 = 2S-A_1、A_2 + X_1 = X_1-C_2(C_2 = 2S-A_1、A_2)$$
$$ $$ ......
$$ A_N、x_nに関する+ X_1 = S \ RIGHTARROW X_1 = X_1-C_ {N-1}(C_ {N-1} =(N-1)* S-a_1- ... -a_ {N-1})$$
X_1 | | + ... + | X_N | $ので、私たちはその$を確認する必要があり| $ ANS =そのため$の最小和| X_Iを
$$ | X_1 | + | X_1-C_1 | + ... + | X_1-C_ {N-1} |(分)$$
全体式X_1のみ$ $変数を終えた後に、この式のセットの重要性は、数直線上の点$する$ X_1を見つけることである、C_1、···、C_ {N-1} $この、$ 0に指すようにN- $ $最小の点の距離の和、及びこの条件を満たすためには、これらの値の中央値の点です。
[]コードの実装
1の#include <cstdioを> 2の#include <iostreamの> 3の#include <CStringの> 4の#include <アルゴリズム> 5の#include <cmath> 6 の#define G()GETCHAR() 7 の#define RGレジスタ 8 の#defineゴー(I 、、B)(RG iは= int型のために、私は<= Bと、I ++)は 9 の#defineをバック(iは、、B)(RG iは= int型のために、I> = B; i--) 10 #定義 DBダブル 11 の#defineっ長い長い 12 の#define ILインライン 13 の#define PFのprintf 14 使って 名前空間STDを、 15 int型のFR(){ 16 、INT、W = 0、Q = 1 。 17 CHAR CH = G(); 18 一方(CH < ' 0 ' || CH> ' 9 ' ){ 19 であれば(CH == ' - ')、Q = - 1 。 20 CH = G(); 21 } 22 ながら、(CH> = ' 0 ' && CH <= ' 9 ')(<< W = W 1 +)(<< W0 '、CH = G(); 23 リターン * wのQ; 24 } 25 のconst int型 N = 1000002 。 26 int型N、[N]、C [N]。 27 LL和、ANS; 28 INT メイン(){ 29 N =のFR()。 30 ゴー(I、1、N)[I] = frの()、和+ = [I]。 31 INT S =和/ N。 32 ゴー(I、2、n)をC [I] = Cの[I- 1 ] + [I] - Sであり; 33 ソート(C + 1、C + 1 +N); 34 INTミッド=のC [N / 2 + 1 ]。 35 ゴー(I、1、N)ANS + = ABS(C [I] - MID)。 36 PF(" %LLDする\ n " 、ANS)。 37 リターン 0 。 38 }