我一定要吐槽,看到糖果传递那道题神奇的数据范围,我内心都奔溃了,后来因为这个可耻地去看了一下别人的题解,最后,别人开了100万A掉了,说好的n <= 987654321呢!看来数据范围不能全信啊! 这道题不难,马上就想起了那个没有环的贪心,再沿着那个的思路去思考,马上就找到了前缀和,差不多了,减法那一步也已经想到了,只是把减数搞错了,WA了,后来仔细一想,其实不管是减数还是被减数都是前缀和,这道题就这样了。其实可以不用列方程去建模,如果那个没有环的贪心很熟悉的话!加油,知识的积累。
然而令我无语的是,标题的那两道题几乎一模一样,连样例都一样!我就呵呵啊
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #define rep(i,j,k) for(int i = j; i <= k; i++) 5 #define ll long long 6 using namespace std; 7 8 int a[1000001], pre[1000001]; 9 10 int abs(int a) 11 { 12 if( a < 0 )return -a; 13 else return a; 14 } 15 int read() 16 { 17 int s = 0, t = 1; char c = getchar(); 18 while( !isdigit(c) ){ 19 if( c == '-' ) t = -1; c = getchar(); 20 } 21 while( isdigit(c) ){ 22 s = s * 10 + c - '0'; c = getchar(); 23 } 24 return s * t; 25 } 26 27 int main() 28 { 29 int n = read(); ll sum = 0; 30 rep(i,1,n){ 31 a[i] = read(); sum += a[i]; 32 } 33 sum /= n; 34 rep(i,1,n){ 35 a[i] -= sum, pre[i] = pre[i-1] + a[i]; 36 } 37 sort(pre+1,pre+n+1); ll mid = pre[(1+n)>>1]; 38 ll ans = 0; 39 rep(i,1,n){ 40 ans += abs(pre[i]-mid); 41 } 42 cout<<ans<<endl; 43 return 0; 44 }