bzoj 1045
确定初始状态(n与1直接谁给了谁几个),后面的就确定了,再根据总结出来的东西决定前面谁给谁几个最优。
n=1000000!!!
1 /************************************************************** 2 Problem: 1045 3 User: idy002 4 Language: C++ 5 Result: Accepted 6 Time:1852 ms 7 Memory:12524 kb 8 ****************************************************************/ 9 10 #include <cstdio> 11 #include <algorithm> 12 #define maxn 1000010 13 using namespace std; 14 15 int n; 16 int a[maxn]; 17 long long s[maxn], sum, mv; 18 19 int main() { 20 scanf( "%d", &n ); 21 for( int i=1; i<=n; i++ ) { 22 scanf( "%d", a+i ); 23 sum += a[i]; 24 } 25 sum /= n; 26 for( int i=1; i<=n; i++ ) 27 a[i] -= sum; 28 for( int i=1; i<=n; i++ ) 29 s[i] = s[i-1]+a[i]; 30 int mid = (1+n)>>1; 31 nth_element( s+1, s+mid, s+1+n ); 32 mv = s[mid]; 33 long long ans = 0, ta; 34 for( int i=1; i<=n; i++ ) { 35 ta = s[i]-mv; 36 if( ta<0 ) ta=-ta; 37 ans += ta; 38 } 39 printf( "%lld\n", ans ); 40 }