1045: [HAOI2008] 糖果传递
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3502 Solved: 1623
[Submit][Status][Discuss]
Description
有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。
Input
第一行一个正整数n<=987654321,表示小朋友的个数.接下来n行,每行一个整数ai,表示第i个小朋友得到的
糖果的颗数.
Output
求使所有人获得均等糖果的最小代价。
Sample Input
4
1
2
5
4
1
2
5
4
Sample Output
4
Solution
刘汝佳蓝书上有具体推导过程,这里代码:
1 /************************************************************** 2 Problem: 1045 3 User: shadowland 4 Language: C++ 5 Result: Accepted 6 Time:2056 ms 7 Memory:16932 kb 8 ****************************************************************/ 9 10 #include "bits/stdc++.h" 11 12 using namespace std; 13 typedef long long QAQ ; 14 const int maxN = 1e6 + 1e3 ; 15 16 QAQ long_long_INPUT ( ) { 17 QAQ x = 0 , f = 1 ; char ch = getchar ( ) ; 18 while ( ch < '0' || ch > '9' ) { if ( ch == '-' ) f = -1 ; ch = getchar ( ) ; } 19 while ( ch >= '0' && ch <= '9' ) { x = ( x << 1 ) + ( x << 3 ) + ch - '0' ; ch = getchar ( ) ; } 20 return x * f ; 21 } 22 23 long long A[ maxN ] , C[ maxN ] , tot , M ; 24 int main ( ) { 25 int n; 26 n = long_long_INPUT ( ) ; 27 tot = 0; 28 for ( int i=1 ; i<=n ; ++i ){ 29 A[ i ] = long_long_INPUT ( ) ; 30 tot += A[ i ] ; 31 } 32 M = tot / n; 33 C[ 0 ] = 0; 34 35 for(int i=1 ; i<n ; ++i ) C[ i ] = C[ i - 1 ] + A[ i ] - M ; 36 37 sort( C, C + n ) ; 38 long long x1 = C[ n / 2 ], ans = 0 ; 39 for(int i=0 ; i<n ; ++i ) ans += abs ( x1 - C[ i ] ) ; 40 41 cout << ans ; 42 43 return 0; 44 }
2016-10-14 23:56:18
(完)