[제목] 효과
이 원에 앉아 $ $ n 번째 아이, $ I $ $ A_I 중 하나 $ 키즈 캔디, 사탕 각각의 자녀가 좌우 아이들에게 전송 될 수있는 물리적 장치를 보낼 수있는 각 패스 별 사탕 추구 최소 소비 많은 체력이 사탕의 마지막 수를 만들 수있는 방법 각 아동이 동일있다.
[분석] 아이디어
첫째, 각 어린이 마지막 계산 된 평균 사탕 $ s에서의 $를 가지고 $ x_i로부터는 $ $ I $는 $ $ 처음 $에 아이의 자식을 나타내는 아이들에게 사탕 수, $ X_1의 $ I-1을 나타낸다 제공 어린이의 $ 사탕 번호, $ 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 | + | C_1 - X_1 | + ... + | X_1-C_ {N-1} | (분) $$
완성 후의 전체 수식 만 $ $ 변수 X_1이 방정식 세트의 의미는, 수직선 점 $ $으로의 X_1를 찾는되도록 $ 0 한 c_1, ... C_ {N-1} $ 이에 포인트 이 조건을 충족하는 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 A는, b) (RG의 인터넷 용 난 =; 나는 <= B를 단계; 내가 ++) 9 #DEFINE 백 (나는 A는 b) (RG의 인터넷 용 난 =; I> = B, 난 -) 10 # 정의 DB 이중 11 #DEFINE 줄게 긴 길이 12 #DEFINE의 IL 인라인 13 #DEFINE PF printf의 14 이용한 스페이스 성병; (15) INT의 FR () { 16 INT w = 0 , Q = 1 ; 17 숯 CH = g (); 18 일 동안 (CH2 < ' 0 ' || CH> ' 9 ' ) { 19 일 경우 (CH2 == ' - ' ) Q = - 1 ; 20 CH = g (); 21 } 22 동안 (CH2> = ' 0 ' && CH <=에서 ' 9 ' ) = w (w << 1 ) + (w <<0 ' , CH = g ()를; 23 창 * w의 Q; 24 } 25 CONST의 INT의 N = 1,000,002 ; 26 INT의 N, A [N], 3 [N]; 27 LL 합, ANS; 28 INT 의 main () { 29 , N =의 FR (); 30 이동 (I, 1 , n)은 [I]의 FR = (), 합계 + = A [I]; 31 INT S = 합 / N; 32 이동 (I, 2 , N) C [I] = (C)의 [I- 1 ] + A [I] - (S); 33 정렬 (c + 1 , C + 1 +엔); 34 INT 중반의 C = [N / 2 + 1 ]; 35 이동 (I, 1 , N) ANS + = 절대치 (C [I] - MID); 36 PF ( " % LLD \ 없음 " , ANS); 37 반환 0 ; 38 }