首页 > 代码库 > BZOJ 1045 题解
BZOJ 1045 题解
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
(完)
BZOJ 1045 题解
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。